zoukankan      html  css  js  c++  java
  • 进阶实验8-2.1 逆散列问题 (30分)

    给定长度为 N 的散列表,处理整数最常用的散列映射是 (。如果我们决定用线性探测解决冲突问题,则给定一个顺序输入的整数序列后,我们可以很容易得到这些整数在散列表中的分布。例如我们将 1、2、3 顺序插入长度为 3 的散列表HT[]后,将得到HT[0]=3HT[1]=1HT[2]=2的结果。

    但是现在要求解决的是“逆散列问题”,即给定整数在散列表中的分布,问这些整数是按什么顺序插入的?

    输入格式:

    输入的第一行是正整数 N(≤1000),为散列表的长度。第二行给出了 N 个整数,其间用空格分隔,每个整数在序列中的位置(第一个数位置为0)即是其在散列表中的位置,其中负数表示表中该位置没有元素。题目保证表中的非负整数是各不相同的。

    输出格式:

    按照插入的顺序输出这些整数,其间用空格分隔,行首尾不能有多余的空格。注意:对应同一种分布结果,插入顺序有可能不唯一。例如按照顺序 3、2、1 插入长度为 3 的散列表,我们会得到跟 1、2、3 顺序插入一样的结果。在此规定:当前的插入有多种选择时,必须选择最小的数字,这样就保证了最终输出结果的唯一性。

    输入样例:

    11
    33 1 13 12 34 38 27 22 32 -1 21
    
     

    输出样例:

    1 13 12 21 33 34 38 27 22 32


    题目要求是给出了hashing的结果,而且是用的linear probing线性探测解决冲突,要求给出初始序列。负数直接跳过,序列中的数都是非负数。所以遍历给出序列,如果说当前位置的s[i] % n等于i那么就是说不存在冲突,如果不相等就是存在冲突的,经过线性探测才存在当前位置,所以从s[i] % n位置到i之前的数都是比是s[i]先进行操作的,如此我们可以找到序列中数的顺序,进行拓扑排序,如果存在多种可能要求输出最小的,所以用优先队列。

    代码:
    #include <cstdio>
    #include <vector>
    #include <queue>
    #include <algorithm>
    using namespace std;
    
    int n,s[1000],l[1000],flag;
    vector<int> v[1000];
    struct cmp {
        bool operator ()(const int &a,const int &b) {
            return s[a] > s[b];
        }
    };
    int main() {
        scanf("%d",&n);
        for(int i = 0;i < n;i ++) {
            scanf("%d",&s[i]);
        }
        priority_queue<int,vector<int>,cmp> q;
        for(int i = 0;i < n;i ++) {
            if(s[i] < 0) continue;
            if(s[i] % n != i) {
                int d = s[i] % n > i ? i + n : i;
                for(int j = s[i] % n;j < d;j ++) {
                    if(s[j % n] < 0) continue;
                    v[j % n].push_back(i);
                    l[i] ++;
                }
            }
            else q.push(i);
        }
        while(!q.empty()) {
            int temp = q.top();
            q.pop();
            if(flag) putchar(' ');
            else flag = 1;
            printf("%d",s[temp]);
            for(int i = 0;i < v[temp].size();i ++) {
                int d = v[temp][i];
                l[d] --;
                if(!l[d]) q.push(d);
            }
        }
        return 0;
    }
  • 相关阅读:
    The formatter threw an exception while trying to deserialize the message in WCF
    通过Web Deploy方式部署WCF
    The Managed Metadata Service or Connection is currently not available
    How to create Managed Metadata Column
    冒泡算法
    asp.net core 实战项目(一)——ef core的使用
    Vue学习笔记入门篇——安装及常用指令介绍
    Vue学习笔记入门篇——数据及DOM
    Vue学习笔记目录
    Chart.js在Laravel项目中的应用
  • 原文地址:https://www.cnblogs.com/8023spz/p/12303472.html
Copyright © 2011-2022 走看看