7-15 字串關鍵字的雜湊對映 (25 分)
給定一系列由大寫英文本母組成的字串關鍵字和素數p,用移位法定義的雜湊函式h(key)將關鍵字key中的最後3個字元對映為整數,每個字元佔5位;再用除留餘數法將整數對映到長度為p的雜湊表中。例如將字串azdeg
插入長度為1009的雜湊表中,我們首先將26個大寫英文本母順序對映到整數0~25;再通過移位將其對映為3×322+4×32+6=3206;然後根據表長得到,即是該字串的雜湊對映位置。
發生衝突時請用平方探測法解決。
輸入第一行首先給出兩個正整數n(≤500)和p(≥2n的最小素數),分別為待插入的關鍵字總數、以及雜湊表的長度。第二行給出n個字串關鍵字,每個長度不超過8位,其間以空格分隔。
在一行內輸出每個字串關鍵字在雜湊表中的位置。數字間以空格分隔,但行末尾不得有多餘空格。
4 11
hello annk zoe loli
3 10 4 0
6 11
llo anna nnk zoj innk aaa
3 0 10 9 6 1
這道題其實沒啥問題...就是沒有背景知識...
它這個32的次方是固定的,然後是平方探測法,是說如果這個雜湊值重複了,那就找它附近的雜湊值,這個附近的順序是:
1.查詢本位置,假設本位置為pos
如果本位置有乙個字串佔了
for迴圈k從1到無窮(反正++k就行了,肯定找得到)
那麼hash值就先查詢pos+k*k;
如果又被佔了,再查詢pos - k*k;
第乙個找到沒被佔的就是它的位置.
#include#includeusing namespace std;
mapditu;
string str;
const int maxn = 20003;
int n,p;
bool vis[maxn];
int solve(int num)
vis[num] = 1;
ditu[str] = num;
return num;
}else if(ditu[str] == 0 && !vis[num])
return num;
}int main()
else
int tt = solve(sum%p);
if(j == 0)
cout
cout<}
字串關鍵字的雜湊對映
7 14 字串關鍵字的雜湊對映 25 分 給定一系列由大寫英文本母組成的字串關鍵字和素數p,用移位法定義的雜湊函式h key 將關鍵字key中的最後3個字元對映為整數,每個字元佔5位 再用除留餘數法將整數對映到長度為p的雜湊表中。例如將字串azdeg插入長度為1009的雜湊表中,我們首先將26個大寫...
7 43 字串關鍵字的雜湊對映 25 分
給定一系列由大寫英文本母組成的字串關鍵字和素數p,用移位法定義的雜湊函式h key 將關鍵字key中的最後3個字元對映為整數,每個字元佔5位 再用除留餘數法將整數對映到長度為p的雜湊表中。例如將字串azdeg插入長度為1009的雜湊表中,我們首先將26個大寫英文本母順序對映到整數0 25 再通過移位...
字串關鍵字的雜湊對映 (25 分)
給定一系列由大寫英文本母組成的字串關鍵字和素數p,用移位法定義的雜湊函式h key 將關鍵字key中的最後3個字元對映為整數,每個字元佔5位 再用除留餘數法將整數對映到長度為p的雜湊表中。例如將字串azdeg插入長度為1009的雜湊表中,我們首先將26個大寫英文本母順序對映到整數0 25 再通過移位...