实验16:哈希查找实验报告

实验16:哈希查找实验报告
实验16:哈希查找实验报告

深圳大学实验报告

课程名称:数据结构实验与课程设计

实验项目名称:哈希查找实验

学院:计算机与软件学院

专业:软件工程

指导教师:杨芳

报告人:薛锡增学号:2013150368 班级: 3 实验时间:2014-12-11

实验报告提交时间:2014/12/12

教务处制

一、实验目的

1、掌握哈希查找算法的基本思想

2、掌握哈希查找表的构造方法

3、掌握链表法解决冲突的方法

4、掌握哈希查找的时间性能

二、实验要求

1、熟悉C++语言编程

2、了解哈希查找的原理

三、实验内容

1、问题描述

采用散列表方式,对关键字进行查找。

2、查找算法

⑴、利用哈希函数(除留余数法,哈希表长为5)及记录的关键字计算出记录的存储地址

⑵、直接到指定地址进行查找

⑶、如果查找不成功,则采用(表头插入)链地址法,将记录插入到指定地址所在链表的头

上。

3、输入

⑴、第一行:测试次数。

⑵、每个样本分2行:

第一行:第一个数字n表示样本数目,其后跟n个样本;

第二行:查找的关键字的值。

4、输出

查找是否成功(1—表示成功,0表示不成功),所在位置(从0开始),查找次数。

5、输入样本

2

5 2 4 9 5 7

4

6 2 6 8 4 9 1

7

6、输出样本

1 4 2

0 2 2

四、程序清单

#include

using namespace std;

struct node

{

int data;

node* next;

node(){next=NULL;}

};

const int m=11;

int main()

{

node h[15];

int n,i,s;

node* p;

//freopen("cin1.txt","r",stdin);

cin>>n;

for(i=0;i

{

cin>>s;

p=new node();

p->data=s;

p->next=h[s%11].next;

h[s%11].next=p;

}

int t;

cin>>t;

while(t--)

{

cin>>s;

int sum=1;

p=h[s%11].next;

while(p)

{

if(s==p->data){

cout<

break;

}

sum++;

p=p->next;

}

if(!p)

{

cout<<"error"<

p->data=s;

p->next=h[s%11].next; h[s%11].next=p;

}

}

return0;

}

五、程序运行时截图

流程图:

对逐个输入的数据进行除11取余,放到数组相应的位置上

输入数据后对其除11取余到数组相应的位置上进行查找,

找到就输出数组下标、数组上的第几个结点

六、实验心得与体会(实验中遇到的问题及解决方案,或写点感想)

哈希查找还没交,对概念不是很懂,在处理问题上也出现不少小细节,不过最后还是做出来了。

2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

哈希表的设计与实现 课程设计报告

一: 需求分析 (2) 三: 详细设计(含代码分析) (4) 1.程序描述: (4) 2具体步骤 (4) 四调试分析和测试结果 (7) 五,总结 (9) 六.参考文献; (10) 七.致谢 (10) 八.附录 (11)

一: 需求分析 问题描述:设计哈希表实现电话号码查询系统。 基本要求 1、设每个记录有下列数据项:电话号码、用户名、地址 2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表; 3、采用再哈希法解决冲突; 4、查找并显示给定电话号码的记录; 5、查找并显示给定用户名的记录。 6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少 两种),考察平均查找长度的变化。 二: 概要设计 进入主函数,用户输入1或者2,进入分支选择结构:选1:以链式方法建立哈希表,选2:以再哈希的方法建立哈希表,然后用户输入用户信息,分别以上述确定的方法分别以用户名为检索以及以以电话号码为检索将用户信息添加到哈希表,.当添加一定量的用户信息后,用户接着输入用户名或者电话号码分别以用户名或者电话号码的方式从以用户名或电话号码为检索的哈希表查找用户信息.程序用链表的方式存储信息以及构造哈希表。 具体流程图如下所示:

