中国大学MOOC-数据结构基础习题集、09-3、Hashing - Hard Version
声明:非本人原创,原文地址:http://blog.sina.com.cn/s/blog_ce1b01420102vizs.html
这篇博文的思路是非常正确的,但是程序无法编译。比如vector *G,在codeblocks无法编译成功。因此博主做了一些改动,以便能正常编译运行。具体的思路和代码都是原博主提供的,版权为原博主所有。本人仅在此直接粘出一份能运行的代码。
1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 5 using namespace std; 6 7 struct node 8 { 9 int x; 10 int y; 11 node(int a, int b):x(a),y(b) {} 12 }; 13 14 int main() 15 { 16 int N; 17 cin >> N; 18 int *Hash = new int[N]; 19 int *Degree = new int[N]; 20 vector<vector<int> > G(N); 21 vector<int> Ans; 22 // 输入哈希序列 23 for(int i=0; i<N; i++) 24 { 25 cin >> Hash[i]; 26 if(Hash[i] >= 0) 27 Degree[i] = 0; //如果大于等于0,初始化为0 28 else 29 Degree[i] = -1;//如果小于0,入度记为-1,表示没有元素 30 } 31 // 计算入度并建立有向图 32 for(int i=0; i<N; i++) 33 { 34 if(Hash[i] < 0) continue; 35 int CurPos = i; //当前坐标 36 int HashPos = Hash[i] % N; //散列后的坐标 37 Degree[i] = (CurPos - HashPos + N) % N; //计算入度,即冲突次数 38 for(int s = 0; s < Degree[i]; s++) //把Key%N 到 i - 1 的顶点指向 i 39 { 40 G[(HashPos + s + N) % N].push_back(i); 41 } 42 } 43 // 拓扑排序 44 typedef pair<int, int> PAIR; 45 priority_queue< PAIR, vector< PAIR >, greater< PAIR > > Q; //优先队列 46 for(int i = 0; i < N; i++) 47 if(Degree[i] == 0) //入度为0的入队 48 { 49 Q.push(PAIR(Hash[i],i)); 50 } 51 while(!Q.empty()) 52 { 53 PAIR p = Q.top(); //每次取出当前入度为0的顶点中Key最小的 54 int V = p.second; //second为顶点 55 Ans.push_back(p.first); //first为该顶点的Key 56 Q.pop(); 57 for(int i = 0; i < G[V].size(); i++) //扫描关联顶点,入度处理 58 if (--Degree[G[V][i]] == 0) 59 Q.push(PAIR(Hash[G[V][i]], G[V][i])); 60 } 61 cout << Ans[0]; 62 for(int i = 1; i < Ans.size(); i++) 63 cout << ' ' << Ans[i]; 64 return 0; 65 }