前言 :
編程實現哈希查找, 要求如下 :
已知哈希表長度為11, 哈希函數為 H(key) = key%11, 隨機產生散列的小於50的 8 個元素, 同時採用線性探測再散列的方法處理衝突, 接著輸入要查找的數據, 無論找到與否都提示訊息.
技術要點 :
哈希函數的構造方法通常有五種, 分別是數字分析法, 平分取中法, 分段疊加, 偽隨機數法和餘數法, 這裡餘數法比較常用. 因為本例中已給出哈希函數所以不必構造, 直接使用題中給的哈希函數來運算便可. 雖然通過構造好的哈希函數可以減少衝突, 但是衝突是不可避免的, 所以就產生了相應處理哈希衝突常用的四種方法 :
開放定址法中的線性探測再散列比較常用, 該方法事衝突發生時, 順序查看表中下一單元, 直到找到一個空單元或是該哈希表已滿.
範例代碼 :
執行結果 :
補充說明 :
* Wiki : HashTable
編程實現哈希查找, 要求如下 :
已知哈希表長度為11, 哈希函數為 H(key) = key%11, 隨機產生散列的小於50的 8 個元素, 同時採用線性探測再散列的方法處理衝突, 接著輸入要查找的數據, 無論找到與否都提示訊息.
技術要點 :
哈希函數的構造方法通常有五種, 分別是數字分析法, 平分取中法, 分段疊加, 偽隨機數法和餘數法, 這裡餘數法比較常用. 因為本例中已給出哈希函數所以不必構造, 直接使用題中給的哈希函數來運算便可. 雖然通過構造好的哈希函數可以減少衝突, 但是衝突是不可避免的, 所以就產生了相應處理哈希衝突常用的四種方法 :
開放定址法中的線性探測再散列比較常用, 該方法事衝突發生時, 順序查看表中下一單元, 直到找到一個空單元或是該哈希表已滿.
範例代碼 :
- #include
- #include
- #include
- #include
- using namespace std;
- #define MAX_HASH_SIZE 11
- #define N 8
- int hashTable[MAX_HASH_SIZE];
- int _func(int value) {
- return value%MAX_HASH_SIZE;
- }
- int _search(int key) {
- int t, pos;
- pos = _func(key);
- t = pos;
- while(hashTable[t]!=key && hashTable[t]!=-1) {
- t = (t+1) % MAX_HASH_SIZE;
- if(pos==t) {
- return -1;
- }
- }
- if(hashTable[t]==-1)
- return -1;
- else
- return t; // 找到目標值
- }
- void _createHash(int key) {
- int pos,t;
- pos = _func(key); // 哈希函數確定元素位置
- t = pos;
- while(hashTable[t]!=-1) { // 如果該位置有元素存在則進行線性探測再散列
- t = (t+1) % MAX_HASH_SIZE;
- if(pos == t) { // 如果衝突處理後確定位置與原來位置相同說明哈希表已滿
- printf("Hash Table is full.\n");
- return;
- }
- }
- hashTable[t] = key;
- }
- void main() {
- int flag[50] = {0};
- for(int i=0; i
- hashTable[i] = -1;
- srand((unsigned long)time(0));
- int j=0,t;
- while(j!=N) {
- t = rand() % 50;
- if(flag[t] == 0) {
- _createHash(t);
- printf("%2d: ", t);
- for(int i=0; i
- printf("(%2d) ", hashTable[i]);
- printf("\n");
- flag[t] = 1;
- j++;
- }
- }
- t=0;
- while(t>=0){
- printf("Please input number which you want to search: ");
- cin >> t;
- if(t>=0 && t<50) {
- int i = _search(t);
- if(i>=0) {
- printf("Success!(%d)\n", i);
- } else {
- printf("Sorry, not found!\n");
- }
- }
- }
- }
補充說明 :
* Wiki : HashTable
This message was edited 2 times. Last update was at 04/06/2010 09:49:41
沒有留言:
張貼留言