线性探查法
该方法的基本思想是:
将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:
d,d+l,d+2,…,m-1,0,1,…,d-1
即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止.
探查过程终止于三种情况:
(1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);
(2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;
该方法的基本思想是:
将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:
d,d+l,d+2,…,m-1,0,1,…,d-1
即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止.
探查过程终止于三种情况:
(1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);
(2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;
(3)若探查到T[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满).
当时想了好久,以为是像哈希一样的、错误了好多次,原来是因为不知道什么是线性探测法
理解:意思是给一个数%M,这个位置是否已经有数占领,如果有的话,就寻找下一个位置,也就是这个数%M+1,如果这个数大于M,又从头0开始,直到找到一个位子可以放数进去。
顺便复习了一下hash的使用,hash是通过一个个数组储存%后的关键字进行查找,但是数组存的还是完整的那个数
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int next[500];
int head[500];
int st[500];
int try1(int x){
int u=st[x]%107;
int v=head[u];
while(v){
if(st[v]==st[x])return 0;
else v=next[v];
}
next[u]=head[u];
head[u]=x;;
}
int main(){
//freopen("in.txt","r",stdin);
int i,j,k,l1,l2,f1,f2,f3,t1,t2,t3;
memset(next,0,sizeof(next));
memset(head,0,sizeof(head));
t1=1;
while(cin >> f1){
st[t1]=f1;
if(try1(t1)){
t1++;
cout << "插入成功"<<endl;
}else{
cout << "插入失败" << endl;
}
}
return 0;
}