手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

哈希表数据结构的双重哈希如何用c++实现

时间:2024-10-13 13:22:07

1、双重哈希的地址映射可以使用如下公式:(hash1(key) + i * hash2(key)) % TABLE_SIZEhash1与hash2为地址映射的哈希函数;table_size为哈希表的大小;key为插入的元素大小。当未发生冲突的时候i取0,如果发生冲突i取1,如果再次冲突的话i依次增大即可。

哈希表数据结构的双重哈希如何用c++实现

2、一般来说双重哈希的哈希函数为hash1(key) = key % TABLE_SIZEhash2(key) = PRIME – (key % PRIME)这里table_size为哈希表的大小,PRIME略小于TABLE_SIZE。

哈希表数据结构的双重哈希如何用c++实现

3、举个例子:往大小为13的哈希表中插入数值19,27,36,10。哈希函数为如下图所示。

哈希表数据结构的双重哈希如何用c++实现

4、插入19,27,36的时候发生冲突,其对应的索引地址为6,1,10.当插入10的时候,其对应的索引为10,与36发生冲突。

哈希表数据结构的双重哈希如何用c++实现

5、使用双重哈希的方法解决冲突。一次增大i的取值,当i取2的时候10对应的索引地址为5,未发生冲突。在地址索引为5的位置插入10

哈希表数据结构的双重哈希如何用c++实现

6、下面提供代码参考#inc盟敢势袂lude <iostream>using namespace std;#define tablesize 13#define prime 7class doublehash{ int *table; int currsize;public: doublehash() { table=new int [tablesize]; currsize=0; for (int i=0;i<tablesize;i++) table[i]=-1; } bool isfull() {return (currsize>=tablesize);} int hash1(int k){return k%tablesize;} int hash2(int k){return (prime-k%prime);} void insert(int k) { if (isfull()) return; int index=hash1(k); if (table[index]==-1) table[index]=k; else { int i=0;int newindex; while (1) { i++; newindex=(index+i*hash2(k))%tablesize; if (table[newindex]==-1) { table[newindex]=k; break; } } } currsize++; } void disiplay() { for (int i=0;i<tablesize;i++) { cout<<i; if (table[i]!=-1) cout<<"---->"<<table[i]; cout<<endl; } }};int main(){ int a[]={19, 27, 36, 10, 64}; int n=sizeof(a)/sizeof(a[0]); doublehash h; for (int i=0;i<n;i++) h.insert(a[i]); h.disiplay(); return 0;}

哈希表数据结构的双重哈希如何用c++实现
© 手抄报圈