bool GraphList::CalPageRank() {
this->pageRank = new float[this->numVertex + 1];
float *prTmp = new float[this->numVertex + 1];
if(!this->pageRank || !prTmp) {
cerr << "GraphList::CalPageRank: memory alocate error!" << endl;
return false;
}
for(int i = 0; i < this->numVertex; i ++) {
this->pageRank[i] = 1.0f;
}
map<int,int> id2index;
for(int i = 0; i < this->numVertex; i ++) {
id2index[this->graList[i].vertexId] = i;
}
for(int iTimes = 0; iTimes < PAGERANKTIMES; iTimes ++) { //迭代30次(可改)
for(int i = 0; i < this->numVertex; i ++) {
prTmp[i] = 0.0f;
}
for(int i = 0; i < this->numVertex; i ++) {
int eCount = 0;
for(Edge e = FirstEdge(graList[i].vertexId); e.to >= 0; e = NextEdge(e)) {
if(e.from != e.to) { //不考虑自己到自己的边
eCount ++;
}
}
if(!eCount) {
continue;
}
for(Edge e = FirstEdge(graList[i].vertexId); e.to >= 0; e = NextEdge(e)) {
if(e.from != e.to) {
prTmp[id2index[e.to]] += pageRank[i] / (float)eCount;
}
}
}
for(int i = 0; i < this->numVertex; i ++) {
this->pageRank[i] = (1 - PRDAMPINGFACTOR) + PRDAMPINGFACTOR * prTmp[i];
}
cout << "第" << iTimes << "次:" << endl;
for(int i = 0; i < this->numVertex; i ++){
cout << i << ": " << pageRank[i] << endl;
}
}
delete []prTmp;
prTmp = NULL;
return true;
}
帖一个PageRank算法的程序
最新推荐文章于 2024-09-03 15:59:48 发布