7-43 字符串关键字的散列映射 (25 分)(思路+详解+不懂的兄弟们来呀)兄弟们我干了5个小时,一个一个测试点过的
一:題目
7-43 字符串關鍵字的散列映射 (25 分)
給定一系列由大寫英文字母組成的字符串關鍵字和素數P,用移位法定義的散列函數H(Key)將關鍵字Key中的最后3個字符映射為整數,每個字符占5位;再用除留余數法將整數映射到長度為P的散列表中。例如將字符串AZDEG插入長度為1009的散列表中,我們首先將26個大寫英文字母順序映射到整數0~25;再通過移位將其映射為3×32
2
+4×32+6=3206;然后根據表長得到3206,即是該字符串的散列映射位置。
發生沖突時請用平方探測法解決。
輸入格式:
輸入第一行首先給出兩個正整數N(≤500)和P(≥2N的最小素數),分別為待插入的關鍵字總數、以及散列表的長度。第二行給出N個字符串關鍵字,每個長度不超過8位,其間以空格分隔。
輸出格式:
在一行內輸出每個字符串關鍵字在散列表中的位置。數字間以空格分隔,但行末尾不得有多余空格。
輸入樣例1:
4 11 HELLO ANNK ZOE LOLI輸出樣例1:
3 10 4 0輸入樣例2:
6 11 LLO ANNA NNK ZOJ INNK AAA輸出樣例2:
3 0 10 9 6 1二:思路
這道題解決沖突的發法,是平方探測法,下方 有圖片介紹 ;
測試點2:還有的是這個處理重復元素時,不能直接在while循環的判斷條件內直接判斷;因為是取后3個字母,后三個字母會出現重復 的,但他們的總體字符串可能不一樣,所以要單獨處理。
測試點3:需要考慮那個余數為負數的情況
測試點4:在while循環內需要按這種形式寫,我還寫了一個其他的碼,測試了好多數據都正確,就是最后一個測試點,過不去,我換了一種寫法,然后就過去了。
還有就是我在賦初值的時候用的是30000,沒有用0,因為比如A,AA,AAA,像這樣的數如果賦初值為0 的話那么他們的輸出結果都為0
但是實際上應為 0 1 2;
三:介紹平方探測法(也叫二次探測法)
四:上碼
#include<bits/stdc++.h> using namespace std;int strLength( string str ){int sum = 0;if( str.length() >= 3 ){int temp = str.length() - 3; string cut_str = str.substr(temp); //截取字符串 int count = 2;for( int j = 0; j < cut_str.length(); j++ ){int num = (cut_str[j] - 65)*pow(32,count);sum += num;count--;} }else if( str.length() == 2 ){sum = (str[0] - 65) * 32 + (str[1] - 65); }else if( str.length() == 1 ){sum = str[0] - 65;}else if( str.length() == 0 ){sum = 0;}return sum;}int main(){int N,P;int array[1050];vector<string>v(1050);vector<string>v1(1050);int m = -1;cin >> N >> P;for( int i = 0; i < P; i++){ //想要賦值除0以外的數得單個 拿出來寫 array[i] = 30000;}for( int i = 0; i < N; i++ ){string str;int remainder;cin >> str;for( int j = 0; j < v.size() && i > 0; j++ ){//測試點2有重復的if(v[j] == str){m = j;}}v.push_back(str);if( m != -1 ){for( int k = 0; k < P; k++ ){if( v[m] == v1[k]){remainder = k; }}m = -1; }else{int sum = strLength(str);remainder = sum % P;int d = 1; int cnt = 1;//用于統計技術還是偶數個 while( array[remainder] != 30000 && d <= P / 2){remainder = sum % P; if( cnt == 1 ){remainder = sum % P + d * d;cnt = 0;}else if( cnt == 0 ){remainder = sum % P - d * d;while( remainder < 0 )remainder += P;remainder = remainder % P;d++;cnt = 1;}}array[remainder] = sum;v1[remainder] = str;}if( i != N - 1 )cout << remainder << ' ';elsecout << remainder;}}//7 11 //LLO ANNA NNK ZOJ INNK AAA LLO//測試sum+d為負數的情況 //5 12 //A B C F Z五:總結
加油兄弟們,本來每天晚上上傳一道題的題解,但昨天肝到凌晨也沒做出來,第二天醒來,繼續肝。這回我是一個一個測試點過的,前兩個,是例子好過,后面三個我是一點一點改過的,花了好長時間。加油吧兄弟們!我們一起變強
總結
以上是生活随笔為你收集整理的7-43 字符串关键字的散列映射 (25 分)(思路+详解+不懂的兄弟们来呀)兄弟们我干了5个小时,一个一个测试点过的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称中国特供版英伟达 H20 AI 芯
- 下一篇: 7-44 基于词频的文件相似度 (30