码迷,mamicode.com
首页 > 其他好文 > 详细

手写哈希类

时间:2015-08-29 12:21:53      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

 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 }

 

手写哈希类

标签:

原文地址:http://www.cnblogs.com/hchlqlz-oj-mrj/p/4768804.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!