中国大学MOOC-数据结构基础习题集、09-1、Hashing

题目链接:http://www.patest.cn/contests/mooc-ds/09-1

题目分析:这是一道考察哈希散列表的一道题。题目总体来说是比较简单的,但是可能有的同学英文不好,看不懂题意,这里简单解释一下。

  输入的第一行是MSize(你要找到离这个数<可能是素数,可能是合数>最近的素数)和N(接下来整数的个数)。第二行是N个整数。你需要用哈希函数计算位置,如果那个位置被占用,那么按照+1, +4, +9,..., +i^2的顺序看之后是否有位置。如果到最后仍然没有位置,那么就输出-,有位置直接输出对应位置的下标(从0开始)就可以了。

特别说明:

  1. 首先这里用的是平方探查法,而且只有正的,没有负的<with positive increments only>。即散列函数应该为。h(key) = (key % MSIZE + j * j) % MSIZE。博主最开始并没有注意到这一点,是参考这篇博文:http://blog.sina.com.cn/s/blog_ce1b01420102vivb.html,这里对原博主进行感谢。

  2. 其次就是输出格式的控制,按照惯例,最后一个空格是不能出现的。相信大家都已经比较熟练了,不再赘述。

代码分析:

 1 #include <iostream>
 2 #include <cmath>
 3 
 4 using namespace std;
 5 
 6 bool Prime(int m)// 判断一个数字是否是素数
 7 {
 8     if(m < 2) return true;
 9     for(int i = 2 ; i <= m/2; i++)
10         if (m % i == 0)
11             return true;
12     return false;
13 }
14 
15 int main()
16 {
17     int MSIZE, N;
18     cin >> MSIZE >> N;
19     while(Prime(MSIZE)) MSIZE++;
20     bool *flag = new bool [MSIZE];
21     for(int i=0; i<MSIZE; i++)
22     {
23         flag[i] = false;
24     }
25     for(int i=0; i<N; i++)
26     {
27         int t;
28         cin >> t;
29         bool Flag = false;
30         for(int j=0; j<N; j++)
31         {
32             int tt = (t % MSIZE + j*j) % MSIZE ;
33             if(flag[tt] == false)
34             {
35                 Flag = true;
36                 flag[tt] = true;
37                 if( i != N-1)
38                     cout << tt << " ";
39                 else
40                     cout << tt;
41                 break;
42             }
43         }
44         if(Flag)
45             continue;
46         else
47         {
48             if( i != N-1)
49                 cout << "- ";
50             else
51                 cout << "-" ;
52         }
53     }
54     return 0;
55 }

AC成果:

posted @ 2015-01-28 15:03  聪明的聪聪  阅读(396)  评论(0编辑  收藏  举报