三: 详细设计(含代码分析) 1.程序描述: 本程序以要求使用哈希表为工具快速快速查询学生信息,学生信息包括电话号码、用户名、地址;用结构体存储 struct node { string phone; //电话号码 string name; //姓名 string address;//地址 node *next; //链接下一个地址的指针 }; 2具体步骤 1. 要求主要用在哈希法解决冲突,并且至少尝试用两种方法解决冲突,定义两个指针数组存储信息node *infor_phone[MAX]; node *infor_name[MAX];前者以电话号码为关键字检索哈希表中的信息,后者以姓名为关键字检索哈希表中的信息 用链式法和再哈希法解决冲突: int hash(string key) //以姓名或者电话号码的前四位运算结果作为哈{ //希码 int result=1,cur=0,i; if(key.size()<=4) i=key.size()-1; else i=4; for(;i>=0;i--) { cur=key[i]-'0'; result=result*9+cur; } result%=(MOD); return result;

哈希表实验报告完整版

实验报告 姓名:学号: 1.实验题目 针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。 基本要求:假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 2.需求分析 本演示程序用VC编写,完成哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 输出形式:地址,关键字,收索长度,H(key),拼音 3.概要设计 typedef struct NAME typedef struct hterm void InitNameList() void CreateHashList() void FindList() void Display() int main() 4.详细设计 #include #include #include

#define HASH_LEN 50 #define M 47 #define NAME_NO 8 typedef struct NAME { char *py; //名字的拼音 int k; //拼音所对应的整数}NAME; NAME NameList[HASH_LEN]; typedef struct hterm //哈希表{ char *py; //名字的拼音 int k; //拼音所对应的整数int si; //查找长度 }HASH; HASH HashList[HASH_LEN]; void InitNameList() { NameList[0].py="houxinming"; NameList[1].py="abc"; NameList[2].py="defdgf"; NameList[3].py="zhangrji"; NameList[4].py="jiaxin"; NameList[5].py="xiaokai"; NameList[6].py="liupeng"; NameList[7].py="shenyonghai";

数据结构实验 散列表实验报告

课程实验报告 课程名称:数据结构 实验项目名称:散列表 专业班级: 姓名:XXX 学号: 完成时间:2015 年06 月13 日

背景 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。在理想情况下,查找、插入、删除操作的时间均为O(1),是一种高效的动态集合结构。 例1:计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键值为任意字符串,与语言中的标识符对应。该符号表常采用散列表。 例2:为了节约空间,常常需要把文本文件采用压缩编码方式存储。LZW是对文本文件进行压缩和解压缩的方法之一,该方法采用了散列。 问题描述 我们希望在浩瀚的图书中,去发现一本书是否存在。我们不知道书的编号,只知道它的书名。(其实这已经不错了...)。通过书名,来查询它是否存在。 为了简化问题,我们假设每本书的书名都是一组小写字母组成,长度不超过100字符。 基本要求 (1)根据输入建立图书名称表,采用散列表实现该表,散列函数选用BKDE 字符串哈希。 (2)数据的输入输出格式: 输入分为两部分 第一部分,第一行是行数n,n <= 5000。余下n行,每行一个字符串。表示已存 在的图书记录。 第二部分,第一行是行数m,m <= 1000。余下m行,每行一个字符串。表示要查 询的图书记录。 输出: 输出为m行,如果被查的记录存在,则输出"YES",如果不存在则输出"NO"。 测试数据 输入: 4 a ans and hellocpp

数据结构课程设计--哈希表实验报告

福建工程学院 课程设计 课程:算法与数据结构 题目:哈希表 专业:网络工程 班级:xxxxxx班 座号:xxxxxxxxxxxx 姓名:xxxxxxx 2011年12 月31 日 实验题目:哈希表 一、要解决的问题 针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。 基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。 运行的环境:Microsoft Visual C++ 6.0 二、算法基本思想描述 设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。建立哈希表并且将其显示出来。通过要查找的关键字用哈希函数计算出相应的地址来查找人名。通过循环语句调用数组中保存的数据来显示哈希表。 三、设计 1、数据结构的设计和说明 (1)结构体的定义 typedef struct //记录 { NA name; NA xuehao; NA tel; }Record;

{ Record *elem[HASHSIZE]; //数据元素存储基址 int count; //当前数据元素个数 int size; //当前容量 }HashTable; 哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。 2、关键算法的设计 (1)姓名的折叠处理 long fold(NA s) //人名的折叠处理 { char *p; long sum=0; NA ss; strcpy(ss,s); //复制字符串,不改变原字符串的大小写 strupr(ss); //将字符串ss转换为大写形式 p=ss; while(*p!='\0') sum+=*p++; printf("\nsum====================%d",sum); return sum; } (2)建立哈希表 1、用除留余数法构建哈希函数 2、用线性探测再散列法处理冲突 int Hash1(NA str) //哈希函数 { long n; int m; n=fold(str); //先将用户名进行折叠处理 m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数 return m; //并返回模值 }Status collision(int p,int c) //冲突处理函数,采用二次探测再散列法解决冲突{ int i,q; i=c/2+1; while(i=0) return q; else i=c/2+1; } else{ q=(p-i*i)%HASHSIZE; c++;

哈希表实验报告

数据结构实验报告四——哈希表查找名字(字符串) 实验题目:哈希表查找名字(字符串) 实验目标: 输入一组名字(至少50个),将其保存并利用哈希表查找。输出哈希查找冲突次数,哈希表负载因子、查找命中率。 数据结构: 哈希表与数组(二维)。二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法,用于存储名字(字符串)对应得关键字并实现对名字(字符串)得查找。 需要得操作有: 1、关键字求取(主函数中两次出现,未单独编为函数) 关键字key=abs(字符串首位ASCII码值-第二位ASCII码值+第([]+1)位ASCII码值-最后一位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值得函数)。 2、处理关键字得哈希函数(Hash) 利用平方取中法求关键值key在哈希表中得位置。公式add=(key*key)%1000/LENGTH(a dd为key在哈希表中得地址)。 int Hash(intkey) { ?return((key*key)/1000%LENGTH); } 3、处理哈希表中冲突得函数(Collision) 利用线性探测再散列处理冲突,利用全局变量count统计冲突次数。 int Collision(intkey,int Hashtable[]) { inti; for(i=1;i<=LENGTH;i++) { ??if(Hashtable[(Hash(key)+i)%LENGTH]==-1) ?return((Hash(key)+i)%LENGTH); ??count++; } } 4、哈希表初始化(InitHash) void InitHash(int Hashtable[]) { inti; for(i=0;i<LENGTH;i++) ??Hashtable[i]=-1; } 5、向哈希表中插入关键字(InsertHash) void InsertHash(int key,int Hashtable[]) { int add;

数据结构哈希表设计

一、问题描述 针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。 二、基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 三、概要设计 1.构造结构体:typedef struct{}; 2.姓名表的初始化:void InitNameTable(); 3.建立哈希表:void CreateHashTable(); 4.显示姓名表:void DisplayNameTable(); 5.姓名查找:void FindName(); 6.主函数:void main() ; 四、详细设计 1.姓名表的初始化 void InitNameTable() { NameTable[0].py="louyuhong"; NameTable[1].py="shenyinghong"; NameTable[2].py="wangqi"; NameTable[3].py="zhuxiaotong"; NameTable[4].py="zhataotao"; NameTable[5].py="chenbinjie"; NameTable[6].py="chenchaoqun"; NameTable[7].py="chencheng"; NameTable[8].py="chenjie"; NameTable[9].py="chenweida";

NameTable[10].py="shanjianfeng"; NameTable[11].py="fangyixin"; NameTable[12].py="houfeng"; NameTable[13].py="hujiaming"; NameTable[14].py="huangjiaju"; NameTable[15].py="huanqingsong"; NameTable[16].py="jianghe"; NameTable[17].py="jinleicheng"; NameTable[18].py="libiao"; NameTable[19].py="liqi"; NameTable[20].py="lirenhua"; NameTable[21].py="liukai"; NameTable[22].py="louhanglin"; NameTable[23].py="luchaoming"; NameTable[24].py="luqiuwei"; NameTable[25].py="panhaijian"; NameTable[26].py="shuxiang"; NameTable[27].py="suxiaolei"; NameTable[28].py="sunyubo"; NameTable[29].py="wangwei"; for (i=0;i

数据结构课程设计--哈希表实验报告

福建工程学院课程设计 课程:算法与数据结构 题目:哈希表 专业:网络工程 班级:xxxxxx班 座号:xxxxxxxxxxxx 姓名:xxxxxxx 2011年12 月31 日

实验题目:哈希表 一、要解决的问题 针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。 基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。 运行的环境:Microsoft Visual C++ 6.0 二、算法基本思想描述 设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。建立哈希表并且将其显示出来。通过要查找的关键字用哈希函数计算出相应的地址来查找人名。通过循环语句调用数组中保存的数据来显示哈希表。 三、设计 1、数据结构的设计和说明 (1)结构体的定义 typedef struct //记录 { NA name; NA xuehao; NA tel; }Record; 录入信息结构体的定义,包含姓名,学号,电话号码。 typedef struct //哈希表 { Record *elem[HASHSIZE]; //数据元素存储基址 int count; //当前数据元素个数 int size; //当前容量 }HashTable; 哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。 2、关键算法的设计 (1)姓名的折叠处理

哈希表设计-大大数据结构课程设计

实习6、哈希表设计 一、需求分析 1. 问题描述 针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。 2. 基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 3. 测试数据 取读者周围较熟悉的30个人的姓名。 4. 实现提示 如果随机数自行构造,则应首先调整好随机函数,使其分布均匀。人名的长度均不超过19个字符(最长的人名如:庄双双(Zhuang Shuangshuang))。字符的取码方法可直接利用C语言中的toascii函数,并可先对过长的人名先作折叠处理。 二、概要设计 ADT Hash { 数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。 数据关系R:数据元素同属一个集合。 InitNameT able() 操作结果:初始化姓名表。 CreateHashT able() 操作结果:建立哈希表。 DisplayNameTable() 操作结果:显示姓名表。 DisplayHashT able() 操作结果:显示哈希表。 FindName() 操作结果:查找姓名。 }ADT Hash 三、详细设计(源代码) (使用C语言) #include #include//time用到的头文件 #include//随机数用到的头文件 #include//toascii()用到的头文件 #include//查找姓名时比较用的头文件

数据结构实验四哈希表及其查找

云南大学数学与统计学实验教学中心实验报告 课程名称: 数据结构与算法学期: 2011-2012学年第二学期 成绩: 指导教师:xxx学生姓名:xxx学生学号:xxxxx 实验名称:哈希表及其查找实验要求:必做实验学时:4(+2)学时 实验编号:4(及5)实验日期:第6-8周完成日期:2012.5.10 学院:数学与统计学院专业:信息与计算科学年级:2010级 一、实验目的 通过实验掌握散列存储的基本概念,进行哈希问题的处理,同时附带进行字符串的处理的练习。 二、实验内容 为某单位的人名(n=30人)设计一个哈希表,使得平均查找长度<2,要求完成相应的哈希建表和查表。。 三、实验环境 Windows XP 程序设计语言C 四、实验过程 1.实验要求: 1、设人名长度<10个字符,用二维字符数组存储哈希表:char hash[ ][10]; 2、要求哈希函数用除留余数法,并用人名的10个字符代码和作为分子; 用(补偿性)线性探测再散列处理冲突。 3、依题意有:平均查找长度=(1+1/(1-α))/2< 2,∴取α=0.6, 由此哈希表长m=n/α=30/0.6=50; 所以有char hashlist [ 50][10]; 令:除留余数法中的P取47; (补偿性)线性探测再散列的地址:j=(j+Q)% m中的Q取17。 4、对程序结构的要求: ①要求为哈希建表和哈希查表分别编写和设计相应的函数: createhash( ... ... ); hashsearch(... ...); ②再设计一个哈希函数表的输出函数printhash( ),对构造的哈希表进行输出,注 意输出格式要在屏幕好看,先输出序号(1~30),再输出该序号 的人名或null,每行输出10项,共输出5行。 ③还应有一个初始化char hashlist [ 50][10]的函数Inithashlist( ), 初始时将50个人名全赋值为null. 5、在主函数中: 调用Inithashlist( )初始化哈希表;

哈希表的设计与实现-数据结构与算法课程设计报告

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程数据结构与算法 课程设计名称哈希表的设计与实现 学生姓名王东东 学号0804012030 专业班级08计本(2) 指导教师王昆仑、李贯虹 2010 年5 月

课程设计目的 “数据结构与算法课程设计”是计算机科学与技术专业学生的集中实践性环节之一, 是学习“数据结构与算法”理论和实验课程后进行的一次全面的综合练习。其目的是要达到 理论与实际应用相结合,提高学生组织数据及编写程序的能力,使学生能够根据问题要求和 数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并 用软件解决问题,培养良好的程序设计技能。 一、问题分析和任务定义 1、问题分析 要完成如下要求:设计哈希表实现电话号码查询系统。 实现本程序需要解决以下几个问题: (1)如何定义一个包括电话号码、用户名、地址的节点。 (2)如何以电话号码和用户名为关键字建立哈希表。 (3)用什么方法解决冲突。 (4)如何查找并显示给定电话号码的记录。 (5)如何查找并显示给定用户名的记录。 2 任务定义 1、由问题分析知,本设计要求分别以电话号码和用户名为关键字建立哈希表,z在此基 础上实现查找功能。本实验是要我们分析怎么样很好的解决散列问题,从而建立一比较合理 的哈希表。由于长度无法确定,并且如果采用线性探测法散列算法,删除结点会引起“信息 丢失”的问题。所以采用链地址法散列算法。采用链地址法,当出现同义词冲突时,可以使 用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。 根据问题分析,我们可以定义有3个域的节点,这三个域分别为电话号码char num[30],姓名char name[30],地址char address[30]。这种类型的每个节点对应链表中的每个节点,其中电话号码和姓名可分别作关键字实现哈希表的创建。 二、数据结构的选择和概要设计 1、数据结构的选择 数据结构:散列结构。 散列结构是使用散列函数建立数据结点关键词与存储地址之间的对应关系,并提供多 种当数据结点存储地址发生“冲突”时的处理方法而建立的一种数据结构。 散列结构基本思想,是以所需存储的结点中的关键词作为自变量,通过某种确定的函 数H(称作散列函数或者哈希函数)进行计算,把求出的函数值作为该结点的存储地址,并 将该结点或结点地址的关键字存储在这个地址中。 散列结构法(简称散列法)通过在结点的存储地址和关键字之间建立某种确定的函数 关系H,使得每个结点(或关键字)都有一个唯一的存储地址相对应。 当需要查找某一指定关键词的结点时,可以很方便地根据待查关键字K计算出对应的“映像”H(K),即结点的存储地址。从而一次存取便能得到待查结点,不再需要进行若干次的 比较运算,而可以通过关键词直接计算出该结点的所在位置。

数据结构哈希表的实验报告

课程实习报告 一、需求分析: 1.本程序来自于图书馆靠书名来检索想要查找的书问题。 2.本程序要求: (1)根据输入建立图书名称表,采用创建散列表实现。 (2)建散列表后,如果想要查找的数据在散列表中输出yes否则输出no。 二、哈希表简介 结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。由此,不需比较便可直接取得所查记录。这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。

* 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。 * 综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。这个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以找到。科学家计算过,当负载因子(load factor)不超过75%,查找效率最高。* 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 程序设计流程 程序思想 (一)哈希函数unsigned int hash_BKDE(char *str)生成映射 地址,成为散列表的编号。 (二)哈希表HashTable::HashTable()通过数组储存元素 (三)插入函数void HashTable::insert(char*c)插入字符串, 先计算要插入字符串生成的映射地址,然后在相应的地址插入,如果没有空位查找空位插入。

数据结构哈希表实验报告

HUNAN UNIVERSITY 课程实习报告 题目: 哈希表 学生姓名唐鹏 学生学号 2 专业班级物联2班 指导老师吴帆 完成日期2014年4月2日

一、需求分析: 1.本程序来自于图书馆靠书名来检索想要查找的书问题。 2.本程序要求: (1)根据输入建立图书名称表,采用创建散列表实现。 (2)建散列表后,如果想要查找的数据在散列表中输出yes否则输出no。 二、哈希表简介 结构中存在关键字与K相等的记录,则必定存储在f(K)的位置上。由此,不需比较便可直接取得所查记录。这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。 * 综上所述,根据散列函数H(key)与处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”, 作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。这个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以找到。科学家计算过,当负载因子(load factor)不超过75%,查找效率最高。 * 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率就是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 程序设计流程 程序思想 (一)哈希函数unsigned int hash_BKDE(char *str)生成映射地址,成为散列表的编 号。 (二)哈希表HashTable::HashTable()通过数组储存元素 (三)插入函数void HashTable::insert(char*c)插入字符串,先计算要插入字符串生 成的映射地址,然后在相应的地址插入,如果没有空位查找空位插入。(四)查找函数bool HashTable::find(char*c)进行查找,先计算要生成字符串的地 址,再到散列表中进行查找比较。 (五)主函数main() 1)输入:输入散列表内容与要查找的数据个数与数据

(完整word版)2014广工数据结构实验报告哈希表

数据结构设计性实验报告 课程名称_____数据结构实验 _ 题目名称哈希表 学生学院__ 计算机学院______ 专业班级___ 学号____ 学生姓名____ _ 指导教师___ ___ 2015 年 7 月 2 日

1.题目 采用哈希表为存储结构,实现抽象数据类型HashTable。 ADT HAS{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R:根据设定的哈希函数和处理冲突的方法将一组关键字映像到一个连续的有限地址集上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表称为哈希表。这一映像过程称为造表或散列,所得存储位置称哈希地址或散列地址。 基本操作: InitHash(&H) 操作结果:初始化哈希表H。 DestoyHash(&H) 初始条件:哈希表H已存在。 操作结果:销毁哈希表H。 CreateHash(&H) 初始条件:哈希表H已存在。 操作结果:构造哈希表H。 SearchHash(H) 初始条件:哈希表已存在。 操作结果:查找哈希表H中元素。 InsertHash(&H) 初始条件:哈希表H已存在。 操作结果:插入元素到哈希表 DeleteHash(&H, key, &e) 初始条件:哈希表已存在且非空。 操作结果:删除H的第i个元素,并用e返回其值,H的长度减1。 } ADT List 3.算法设计 #include #include #include #include #include #define random(x) (rand()%x) #define OK 1 #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICAPE -1 #define OVERFLOW 0 typedef int KeyType; typedef int Status;

课程设计试验报告-哈希表的设计与实现

数据结构课程设计 题目哈希表的设计与实现作者 院系信息工程学院 专业信息管理与信息系统学号 1514210117 指导老师张慧 答辩时间 2016年12月18日

目录 数据结构课程设计 0 1系统需求分析 (2) 1.1用户需求分析 (3) 1.2功能需求分析 (3) 1.3数据需求分析 (3) 1.4 小结 (4) 2系统设计 (4) 2.1设计内容及要求 (4) 2.2总体设计思路 (4) 2.3程序详细设计流程图 (5) 2.31以姓名为关键字的Hash()函数流程图 (5) 2.32添加结点信息流程图: (7) 2.33按姓名查找流程图: (7) 2.34按号码查找流程图 (8) 2.35主程序流程图 (9) 2.4详细设计编码 (11) 2.41建立节点 (11) 2.42对哈希函数的定义 (11) 2.43哈希查找 (12) 2.44主函数 (12) 3系统测试 (13) 3.1上机调试 (13) 3.2调试结果与分析 (14) 4总结 (18) 5附录 (18)

1系统需求分析 在信息化时代的今天,计算机技术已经是发展到一个很可观的地步了,特别是面向窗口的操作系统的出现,使得程序设计更加的容易了。在过去计算机内存容量小,CPU计算速度慢,关于程序设计中的数据结构也因此提出来很多的关于解决这方面的问题。哈希表就是其中之一,哈希表是一个由关键字与值组成的特殊的一种数据结构。它的出现主要是为了解决在结构中查找记录时需要进行一系列和关键字的比较,这一类查找方法是建立在“比较”的基础上的,在顺序等的查找中,查找的效率是依赖于查找过程中所比较的次数。 理想的情况是希望不经过任何的比较一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系,使得每个关键字和结构中一个唯一的存储位置相对应。因而在查找时只要根据这个对应关系找到给定的值的像。若结构中存在关键字和该值相等的记录,则所要查找的数就必定就是这个所查找到的记录。 哈希函数是建立哈希表的一个重要的成员,它的构造方法分为以下几种: 直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法。 本程序中主要用的是除余取留法,除留取余法主要是取关键字被某个不大于哈希表表长m的数p出后所得余数为哈希地址即:H(key)=key MOD p, p<=m,这是一种最简单,也是一种最常用的构造函数的方法,它不仅可以对关键字直接取模,也可在折叠、平方中等运算之后取模。 在哈希表的建立中,很容易出现同义词,这些同义词的出现也导致了建立哈希表时冲突的出现,如果不解决这些冲突那么建立好的哈希表与预料的哈希表不同。关于处理冲突的方法主要有:开放定址法、再哈希法、链地址法。本程序中主要用的就是链地址法莱解决冲突的。

哈希查找_数据结构实验报告

南昌航空大学实验报告 课程名称:数据结构实验名称:实验九查找 班级:学生姓名:学号: 指导教师评定:签名: 题目:编程实现哈希表的造表和查找算法。 要求:用除留余数法构造哈希函数,用二次探测再散列解决冲突。 一、需求分析 1.用户可以根据自己的需求输入一个顺序表(哈希表) 2.通过用除留余数法构造哈希函数,并用开放地址的二次探测再散列解决冲突。 3.在经过排序后显示该哈希表。 4.程序执行的命令包括: (1)创建哈希表(2)输出哈希表(3)二次探测再散列解决冲突 二、概要设计 ⒈为实现上述算法,需要顺序表的抽象数据类型: ADT Hash { 数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。 数据关系R:数据元素同属一个集合。 基本操作P: Creathash(&h) 操作结果:构造一个具有n个数据元素的哈希查找表h。 destroyhash(&h) 初始条件:哈希查找表h存在。 操作结果:销毁哈希查找表h。 displayhash(h) 初始条件:哈希查找表h存在。 操作结果:显示哈希查找表h。 hash(h,&k) 初始条件:哈希查找表h存在。 操作结果:通过除留余数法得到地址用k返回。 hash2 (i,&k) 初始条件:哈希查找表h存在存在,i是除留余数法得到的地址。 操作结果:返回二次探测再散列解决冲突得到的地址k。 search (h,key) 初始条件:哈希查找表h存在。 操作结果:查找表h中的key,若查找成功,返回其地址,否则返回

-1 insert (&h,key) 初始条件:哈希查找表h存在。 操作结果:若表h中没有key,则在h中插入key。 search1(h, key,&p) 初始条件:哈希查找表h存在。 操作结果:在表h中查找key,若没有,则返回p的插入的地址,否 则返回-1。 }ADT Hash 2. 本程序有三个模块: ⑴主程序模块 main(){ 初始化; { 接受命令; 显示结果; } } ⑵创建hash表的模块:主要建立一个哈希表; ⑶解决冲突模块:利用开放地址的二次探测再散列解决冲突; (4)输出哈希表模块:显示已创建哈希表。 三、详细设计 ⒈元素类型,结点类型 typedef struct { int key; }keytype; typedef struct { keytype elem[100]; int length; /*当前的长度*/ int size; /*哈希表的总长*/ }hashtable; /*全局变量*/ int a=0,b=0; /*哈希函数*/ 2.对抽象数据类型中的部分基本操作的伪码算法如下: /*哈希函数*/ int hash(hashtable *h,int k) { return k%h->size; }

哈希表实验报告(20200623044247)

数据结构实验报告四一一哈希表查找名字(字符串) 实验题目:哈希表查找名字(字符串) 实验目标: 输入一组名字(至少50个),将其保存并利用哈希表查找。输出哈希查找冲突次数,哈希表负载因子、查找命中率。 数据结构: 哈希表和数组(二维)。二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法, 用于存储名字(字符串)对应的关键字并实现对名字(字符串)的查找。 需要的操作有: 1.关键字求取(主函数中两次出现,未单独编为函数) 关键字key=abs (字符串首位ASCII码值-第二位ASCII码值+第([n]+i )位ASCII码值撮后一 位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值的函数)。 2.处理关键字的哈希函数(Hash) 利用平方取中法求关键值key在哈希表中的位置。公式add=(key*key)%1000/LENGTH(add 为key在哈希表中的地址)。 int Hash(i nt key) { return((key*key)/1000%LENGTH); } 3.处理哈希表中冲突的函数(Collision 利用线性探测再散列处理冲突,利用全局变量count统计冲突次数。 int Collision(int key,int Hashtable[]) { int i; for(i=1;i<=LENGTH;i++) { if(Hashtable[(Hash(key)+i)%LENGTH]==-1) return((Hash(key)+i)%LENGTH); coun t++; } } 4.哈希表初始化(InitHash) void InitHash(int Hashtable[]) { int i; for(i=0;i

哈希表的设计与实现

洛阳理工学院 课程设计报告 课程名称数据结构课程设计 设计题目哈希表的设计与实现 专

课程设计任务书 设计题目:哈希表的设计与实现_________________________________ _________________________________________________________ 设计内容与要求: 内容: 1、设每个记录有下列数据项:电话号码、用户名、地址; 2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表; 3、采用再哈希法解决冲突; 4、查找并显示给定电话号码的记录; 5、查找并显示给定用户名的记录。 6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少两种),考察平均查找长度的变化。 课程设计评语 成绩: 指导教师:_______________ 年月日

目录 一.问题描述 (2) 二.基本要求 (2) 三.数据结构 (2) 四.总体设计 (2) 五.详细设计 (3) 5.1录入功能 void lurugongneng() (3) 5.2查询功能 void chaxungongnen() (3) 5.3订票功能 void dingpiaogongnen() (4) 5.4退票功能 void tuipiaogongnen() (4) 5.5修改功能 void xiugaigongnen()................ 错误!未定义书签。六.测试与调试. (4) 6.1 程序的模块 (4) 6.2 程序的调试 (4) 6.3 测试结果 (5) 七.源程序清单 (6)

一.问题描述 通过此系统可以实现如下功能: 录入:可以录入通讯录情况 查询:查询通讯录内的所有人 插入:在通讯录内插入后来自己想要的人的信息 删除:删除自己需要删除的信息 修改:修改通讯录内的个人信息 二.基本要求 根据以上功能说明,设计哈希表通讯录的存储结构,设计程序完成功能。三.数据结构 int key; // 定义两个关键字为全局变量 int key2; int *p; struct node{ //建立节点,每个节点包括用户姓名,地址电话号码,以及指向下一个节点的指针 char name[8],address[20]; char num[11]; node *next; }; 四.总体设计

哈希表(实验报告附C++源码)

散列表 一、问题描述 我们希望在浩瀚的图书中,去发现一本书是否存在。我们不知道书的编号,只知道它的书名。(其实这已经不错了...)。通过书名,来查询它是否存在。 为了简化问题,我们假设每本书的书名都是一组小写字母组成,长度不超过100字符。 二、需求分析 1.根据输入建立图书名称表,采用散列表实现该表,散列函数自建。 2.数据的输入输出格式: 输入分为两部分 输入: 第一部分,第一行是行数n,n <= 5000。余下n行,每行一个字符串。表示已存在的图书记录。 第二部分,第一行是行数m,m <= 1000。余下m行,每行一个字符串。表示要查询的图书记录。 输出: 输出为m行,如果被查的记录存在,则输出"YES",如果不存在则输出"NO"。 3.测试数据 输入: 4 a ans and hellocpp 9 a b an as ans

and ande hellocbb hellocpp 输出: YES NO NO NO YES YES NO NO YES 三、概要设计 抽象数据类型 class Node//最基本的抽象数据类型 { public: char ch[20];//链表中,记录表中数据,20为查找字符串的长度 Node* next;//指向下一个结点 Node(const char* in);//构造函数 }; class List{ //用Node作结点的链表 public: Node* head; Node* tail; Node* fence; List(); ~List(); bool append(const char* in);//像链表中,增添结点 }; class Hash//哈希表的详细设计 { private:

数据结构课设 通讯录系统的设计与实现 哈希表

课程设计(论文)任务书 软件学院学院软件工程专业班 一、课程设计(论文)题目:通讯录管理系统的设计与实现——哈希表 二、课程设计(论文)工作自2016 年 1 月 4 日起至 2016 年 1 月 10 日止 三、课程设计(论文) 地点: 软件测试中心(北区测试二室) 四、课程设计(论文)内容要求: 1.本课程设计的目的 ⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合课程的理论知识,编写程序求解指定问题; ⑵初步掌握软件开发过程的问题分析、系统设计、编码、测试等基本方法和技能; ⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。 2.课程设计的任务及要求 1)基本要求: ⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告; ⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率; ⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; ⑷每位同学需提交可独立运行的程序和规范的课程设计报告。 2)课程设计论文编写要求 ⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订; ⑵课程设计报告包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等; ⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。 3)课程设计评分标准: ⑴学习态度:10分; ⑵系统设计:20分; ⑶编程调试:20分; ⑷回答问题:20分; ⑸论文撰写:30分。

相关文档
最新文档