PageRank算法c++实现

news2024/11/25 3:00:19

首先用邻接矩阵A表示从页面j到页面i的概率,然后根据公式生成转移概率矩阵

M=(1-d)*Q+d*A                           常量矩阵Q=(qi,j),qi,j=1/n

给定点击概率d,等级值初始向量R0,迭代终止条件e;

计算Ri+1=M*Ri;

ei=|Ri+1-Ri|,当ei<=e时输出Ri+1作为最终等级值向量。

#include "fstream"
#include "sstream"
#include <iostream>
#include <set>
#include <vector>

using namespace std;

int getNum()
{
    set<int> N;
    ifstream is("a.txt");
    int u, v;
    while (is >> u >> v)
    {
        N.insert(u);
        N.insert(v);
    }
    return N.size();
}

void getPage(vector<vector<int>>& page)     //&
{
    ifstream is("a.txt");
    int u, v;
    while(is>>u>>v)
    { 
        page[u].push_back(v);
    }
}

void PageRank(vector<vector<int>>&page,int N,double d,double e,int maxIterations)
{
    //得到M
    vector<vector<double>> M(N,vector<double>(N,0.0));
   
    for (int i = 0; i < N; i++)
    {
        if (page[i].size() > 0)
        {
            for (int j : page[i])
            {
                M[j][i]++;           //0/1
                
            }
            for (int j=0;j<N;j++)
            {
                M[j][i] /= page[i].size();
            }
        }
        else
        {
            for (int j : page[i])
            {
                M[j][i] = 0;
            }
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            //cout << M[i][j]<<" ";             //正确
            M[i][j] = d * M[i][j] + (1 - d) * (1.0 / N);
            //cout << M[i][j] << " ";
        }
    }

    vector<double> pagerank(N, 1.0);
    while (maxIterations)
    {
        vector<double> newpagerank(N, 0.0);
        double dif=0.0;
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                newpagerank[i] += M[i][j] * pagerank[j];
            }
             dif+= abs(pagerank[i]-newpagerank[i]);
        }
        //cout << dif << endl;
        pagerank = newpagerank;
        if (dif < e)
        {
            //cout << maxIterations<<endl;
            break;
        }
        maxIterations--;
    }
    cout << "等级值分别为:" << endl;
    for (int i = 0; i < N; i++)
    {
        cout << pagerank[i]<<endl;
    }
}

int main()
{
    int num = getNum();
    vector<vector<int>> page(num);
    getPage(page);
    double d = 0.85;
    double e = 0.1;
    int maxIterations = 100;
    PageRank(page, num, d, e, maxIterations);

}

数据

0 1
0 2
0 3
1 0
1 2
2 3
3 0
3 1

结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

选哪个内衣洗衣机比较好?觉飞和希亦内衣洗衣机对比测评

如今&#xff0c;随着物质生活水平的不断提升&#xff0c;消费者更加追求健康、品质化的生活。而反映在衣物清洁上&#xff0c;诸如像贴身衣物的深度清洁、儿童和成人衣物的分洗等细分场景下的洗护需求也变得越来越多&#xff0c;内衣物洗衣机也因此应运而生。现在市面上关于内…

【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题

文章目录 一、消息的堆积问题1.1 什么是消息的堆积问题1.2 消息堆积的解决思路 二、惰性队列解决消息堆积问题2.1 惰性队列和普通队列的区别2.2 惰性队列的声明方式2.3 演示惰性队列接收大量消息2.4 惰性队列的优缺点 一、消息的堆积问题 1.1 什么是消息的堆积问题 消息的堆积…

修复dinput8.dll文件的缺失,以及修复dinput8.dll文件时需要注意什么

dinput8.dll文件通常在使用大型游戏时容易出现dinput8.dll文件丢失的情况&#xff0c;今天这篇文章将要教大家修复dinput8.dll文件的缺失&#xff0c;同时在修复dinput8.dll文件时需要注意些什么&#xff1f;防止文件在修复的过程中出现其他的错误。 dinput8.dll是DirectInput库…

[自定义 Vue 组件] 小尾巴下拉菜单组件(2.0) TailDropDown

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/kcoem6dgyn8drglb [自定义 Vue 组件] 下拉菜单(1.0) DropDownMenu&#xff1a;https://www.yuque.com/u27599042/coding_star/llltv52tchmatwg4 组件效果示例 组件所依赖的常量 在 src 目录下&#xff0c;创…

商品礼品卡券提货码商城小程序开发

礼品商品提货码卡密卷商城系统开发 本系统为方便各类商品、产品福利等&#xff0c;能以电子化形式发放&#xff0c;用通过手机端直接邮寄提货而开发使用。 主要功能包含&#xff1a;1、后台批量卡密生产2、前端卡密输入兑换提货 应用界面 1、兑换页输入卡券账号和密码&#…

模拟实现简易版shell(需要单独处理 ls+cd+export)

目录 minishell -- 简易版shell 大致思路 注意点 ls cd export 代码 minishell -- 简易版shell 大致思路 首先确定,我们的shell是一直在运行的(while(1))每次都会有提示信息打印出来 [xxxxxx x]输入命令(选项),其中,我们需要将读入的字符串分开,不然只是没有意义的字符…

HNU程序设计 练习五-函数

