首页 > 代码库 > 开放寻址法
开放寻址法
//开放寻址法 //散列函数包括线性探测、二次探测、双重探测 #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; }
Reference
[1].http://m.blog.csdn.net/blog/liuzhanchen1987/7799257#
开放寻址法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。