• 中国大学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成果:

  • 相关阅读:
    函数介绍
    Php数组
    数据类型的转换
    Php 输出语句
    php运算符
    php变量
    Php 魔术常量
    HDU 2487 Ugly Windows(暴力)(2008 Asia Regional Beijing)
    codeforces 319B Psychos in a Line(模拟)
    codeforces 301D Yaroslav and Divisors(树状数组)
  • 原文地址:https://www.cnblogs.com/clevercong/p/4255877.html
Copyright © 2020-2023  润新知