整型关键字的平方探测法散列 (25 分)【详细解析】
立志用最少的代碼做最高效的表達
本題的任務很簡單:將給定的無重復正整數序列插入一個散列表,輸出每個輸入的數字在表中的位置。所用的散列函數是 H(key)=key%TSize,其中 TSize 是散列表的表長。要求用平方探測法(只增不減,即H(Key)+i^2)解決沖突。
注意散列表的表長最好是個素數。如果輸入給定的表長不是素數,你必須將表長重新定義為大于給定表長的最小素數。
輸入格式:
首先第一行給出兩個正整數 MSize(≤10^4)和N(≤MSize),分別對應輸入的表長和輸入數字的個數。隨后第二行給出 N 個不重復的正整數,數字間以空格分隔。
輸出格式:
在一行中按照輸入的順序給出每個數字在散列表中的位置(下標從 0 開始)。如果某個數字無法插入,就在其位置上輸出 -。輸出間以 1 個空格分隔,行首尾不得有多余空格。
輸入樣例:
4 4
10 6 4 15
輸出樣例:
0 1 4 -
Hash平方探測法模板
注意:
何種情況下某值無法插入到序列中?
答:如果序列長度為7,則循環到7*7及以后,就會形成周期循環, 因此循環次數小于序列長度即可。
舉例:x=1,n=7時, x+0?0x+0*0x+0?0等價于x+7?7x+7*7x+7?7 ;x+1?1x+1*1x+1?1等價于x+8?8)x+8*8)x+8?8)
證明:參考取余性質,有: (x+8*8)%7=(x+(1+7)*(1+7))%7=(x+(1+7+7+49))%7=(x+1)%7+7%7+7%7+49%7=(x+1)%7
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <map> using namespace std; int is(int n) {if(n == 1)return 0;if(n == 2 || n == 3)return 1;if(n % 6 != 1 && n % 6 != 5)return 0;for(int i = 5;i * i <= n;i += 6) if(n % i == 0 || n % (i + 2) == 0)return 0;return 1; } int main() {int m,n;int s,p,v[10007] = {0};scanf("%d %d",&m,&n);while(!is(m))m ++;for(int i = 0;i < n;i ++) {p = -1;scanf("%d",&s);for(int j = 0;j < m;j ++) {if(!v[(s + j * j) % m]) {v[(s + j * j) % m] = 1;p = (s + j * j) % m;break;}}if(i)putchar(' ');if(p == -1)printf("-");else printf("%d",p);} }
弱小和無知不是生存的障礙,傲慢才是。???????——《三體》
總結
以上是生活随笔為你收集整理的整型关键字的平方探测法散列 (25 分)【详细解析】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串关键字的散列映射 (25 分)【详
- 下一篇: 电话聊天狂人 (25 分)【简便解法】