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)判 ...
随机推荐
- c#查看电脑内存
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- 常用google产品
常用google产品 01.谷歌阅读器(Google Reader):网页版RSS阅读器,方便订阅,组织和分享新闻.有手机版. 02.谷歌相册服务(Google Picasa):提供照片的下载和编 ...
- 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...
- 安卓系统运行Debian-7.0环境(Debian for android)
新手使用说明(下载地址在文章末尾): 〇.警告:root 有风险,折腾 Linux 更有风险,因使用 Debian for Armel 导致任何直接或间接的损失,本人不负任何责任:一.将 debian ...
- 介绍两个Eclipse插件: Implementors & Call Hierarchy
介绍两个Eclipse插件: Implementors & Call Hierarchy 本文介绍两个在Eclipse调试与跟踪过程中的两个实用插件 他们都可以在 http://eclipse ...
- Musical Theme - poj 1743(求最大不重叠重复子串)
题目大意: * 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题. * “主题”是整个音符序列的一个子串,它需要满 ...
- SpringMVC存取Session的两种方法 转
方法一:使用servlet-api @Controller public class ManagerController { @Resource private ManagerService mana ...
- c++文件流
前言 文件流能够从文件系统中读取数据并向文件中写入数据. 文件输入流适用于读取配置数据.读取保存的文件以及批处理基于文件的数据等任务.Fprintf,fwrite,fputs 文件输出流适用于保存状态 ...
- Google Reader的另一个开源的替代品Go Read
Google Reader到7月1号退休了,于是出现了一批Google Reader的替代品,比如Google Reader Is Shutting Down; Here Are the Best A ...
- eclipse有时新建一个PHP文件或者是HTML文件没有快捷键太麻烦了,总要用鼠标点 怎么创建自己的快捷键呢?
问题:总是在eclipse上编写PHp程序和对应的HMTL模板文件,但是却没有可以直接新PHP文件和HTMl文件的快捷方式,苦恼. 在百度上搜了一下,我们是可以创建自己的组合快捷键的. 创建快捷键的方 ...