您的位置:首页 > 其它

HDU 5097 Page Rank (模拟)

2015-07-18 11:23 232 查看
题目背景是以前用来对网页进行排名的Page Rank算法,是早期Google的革命性发明。

背后的原理是矩阵和图论。这个数学模型是由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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: