zoukankan      html  css  js  c++  java
  • 中国大学MOOC-数据结构基础习题集、09-3、Hashing

    声明:非本人原创,原文地址: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 }
  • 相关阅读:
    Struts2 参数传递总结
    简单的 MySQL 用户管理
    一道好题
    javascript 常用代码大全(2) 简单飞扬
    读取word和pdf文件的几种方法 简单飞扬
    模拟身份证号码JS源代码 简单飞扬
    兵法感悟 简单飞扬
    跨应用Session共享 简单飞扬
    放假前必须做的事情 简单飞扬
    javascript 常用代码大全(4) 简单飞扬
  • 原文地址:https://www.cnblogs.com/clevercong/p/4268867.html
Copyright © 2011-2022 走看看