hash表的建立和查找

(1)冲突处理方法为:顺次循环后移到下一个位置,寻找空位插入。
(2)BKDE 字符串哈希
unsigned int hash_BKDE(char *str)
{
/* 初始种子seed 可取31 131 1313 13131 131313 etc.. */
unsigned int seed = 131;
unsigned int hash = 0;
while (*str)
{
hash = hash * seed + (*str++);
}
return (hash & 0x7FFFFFFF);
}

选做内容
每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,当馆藏书种类不到10,000时,采用折叠法构造一个四位数的哈希函数。

  1 #include<iostream>
  2 #include<string>
  3 #include<string.h>
  4 #include<stdlib.h>
  5
  6 #define Datatype string
  7 #define max 5000
  8 using namespace std;
  9
 10
 11 typedef struct
 12 {
 13     Datatype data;
 14     bool isnull;
 15 }Hash;
 16 Hash hashTable[max];
 17
 18 void initHash()
 19 {
 20
 21     for(int i=0;i<max;i++)
 22     {
 23         hashTable[i].isnull=0;
 24     }
 25     cout<<"call initHash( )\n"<<endl;
 26
 27 }
 28 unsigned int hash_B(char *str)
 29 {
 30     /**初始种子seed**/
 31     unsigned int seed=131;
 32     unsigned int hash=0;
 33
 34     while(*str)
 35     {
 36         hash=hash*seed+(*str++);
 37     }
 38
 39     return (hash&&0x7fffffff);
 40 }
 41 int insertHash(string str)
 42 {
 43     char ch[100];
 44     int index;
 45     strcpy(ch,str.c_str());
 46     index=hash_B(ch);
 47
 48     if(hashTable[index].isnull == 0)  //没有发生冲突
 49     {
 50         hashTable[index].data = ch;
 51         hashTable[index].isnull = 1;
 52
 53     }
 54     else    //当发生冲突的时候
 55     {
 56         while(hashTable[index].isnull == 1 && index<max)
 57         {
 58             index++;     //采用线性探测法,步长为1
 59         }
 60         if(index == max)    //Hash表发生溢出
 61             return -1;
 62         hashTable[index].data = ch;
 63         hashTable[index].isnull = 1;
 64
 65     }
 66    // cout<<"index:  "<<index<<endl;
 67     return 0;
 68     //hashTable[index].data=ch;
 69     //hashTable[index].isnull=1;
 70 }
 71
 72 bool findHash(string str)
 73 {
 74
 75     char ch[100];
 76     int index,i;
 77     strcpy(ch,str.c_str());
 78     index=hash_B(ch);
 79     bool flag=0;
 80
 81     for(i=index;i<max;i++)
 82     {
 83         if(hashTable[i].isnull==0)
 84         {flag=0;break;}
 85         if(str==hashTable[i].data)
 86         {flag=1;break;}
 87     }
 88
 89
 90     return flag;
 91
 92 }
 93 int main()
 94 {
 95     initHash();
 96     int n,m,i,j;
 97     cout<<"输入:"<<endl;
 98     cin>>n;
 99     string str;
100     for(i=0;i<n;i++)
101     {
102         cin>>str;
103         if(insertHash(str)<0)
104         {cout<<"溢出"<<endl;break;}
105     }
106     cin>>m;
107     bool e[m];
108     for(i=0,j=0;i<m;i++,j++)
109     {
110         cin>>str;
111         if(findHash(str))
112             e[j]=1;
113         else
114             e[j]=0;
115     }
116     for(j=0;j<m;j++)
117     {
118         if(e[j])
119             cout<<"yes"<<endl;
120         else
121             cout<<"no"<<endl;
122     }
123     cin>>n;
124     return 0;
125 }

  1 #include<iostream>
  2 #include<string>
  3 #include<string.h>
  4 #include<stdlib.h>
  5
  6 #define Datatype string
  7 #define max 10000
  8 #define length 10
  9 #define adr 4
 10 using namespace std;
 11
 12
 13 typedef struct
 14 {
 15     Datatype data;
 16     bool isnull;
 17 }Hash;
 18 Hash hashTable[max];
 19
 20 void initHash()
 21 {
 22
 23     for(int i=0;i<max;i++)
 24     {
 25         hashTable[i].isnull=0;
 26     }
 27     cout<<"call initHash( )\n"<<endl;
 28
 29 }
 30 unsigned int hash_B(char *str)
 31 {
 32     int i,j;
 33     int bit[length];
 34     for(i=0;i<length;i++)
 35     {
 36         bit[i]=str[i]-‘0‘;
 37        // cout<<bit[i]<<" ";
 38     }
 39     cout<<endl;
 40
 41     int ret=0;
 42     int temp=0;
 43     for(i=0;i<adr;i++)
 44         temp=temp*10+bit[i];
 45     ret+=temp;
 46     temp=0;
 47     for(i=adr;i<adr*2;i++)
 48         temp=temp*10+bit[i];
 49     ret+=temp;
 50     temp=0;
 51     for(i=adr*2;i<length;i++)
 52         temp=temp*10+bit[i];
 53     ret+=temp;
 54     temp=0;
 55    ret=ret%10000;
 56    cout<<"ret :"<<ret<<endl;
 57    return ret;
 58 }
 59 int insertHash(string str)
 60 {
 61     char ch[100];
 62     int index;
 63     strcpy(ch,str.c_str());
 64     index=hash_B(ch);
 65
 66     if(hashTable[index].isnull == 0)  //没有发生冲突
 67     {
 68         hashTable[index].data = ch;
 69         hashTable[index].isnull = 1;
 70
 71     }
 72     else    //当发生冲突的时候
 73     {
 74         while(hashTable[index].isnull == 1 && index<max)
 75         {
 76             index++;     //采用线性探测法,步长为1
 77         }
 78         if(index == max)    //Hash表发生溢出
 79             return -1;
 80         hashTable[index].data = ch;
 81         hashTable[index].isnull = 1;
 82
 83     }
 84    // cout<<"index:  "<<index<<endl;
 85     return 0;
 86     //hashTable[index].data=ch;
 87     //hashTable[index].isnull=1;
 88 }
 89
 90 bool findHash(string str)
 91 {
 92
 93     char ch[100];
 94     int index,i;
 95     strcpy(ch,str.c_str());
 96     index=hash_B(ch);
 97     bool flag=0;
 98
 99     for(i=index;i<max;i++)
100     {
101         if(hashTable[i].isnull==0)
102         {flag=0;break;}
103         if(str==hashTable[i].data)
104         {flag=1;break;}
105     }
106
107
108     return flag;
109
110 }
111 int main()
112 {
113     initHash();
114     int n,m,i,j;
115     cout<<"输入:"<<endl;
116     cin>>n;
117     string str;
118     for(i=0;i<n;i++)
119     {
120         cin>>str;
121         if(insertHash(str)<0)
122         {cout<<"溢出"<<endl;break;}
123     }
124     cin>>m;
125     bool e[m];
126     for(i=0,j=0;i<m;i++,j++)
127     {
128         cin>>str;
129         if(findHash(str))
130             e[j]=1;
131         else
132             e[j]=0;
133     }
134     for(j=0;j<m;j++)
135     {
136         if(e[j])
137             cout<<"yes"<<endl;
138         else
139             cout<<"no"<<endl;
140     }
141     cin>>n;
142     return 0;
143 }

