1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #define Mod 100007 //取模的大小,哈希表的大小... 5 #define Max 50 //存放的总数 6 typedef long long LL; 7 class Hash //手写哈希 8 { 9 public: 10 int hs[Mod]; //哈希值 设定的哈希函数为 原值 % Mod ,所以哈希值有可能是 0 ~ Mod-1 11 int next[Max]; //链表 存放哈希值相等的一条链,他的大小取决于所有原值的数量 12 LL S[Max]; //存放原值 13 int H[Max]; //存放所有哈希值 14 int sn; //不同原值的数量 15 int hn; //不同哈希值的数量 16 Hash() //构造函数: 定义Hash类变量时初始化 17 { 18 sn=0; 19 hn=0; 20 for(int i=0;i<Mod;i++) 21 hs[i]=0; 22 } 23 void clear() //清空函数 24 { 25 sn=0; 26 for(int i=0;i<hn;i++) 27 hs[H[i]]=0; 28 hn=0; 29 } 30 void add(LL s) //加入 31 { 32 int ha=abs(s)%Mod; //计算哈希值 33 if(hs[ha]==0) //如果该哈希值还未出现过 34 { 35 H[hn++]=ha; //将该哈希值记录起来,同时哈希值数量加 1 36 } 37 sn++; //0 表示结尾,所以从1 开始存,原值数量加 1,特别针对 hs数组 38 S[sn]=s; //将原值记录起来 39 next[sn]=hs[ha]; //原本原值记录位置 40 hs[ha]=sn; //最新原值记录位置,如果从0 开始存,就无法判断此时是空还是1个值 41 //比如:5 和 10 有一样的哈希值 ,并且 5 和 10 先后加入 那么有: 42 //5 加入: next[1] = 0; hs[5] = 1; hs[5] 是哈希值为5 的头,表示第一个原值在1的位置 43 //10加入: next[2] = 1; hs[5] = 2; 表示第一个哈希值为5的在2,第二个在1,第三个不存在 44 } 45 int find(LL s) //查找 46 { 47 int ha=abs(s)%Mod; //计算哈希值 48 int k=hs[ha]; //头 49 while(k!=0) 50 { 51 if(S[k]==s) return k;//找到 52 k=next[k]; //下一个节点 53 } 54 return 0; //表示没找到 55 } 56 }; 57 int main() 58 { 59 60 return 0; 61 }
时间: 2024-11-05 21:40:16