(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表的建立和查找的更多相关文章

  1. 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找

    千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...

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

    刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字 ...

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

    Hash表的“查找成功的ASL”和“查找不成功的ASL” ASL指的是 平均查找时间 关键字序列:(7.8.30.11.18.9.14) 散列函数: H(Key) = (key x 3) MOD 7 ...

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

    一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(l ...

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

    在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  ...

  6. 【数据结构】非常有用的hash表

        这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例.         什么是has ...

  7. php 数据结构 hash表

    hash表 定义 hash表定义了一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法.由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来 ...

  8. Hash 表详解(哈希表)

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...

  9. (面试)Hash表算法十道海量数据处理面试题

    Hash表算法处理海量数据处理面试题 主要针对遇到的海量数据处理问题进行分析,参考互联网上的面试题及相关处理方法,归纳为三种问题 (1)数据量大,内存小情况处理方式(分而治之+Hash映射) (2)判 ...

随机推荐

  1. 建立HttpsConnection

    1建立HttpConnection,这种连接比较简单,但是是不安全的,网上例子比较多,现在主要说说如果建立HttpsConnection,这种连接时通过SSL协议加密,相对更安全,一般使用这种连接传输 ...

  2. 网络流CodeForces. Original 589F:Gourmet and Banquet

    A gourmet came into the banquet hall, where the cooks suggested n dishes for guests. The gourmet kno ...

  3. scanf从文件中读入,printf写入到文件

    重定向方式读写文件 #include <stdio.h> #define LOCAL int main() { #ifdef LOCAL freopen("input.txt&q ...

  4. mac上的键盘生活——quicksliver

      昨天晚上一直在找mac上的博客客户端,没发现很好的国内支持客户端,却发现了一个新的东西--quicksliver 简单的说,这个就是个快捷键启动方式,这是我在mac上用的最好的一个快捷键启动程序( ...

  5. sql2005如何附加数据库

    1.首先把mdf(数据库主文件)和ldf(数据库日志文件)放到C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data 2.登陆sq ...

  6. SRM 441(1-250pt, 1-500pt)

    DIV1 250pt 题意:用数组A表示置换,由该置换得到数组B(B[0] = 0, B[i] = A[B[i-1]]).给定A,求一个A',使得由A'得到的B为单循环置换且A'与A的差距最小.定义A ...

  7. 【机房系统知识小结】微软自带RDLC报表,数据汇总设计

    在做机房系统报表的时候,借鉴 八期崔成龙学长的博客< VB.NET rdlc 报表的使用>,照虎画猫的敲了一遍,但是在“汇总项”中,出现了一点小问题. 具体的设计方法在这里就不做介绍了,请 ...

  8. C#中的线程(下)-多线程

    1.  单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...

  9. OS开发网络篇—监测网络状态

    iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...

  10. android 53 ContentProvider内容提供者

    ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标 ...