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时,采用折叠法构造一个四位数的哈希函数。
#include<iostream>
#include<string>
#include<string.h>
#include<stdlib.h> #define Datatype string
#define max 5000
using namespace std; typedef struct
{
Datatype data;
bool isnull;
}Hash;
Hash hashTable[max]; void initHash()
{ for(int i=;i<max;i++)
{
hashTable[i].isnull=;
}
cout<<"call initHash( )\n"<<endl; }
unsigned int hash_B(char *str)
{
/**初始种子seed**/
unsigned int seed=;
unsigned int hash=; while(*str)
{
hash=hash*seed+(*str++);
} return (hash&&0x7fffffff);
}
int insertHash(string str)
{
char ch[];
int index;
strcpy(ch,str.c_str());
index=hash_B(ch); if(hashTable[index].isnull == ) //没有发生冲突
{
hashTable[index].data = ch;
hashTable[index].isnull = ; }
else //当发生冲突的时候
{
while(hashTable[index].isnull == && index<max)
{
index++; //采用线性探测法,步长为1
}
if(index == max) //Hash表发生溢出
return -;
hashTable[index].data = ch;
hashTable[index].isnull = ; }
// cout<<"index: "<<index<<endl;
return ;
//hashTable[index].data=ch;
//hashTable[index].isnull=1;
} bool findHash(string str)
{ char ch[];
int index,i;
strcpy(ch,str.c_str());
index=hash_B(ch);
bool flag=; for(i=index;i<max;i++)
{
if(hashTable[i].isnull==)
{flag=;break;}
if(str==hashTable[i].data)
{flag=;break;}
} return flag; }
int main()
{
initHash();
int n,m,i,j;
cout<<"输入:"<<endl;
cin>>n;
string str;
for(i=;i<n;i++)
{
cin>>str;
if(insertHash(str)<)
{cout<<"溢出"<<endl;break;}
}
cin>>m;
bool e[m];
for(i=,j=;i<m;i++,j++)
{
cin>>str;
if(findHash(str))
e[j]=;
else
e[j]=;
}
for(j=;j<m;j++)
{
if(e[j])
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
cin>>n;
return ;
}
#include<iostream>
#include<string>
#include<string.h>
#include<stdlib.h> #define Datatype string
#define max 10000
#define length 10
#define adr 4
using namespace std; typedef struct
{
Datatype data;
bool isnull;
}Hash;
Hash hashTable[max]; void initHash()
{ for(int i=;i<max;i++)
{
hashTable[i].isnull=;
}
cout<<"call initHash( )\n"<<endl; }
unsigned int hash_B(char *str)
{
int i,j;
int bit[length];
for(i=;i<length;i++)
{
bit[i]=str[i]-'';
// cout<<bit[i]<<" ";
}
cout<<endl; int ret=;
int temp=;
for(i=;i<adr;i++)
temp=temp*+bit[i];
ret+=temp;
temp=;
for(i=adr;i<adr*;i++)
temp=temp*+bit[i];
ret+=temp;
temp=;
for(i=adr*;i<length;i++)
temp=temp*+bit[i];
ret+=temp;
temp=;
ret=ret%;
cout<<"ret :"<<ret<<endl;
return ret;
}
int insertHash(string str)
{
char ch[];
int index;
strcpy(ch,str.c_str());
index=hash_B(ch); if(hashTable[index].isnull == ) //没有发生冲突
{
hashTable[index].data = ch;
hashTable[index].isnull = ; }
else //当发生冲突的时候
{
while(hashTable[index].isnull == && index<max)
{
index++; //采用线性探测法,步长为1
}
if(index == max) //Hash表发生溢出
return -;
hashTable[index].data = ch;
hashTable[index].isnull = ; }
// cout<<"index: "<<index<<endl;
return ;
//hashTable[index].data=ch;
//hashTable[index].isnull=1;
} bool findHash(string str)
{ char ch[];
int index,i;
strcpy(ch,str.c_str());
index=hash_B(ch);
bool flag=; for(i=index;i<max;i++)
{
if(hashTable[i].isnull==)
{flag=;break;}
if(str==hashTable[i].data)
{flag=;break;}
} return flag; }
int main()
{
initHash();
int n,m,i,j;
cout<<"输入:"<<endl;
cin>>n;
string str;
for(i=;i<n;i++)
{
cin>>str;
if(insertHash(str)<)
{cout<<"溢出"<<endl;break;}
}
cin>>m;
bool e[m];
for(i=,j=;i<m;i++,j++)
{
cin>>str;
if(findHash(str))
e[j]=;
else
e[j]=;
}
for(j=;j<m;j++)
{
if(e[j])
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
cin>>n;
return ;
}
hash表的建立和查找的更多相关文章
- 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找
千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...
- python 字典有序无序及查找效率,hash表
刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字 ...
- Hash表的平均查找长度ASL计算方法
Hash表的“查找成功的ASL”和“查找不成功的ASL” ASL指的是 平均查找时间 关键字序列:(7.8.30.11.18.9.14) 散列函数: H(Key) = (key x 3) MOD 7 ...
- 深入了解STL中set与hash_set,hash表基础
一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(l ...
- 十一、从头到尾彻底解析Hash 表算法
在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver ...
- 【数据结构】非常有用的hash表
这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例. 什么是has ...
- php 数据结构 hash表
hash表 定义 hash表定义了一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法.由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来 ...
- Hash 表详解(哈希表)
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...
- (面试)Hash表算法十道海量数据处理面试题
Hash表算法处理海量数据处理面试题 主要针对遇到的海量数据处理问题进行分析,参考互联网上的面试题及相关处理方法,归纳为三种问题 (1)数据量大,内存小情况处理方式(分而治之+Hash映射) (2)判 ...
随机推荐
- Spark RDD Persistence
Spark最为重要的特性之一就是可以在多个操作(Action)之间,将一个或多个RDD关联的数据集(Dataset)以分区(Partition)为单位进行持久化(Persist)或缓存(Cache), ...
- 【转】LaTeX 符号命令大全
函数.符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} ...
- 创建一个基本的Windows应用程序
以下是包含的头文件 #define WIN32_LEAN_AND_MEAN // 指示编译器不要包含我们并不需要的MFC内容 #include <windows.h> // 包含所有的Wi ...
- MVC 5 第二章 项目结构
通过本章学习,你将了解到一个MVC 5应用程序的项目组成以及项目文件的相关信息,从而更好地架构设计出自己的项目结构. 单从MVC的字面意思我们便能够注意到M-模型, View-视图, Controll ...
- C/C++基础(二)
(1)运算符优先级 #include <cstdio> using namespace std; int main() { unsigned char a = 0xA5; un ...
- C#三种判断数据库中取出的字段值是否为空(NULL) 的方法
操作数据库,需要判断返回的字段值是否为空,收集了3种方法供参考 1 通过System.DBNull判断,网上大部分都使用这个方法. DataTable dt; ...
- winform 子窗体数据改变刷新父窗体 分类: WinForm 2014-05-06 18:30 246人阅读 评论(0) 收藏
两种方法实现: 第一种,传时间变量,主窗体要不停的刷新数据,占用资源比较大. 第二种,用this,感觉比较好用,建议用这种方法. 举例: 主窗体命名:FormA; 子窗体命名:FormB; 数据绑定方 ...
- DB2单个DB重启
db2单个数据库重启 . -------------------------------------------------------------- db2 connect to bpm user ...
- 内核与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe
内核模块:/lib/modules/version/kernel或/lib/modules/$(uname -r)/kernel; [root@localhost kern ...
- php mysqli注意问题
今天写了这个一段代码 function ip_get_method($action , $device){ if($action != 'search'){ request_die(false,'un ...