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 }
  • 相关阅读:
    1.3 Starting a New Job 1.3.3 Background Reading(I)
    1.3 Starting a New Job 1.3.1 Preparation
    1.2 Interview 1.2.4 Sample Test(IV)
    1.2 Interview 1.2.4 Sample Test(III)
    Jquery获取元素集合并遍历
    Oracle21c RAC+DG生产项目实战(RHEL8+Oracle集群+容灾+CDB/PDB)
    Django
    Linux 实用命令
    Python人工智能:原理、实践及应用-资料分享
    关于HDFS的NameNode和SecondaryNameNode的一些疑问解答
  • 原文地址:https://www.cnblogs.com/clevercong/p/4268867.html
Copyright © 2011-2022 走看看