使用線性探查實現雜湊表計劃的 C++
雜湊表是一種資料結構,用於儲存鍵值對。雜湊表使用雜湊函式來計算一個索引,其中包含一個元素將被插入或搜尋的陣列。
線性探查是一種在開放定址雜湊表中解決衝突的技術。在此方法中,雜湊表中的每個單元都儲存一個鍵值對。如果將新鍵對映到已由另一個鍵佔用的雜湊表單元,則發生了衝突。此方法在表中搜索以下最接近的空閒位置,並將新鍵插入在那裡。
這是一個使用線性探查實現雜湊表的 C++ 程式。
演算法
用於插入
Begin Declare Function Insert(int k, int v) int hash_val = HashFunc(k) intialize init = -1 intialize delindex = -1 while (hash_val != init and (ht[hash_val]==DelNode::getNode() or ht[hash_val] != NULL and ht[hash_val]->k != k)) if (init == -1) init = hash_val if (ht[hash_val] == DelNode::getNode()) delindex = hash_val hash_val = HashFunc(hash_val + 1) if (ht[hash_val] == NULL || hash_val == init) if(delindex != -1) ht[delindex] = new HashTable(k, v) else ht[hash_val] = new HashTable(k, v) if(init != hash_val) if (ht[hash_val] != DelNode::getNode()) if (ht[hash_val] != NULL) if (ht[hash_val]->k== k) ht[hash_val]->v = v else ht[hash_val] = new HashTable(k, v) End.
用於搜尋鍵
Begin Declare Function SearchKey(int k) int hash_val = HashFunc(k) int init = -1 while (hash_val != init and (ht[hash_val] == DelNode::getNode() or ht[hash_val] != NULL and ht[hash_val]->k!= k)) if (init == -1) init = hash_val hash_val = HashFunc(hash_val + 1) if (ht[hash_val] == NULL or hash_val == init) return -1 else return ht[hash_val]->v End.
用於刪除
Begin Declare Function Remove(int k) int hash_val = HashFunc(k) intialize init = -1 while (hash_val != init and (ht[hash_val] == DelNode::getNode() or ht[hash_val] != NULL and ht[hash_val]->k!= k)) if (init == -1) init = hash_val hash_val = HashFunc(hash_val + 1) if (hash_val != init && ht[hash_val] != NULL) delete ht[hash_val] ht[hash_val] = DelNode::getNode() End
示例程式碼
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; const int T_S = 5; class HashTable { public: int k; int v; HashTable(int k, int v) { this->k = k; this->v = v; } }; class DelNode:public HashTable { private: static DelNode *en; DelNode():HashTable(-1, -1) {} public: static DelNode *getNode() { if (en == NULL) en = new DelNode(); return en; } }; DelNode *DelNode::en = NULL; class HashMapTable { private: HashTable **ht; public: HashMapTable() { ht = new HashTable* [T_S]; for (int i = 0; i < T_S; i++) { ht[i] = NULL; } } int HashFunc(int k) { return k % T_S; } void Insert(int k, int v) { int hash_val = HashFunc(k); int init = -1; int delindex = -1; while (hash_val != init && (ht[hash_val] == DelNode::getNode() || ht[hash_val] != NULL && ht[hash_val]->k != k)) { if (init == -1) init = hash_val; if (ht[hash_val] == DelNode::getNode()) delindex = hash_val; hash_val = HashFunc(hash_val + 1); } if (ht[hash_val] == NULL || hash_val == init) { if(delindex != -1) ht[delindex] = new HashTable(k, v); else ht[hash_val] = new HashTable(k, v); } if(init != hash_val) { if (ht[hash_val] != DelNode::getNode()) { if (ht[hash_val] != NULL) { if (ht[hash_val]->k== k) ht[hash_val]->v = v; } } else ht[hash_val] = new HashTable(k, v); } } int SearchKey(int k) { int hash_val = HashFunc(k); int init = -1; while (hash_val != init && (ht[hash_val] == DelNode::getNode() || ht[hash_val] != NULL && ht[hash_val]->k!= k)) { if (init == -1) init = hash_val; hash_val = HashFunc(hash_val + 1); } if (ht[hash_val] == NULL || hash_val == init) return -1; else return ht[hash_val]->v; } void Remove(int k) { int hash_val = HashFunc(k); int init = -1; while (hash_val != init && (ht[hash_val] == DelNode::getNode() || ht[hash_val] != NULL && ht[hash_val]->k!= k)) { if (init == -1) init = hash_val; hash_val = HashFunc(hash_val + 1); } if (hash_val != init && ht[hash_val] != NULL) { delete ht[hash_val]; ht[hash_val] = DelNode::getNode(); } } ~HashMapTable() { delete[] ht; } }; int main() { HashMapTable hash; int k, v; int c; while(1) { cout<<"1.Insert element into the table"<<endl; cout<<"2.Search element from the key"<<endl; cout<<"3.Delete element at a key"<<endl; cout<<"4.Exit"<<endl; cout<<"Enter your choice: "; cin>>c; switch(c) { case 1: cout<<"Enter element to be inserted: "; cin>>v; cout<<"Enter key at which element to be inserted: "; cin>>k; hash.Insert(k, v); break; case 2: cout<<"Enter key of the element to be searched: "; cin>>k; if(hash.SearchKey(k) == -1) { cout<<"No element found at key "<<k<<endl; continue; } else { cout<<"Element at key "<<k<<" : "; cout<<hash.SearchKey(k)<<endl; } break; case 3: cout<<"Enter key of the element to be deleted: "; cin>>k; hash.Remove(k); break; case 4: exit(1); default: cout<<"\nEnter correct option\n"; } } return 0; }
輸出
1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 1 Enter element to be inserted: 10 Enter key at which element to be inserted: 2 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 1 Enter element to be inserted: 7 Enter key at which element to be inserted: 6 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 1 Enter element to be inserted: 4 Enter key at which element to be inserted: 5 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 1 Enter element to be inserted: 12 Enter key at which element to be inserted: 3 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 15 Enter correct option 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 1 Enter element to be inserted: 15 Enter key at which element to be inserted: 8 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 2 Enter key of the element to be searched: 6 Element at key 6 : 7 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 3 Enter key of the element to be deleted: 2 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 2 Enter key of the element to be searched: 2 No element found at key 2 1.Insert element into the table 2.Search element from the key 3.Delete element at a key 4.Exit Enter your choice: 4
廣告