HDU 5097 Page Rank (模拟)
2015-07-18 11:23
232 查看
题目背景是以前用来对网页进行排名的Page Rank算法,是早期Google的革命性发明。
背后的原理是矩阵和图论。这个数学模型是由Google的创始人拉里·佩奇和谢尔盖·布林发现的。
如果一个网页被很多网页链接那么它的排名就高,当然不同的网页应该用不同的权值加以区分,
一个网页的排名来自指向它的网页权值之和,这就带来一个问题,计算排名过程需要用到网页本身排名。
这个问题可以变成一个二维矩阵相差,一开始认为所有的网页的排名都是相同,然后迭代算出排名。
从理论上可以证明无论初始值如何选取,这种算法最后都会收敛于真实值。
还有一个实际问题,互联网网页是非常大的,这个矩阵需要稀疏化处理。
此题是简化版,给一个矩阵,Eij = 1表示i到j有个超链接,假设点击都是随机的,求S矩阵,S的j行和i列表示从i到j的概率。
迭代计算直到收敛为止。
背后的原理是矩阵和图论。这个数学模型是由Google的创始人拉里·佩奇和谢尔盖·布林发现的。
如果一个网页被很多网页链接那么它的排名就高,当然不同的网页应该用不同的权值加以区分,
一个网页的排名来自指向它的网页权值之和,这就带来一个问题,计算排名过程需要用到网页本身排名。
这个问题可以变成一个二维矩阵相差,一开始认为所有的网页的排名都是相同,然后迭代算出排名。
从理论上可以证明无论初始值如何选取,这种算法最后都会收敛于真实值。
还有一个实际问题,互联网网页是非常大的,这个矩阵需要稀疏化处理。
此题是简化版,给一个矩阵,Eij = 1表示i到j有个超链接,假设点击都是随机的,求S矩阵,S的j行和i列表示从i到j的概率。
迭代计算直到收敛为止。
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> const double eps = 1e-10; const int N = 3000+10; double G ; const double alpha = 0.85; char buf ; bool ok(double *q1,double *q2,int n) { double s = 0; for(int i = 0; i < n; i++) s += fabs(q1[i]-q2[i]); return s < eps; } double q0 ; double q1 ; double q2 ; int main() { // freopen("in.txt","r",stdin); int n; for(int i = 0; i < N; i++) q0[i] = 1; while(~scanf("%d",&n)){ double beta = (1-alpha)/n; for(int i = 0; i < n; i++){ scanf("%s",buf[i]); } for(int i = 0; i < n; i++){ int cnt = 0; for(int j = 0; j < n; j++) if(buf[i][j] == '1') cnt++; for(int j = 0; j < n; j++) if(buf[i][j] == '1'){ G[j][i] = (cnt?alpha/cnt:0)+beta; } else G[j][i] = beta; } memcpy(q1,q0,sizeof(double)*n); double *qCur = q1, *qNxt = q2; do{ for(int i = 0; i < n; i++){ qNxt[i] = 0; for(int j = 0; j < n; j++){ qNxt[i] += G[i][j]*qCur[j]; } } std::swap(qCur,qNxt); }while(!ok(qCur,qNxt,n)); for(int i = 0,sz = n-1; i < sz; i++) printf("%.2lf ",qCur[i]); printf("%.2lf\n",qCur[n-1]); } return 0; }
相关文章推荐
- [转] 解决windows下eclipse中android项目关联android library project失败问题
- 【北大青鸟】--HTML 表单中get和post请求的区别
- 虚拟机ping通外网原理
- 课程设计 银行储蓄系统
- android 设计模式之单例模式
- ZOJ 3229 Shoot the Bullet 有源有汇带下界的最大流
- 搜索(一)
- POJ 2187(求凸包内两点之间最长距离)
- 动态规划:从新手到专家
- iOS培训学习内容 1
- Block
- CUG 数学进阶
- AsyncTask的使用方法和理解
- 在Django的URLconf中使用命名组的方法
- Skype for Business Server 2015-13-IISARR-2-发布-4-ADCS
- XML基本知识
- java中数组的初始化和基本排序算法
- 在Go语言里检测内存泄漏
- 快速排序--双边扫描与单边扫描的实现
- String,StringBuffer与StringBuilder的区别??