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; }