算法导论第十一章11.4例题——开放寻址法代码实现

来源:互联网 发布:移动网络共享 编辑:程序博客网 时间:2024/05/16 05:01

本代码根据开放寻址法的三种方法——线性探查、二次探查、双重探查法实现散列表的插入,删除,寻找。

开放寻址法一个槽只插入一个元素,完全避免冲突,但是查找时间可能会增大。

以上三种方法要做到降低集群现象的发生(即大量的元素密集的排列在散列表中的某一段区域,这样会增加插入查找的时间复杂度)。

具体代码如下:

//开放寻址法//散列函数包括线性探测、二次探测、双重探测#include<iostream>using namespace std;//除法散列法int h1(int k,int m){return k%m; }//乘法散列法int h2(int k,int m,float A){float fnum=(float)k;float re=((fnum*A)-(int)(fnum*A))*m;return (int)re;}//全域散列法,p为质数int h3(int k,int p,int m){int a,b;a=11;b=13;return ((a*k+b)%p)%m;}//线性探查int LinerProbing(int k,int m,int i){return (h1(k,m)+i)%m;}//二次探查int QuadraticProbing(int k,int m,int i){int c1=17,c2=67;return (h1(k,m)+c1*i+c2*i*i)%m;}//双重探查int DoublefunProbing(int k,int m,int i){return (h3(k,17,m)+i*h1(k,m))%m;}//插入值为k的元素到具有m个槽的T中int Insert(int *T,int k,int m){int i=1,j;while(1){//利用双重探查得出插入位置j=DoublefunProbing(k,m,i);if(i==m+1){break;}//T[j]==-1表示该槽为空if(T[j]==-1){T[j]=k;return j;}i++;}return -1;}//删除值为k的元素在具有m个槽的T中bool Delete(int *T,int k,int m){int i=1,j;while(1){j=DoublefunProbing(k,m,i);if(i==m+1){return 0;}if(T[j]==-1){return 0;}if(T[j]==k){T[j]=-1;return 1;}i++;}}//搜索值为k的元素在具有m个槽的T中int Search(int *T,int k,int m){int i=1,j;while(1){j=DoublefunProbing(k,m,i);if(i==m+1){return -1;}if(T[j]==-1){return -1;}if(T[j]==k){return j;}i++;}}int main(){int a[10]={4,8,2,6,41,21,53,496,3216,48};int T[101]={0};int i;for(i=0;i<101;i++){T[i]=-1;}for(i=0;i<10;i++){Insert(T,a[i],100);}for(i=1;i<=100;i++){if(T[i]!=-1){cout<<T[i]<<" ";}}cout<<endl;cout<<Search(T,2,100)<<endl;Delete(T,2,100);cout<<Search(T,2,100)<<endl;}