1.小熊买糖果 【问题描述】 小熊去到商店&#xff0c;选择了一种它非常喜欢的糖果&#xff0c;其单价为 k 元&#xff0c;假定商店里有无穷多的这种糖果。 它的父亲允许它花费任意多的10元硬币和一个 r 元硬币去购买&#xff0c;但不能找零&#xff0c;请帮助小熊确定它能购买…

Docker基础(简单易懂)

目录 一、docker是什么 核心概念 二、docker安装 1、卸载docker 2、使用yum 安装 三、docker常用命令 1、帮助命令 2、镜像命令 1&#xff09;查看镜像 2&#xff09;查询镜像 3&#xff09;拉取镜像 4&#xff09;删除镜像 3、容器命令 四、容器数据卷 五、Dock…

在全球半导体行业中“疯狂冒险”的台积电

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;尽管在收入和利润率方面面临挑战&#xff0c;但台积电(TSM)仍在为自己在半导体行业的复苏做准备。 &#xff08;2&#xff09;台积电的全球扩张和先进技术战略使其能够充分利用…

Windows10+CLion+OpenCV4.5.2开发环境搭建

目录 OpenCV准备下载解压环境变量配置 clion配置新建工程选择编译工具编写CMakeLists.txt将OpenCV执行的一些动态链接库复制到项目目录下编写测试代码 OpenCV准备 下载 官网&#xff1a;OpenCV 往下滑&#xff0c;找到自己需要下载的版本。我下载的是4.5.2。 解压 选择好解…

dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)

一、docker简介 docker是一种方便跨平台迁移应用的程序&#xff0c;通过docker可以实现在同一类操作系统中&#xff0c;如Ubuntu和RedHat两个linux操作系统中&#xff0c;实现程序的跨平台部署。比如我在Ubuntu中打包了一个go项目的docker镜像&#xff08;镜像为二进制文件&am…

“如何对TXT文件的内容进行连续行删除?实现一键文件整理!

如果你有一个TXT文件&#xff0c;需要删除其中的连续行&#xff0c;这可能是为了整理文件、去除重复信息或清除不需要的文本。尽管手动删除每一行可能很耗时&#xff0c;但幸运的是&#xff0c;有一个简单而高效的方法可以帮助你实现这个目标。 首先&#xff0c;在首助编辑高手…

05-流媒体-RTMP协议介绍

05-流媒体-RTMP协议介绍 1.RTMP概述 RTMP是一种常见的流媒体协议,是基于TCP/IP协议模型的应用层协议,工作在TCP协议上,端口是1935。通过TCP三次握手保证传输的可靠。 2.握手 2.1 握手过程 RTMP基于传输层TCP连接后,通过RTMP握手协议来完成RTMP连接。客户端和服务端各发…

干货分享:基于 LSTM 的广告库存预估算法

近年来&#xff0c;随着互联网的发展&#xff0c;在线广告营销成为一种非常重要的商业模式。出于广告流量商业化售卖和日常业务投放精细化运营的目的&#xff0c;需要对广告流量进行更精准的预估&#xff0c;从而更精细的进行广告库存管理。 因此&#xff0c;携程广告纵横平台…

全新干货!一招教你迅速提升流量主收入!包你轻松月入过万

也不怕大家笑话&#xff0c;才哥以前收入每天才一块钱&#xff0c;连瓶水都买不了&#xff0c; 可是自从我开始接触老年粉私域后&#xff0c;一个搬运公众号的流量主收益两个月后就可以用“浴火重生”来形容了。 一个搬运公众号一天的流量主收益比我原创两年的个人公众号收益还…

【Linux】多路IO复用技术②——poll详解如何使用poll模型在本地主机实现简易的一对多服务器(附图解与代码实现)

在阅读本篇博客之前&#xff0c;建议大家先去看一下我之前写的这篇博客&#xff0c;否则你很可能会一头雾水 【Linux】多路IO复用技术①——select详解&如何使用select模型在本地主机实现简易的一对多服务器&#xff08;附图解与代码实现&#xff09;http://t.csdnimg.cn/…

数据库实验:SQL的数据更新

目录 实验目的实验内容实验要求实验步骤实验过程总结 再次书接上文&#xff0c;sql基础的增删改查 实验目的 (1) 掌握DBMS的数据查询功能 (2) 掌握SQL语言的数据更新功能 实验内容 (1) update 语句用于对表进行更新 (2) delete 语句用于对表进行删除 (3) insert 语句用于对表…

Postman接口测试工具,提高SpringBoot开发效率

文章目录 &#x1f33a;工具—postman⭐作用&#x1f3f3;️‍&#x1f308;安装&#x1f388;创建工作空间 &#x1f384;简单参数⭐原始方式&#x1f388;我们建立springboot项目&#xff0c;输入下面的代码&#x1f388;运行 ⭐SpringBoot方式 &#x1f384;实体参数&#x…

最新版星火官方搬运工具6.0,高级搬运,100%过原创,短视频上热门搬运软件黑科技【搬运脚本+使用技术教程】

软件介绍&#xff1a; 高级搬运&#xff0c;条条过原创 短视频暴力热门搬运黑科技 自研摄像头内录突破性技术6.0 无需任何繁琐准备工作安装即用 无需复杂售后培训看教程即可学会 直装直用自研技术更好卖 无需root 无需框架 更方便 无需xposed 无需vcam更安全 适配99%以…

【SoC基础】Arduino从零入门

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…