时间: 2024-11-08 20:18:13

hash表的建立和查找的相关文章

算法学习之查找(顺序、二分法、排序二叉树以及 Hash 表)

[摘要]查找--用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素.在计算机中进行查找的方法是根据表中的记录的组织结构确定的.查找功能数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. 1. 顺序查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据.此时数据本身没有特征,所以我们需要的那个数据可能出现在数组

python 字典有序无序及查找效率,hash表

刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字典在python内部是通过哈希表的顺序来排的,做了一些测试,比如di = {1:1,3:3,2:2,4:4,5:5} ,无论怎么改变键值对的顺序,print di 总是会{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}.所以看起来当插入di['key']='value'时,这组键值对有时

海量路由表可以使用HASH表存储吗-HASH查找和TRIE树查找

千万别!很多人这样说,也包括我.Linux内核早就把HASH路由表去掉了,现在就只剩下TRIE了,不过我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix hash 和tire其实是可以统一在一起的.具有相同hash值的多个项具有一个共同的特征,这个特征怎么提取呢?无疑这就是hash函数的工作.而trie树 (或者radix树,管它呢)的一棵子树也有共同的特征,这个特征怎么提取呢?无疑这就是该子树根节点的父节点指示的某些bits在这棵子树的每一个节点 都具有相同的

顺序查找,折半查找,二叉排序树的建立,哈希表的建立

以下四个验证性实验都做. (1)顺序查找验证 (2)折半查找验证 (3)二叉排序树的建立 (4)哈希表的建立 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<string.h> #include<algorithm> using namespace std; class dijiuzhang { public: int a[1

Hash表的平均查找长度ASL计算方法

Hash表的“查找成功的ASL”和“查找不成功的ASL” ASL指的是 平均查找时间 关键字序列:(7.8.30.11.18.9.14) 散列函数: H(Key) = (key x 3) MOD 7 装载因子: 0.7 处理冲突:线性探测再散列法 查找成功的ASL计算方法: 因为现在的数据是7个,填充因子是0.7.所以数组大小=7/0.7=10,即写出来的散列表大小为10,下标从0~9. 第一个元素7,带入散列函数,计算得0. 第二个元素8,带入散列函数,计算得3. 第三个元素30,带入散列函数

深入了解STL中set与hash_set,hash表基础

一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(logN)的情况下插入,删除和查找数据.hash_set操作的时间度则比较复杂,取决于哈希函数和哈希表的负载情况. 二,SET使用范例(hash_set类似) 1 #include <set> 2 #include <ctime> 3 #include <cstdio> 4

十一、从头到尾彻底解析Hash 表算法

在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法.----------------------------------

从头到尾彻底解析Hash 表算法

在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法.----------------------------------

hash表学习笔记

一.hash表的基本概念和优缺点比较 hash表又称哈希表 ,是一种数据结构,与链表.二叉树有很大区别. 1.hash表优缺点 优点:能够在常数级的时间复杂度上进行查找,并且插入数据和删除数据简单.(Hash未满的时候速度很快) 缺点:不支持排序,一般比用线性表存储需要更多时间,并且记录的关键字不能重复 2.与链表比较 链表:查询上表中的数据从头开始遍历,直到查到或者查找失败. hash:根据存储数据特定关键字,然后根据关键字直接查询想要得到数据. hash存储位置通常称作Hash地址. Has