哈希表设计-数据结构课程设计
- 格式:docx
- 大小:201.56 KB
- 文档页数:8
数据结构哈希表设计第一章引言哈希表是一种常用的数据结构,它可以将任意大小的数据映射到固定大小的表中。
通过这种映射关系,我们可以快速地查找、插入、删除数据。
本文将介绍哈希表的设计原理和实现方法。
第二章基本概念1.哈希函数:________哈希函数是将任意大小的数据映射到固定大小的表中的函数。
它的作用是将数据转换为一个整数,作为表中的索引。
一个好的哈希函数应该能够将不同的数据映射到不同的索引上,从而减少冲突的概率。
2.冲突解决:________由于哈希函数的映射是有限的,不同的数据可能被映射到同一个索引上,这就产生了冲突。
冲突解决方法有很多种,常见的有开放地质法和链地质法。
第三章设计原则1.散列均匀性:________好的哈希函数应该能够将数据均匀地分布在表中,减少冲突的概率。
2.内存利用率:________为了提高内存利用率,我们需要根据需求确定表的大小。
表的大小应该尽可能大,但同时又不能太大,否则会浪费内存。
3.冲突解决策略:________选择适当的冲突解决策略可以提高哈希表的性能。
常见的冲突解决策略有线性探测、二次探测和链地质法等。
第四章设计细节1.哈希函数的选择:________选择合适的哈希函数可以减少冲突的概率。
常见的哈希函数有除留余数法和乘法哈希法等。
2.冲突解决方法的选择:________针对不同的应用场景,选择适合的冲突解决方法。
例如,对于开放地质法,可以选择线性探测、二次探测或者双重散列等。
3.动态扩容:________当表的负载因子超过一定阈值时,需要进行动态扩容。
扩容的过程涉及重新计算哈希函数和重新插入数据等操作。
第五章示例代码```pythonclass HashTable:________def __init__(self):________self.size = 10self.table = for _ in range(self.size)def _hash_function(self, key):________哈希函数的具体实现hash_value = 0for char in key:________hash_value += ord(char)return hash_value % self.sizedef insert(self, key, value):________index = self._hash_function(key)self.tableindex.append((key, value)) def get(self, key):________index = self._hash_function(key)for k, v in self.tableindex:________ if k == key:________return vreturn Nonedef remove(self, key):________index = self._hash_function(key)for i, (k, v) in enumerate(self.tableindex):________if k == key:________del self.tableindexireturn Truereturn False```第六章附件本文档无附件。
数据结构哈希表设计数据结构哈希表设计⒈简介哈希表是一种常见的数据结构,用于存储和查找数据。
它基于哈希函数将键映射到一个固定大小的数组索引。
在本文档中,我们将详细介绍哈希表的设计、实现和使用。
⒉哈希函数设计哈希函数是哈希表的核心,它将键转换成对应的数组索引。
以下是一些常见的哈希函数设计方法:●直接定址法:使用键的某个属性作为数组索引,例如将键的ASCII码值作为数组索引。
●除留余数法:将键除以某个数并取余,得到的余数作为数组索引。
●平方取中法:将键的平方值的中间几位数作为数组索引。
●折叠法:将键分成几个部分,然后将这些部分进行叠加或者异或操作,得到的结果作为数组索引。
⒊哈希表实现哈希表实际上是一个数组,数组的每个元素称为桶(bucket)每个桶可以存储一个键值对,或者一个链表/数组用于解决哈希冲突。
以下是哈希表的基本操作:●插入(Insert):根据键的哈希值找到对应的桶,插入键值对。
●查找(Search):根据键的哈希值找到对应的桶,查找键对应的值。
●删除(Delete):根据键的哈希值找到对应的桶,删除键值对。
⒋哈希冲突解决哈希函数的设计不能保证每个键都映射到不同的索引,因此可能会出现哈希冲突。
常见的解决哈希冲突的方法有以下几种:●链地质法:每个桶存储一个链表或者数组,具有相同哈希值的键值对存储在同一个桶中。
●开放地质法:当发生冲突时,继续探测数组中的下一个位置,直到找到一个空闲位置来存储键值对。
●再哈希法:使用多个哈希函数,当发生冲突时,使用下一个哈希函数来计算下一个索引。
⒌哈希表性能分析哈希表的性能与哈希函数的设计和冲突解决方法有关。
以下是一些常见的性能指标:●负载因子(Load Factor):表示哈希表中已经存储的键值对数量与桶的总数量之比。
负载因子越大,哈希冲突的可能性越高。
●查找时间复杂度:理想情况下,哈希表的查找时间复杂度为O(1)但在发生哈希冲突时,可能需要遍历链表或者进行探测,导致查找时间复杂度增加。
一.问题描述职工的姓名通过哈希表建表,基于哈希表的查找,建立一个简单的职工管理系统。
可以利用自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
对将班上同学看做职工进行管理,包括插入、删除、查找、排序等功能。
二.基本要求假设人名为中国姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构照,用链表法处理冲突。
职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。
(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。
(2)删除一名职工:从职工管理文件中删除一名职工对象。
(3)查询:从职工管理文件中查询符合某些条件的职工。
(4)修改:检索某个职工对象,对其某些属性进行修改。
(5)排序:按某种需要对职工对象文件进行排序。
三.数据结构的设计哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。
也就是说,它通过把关键码值映射到表中一个位置来访问记录,加快查找的速度。
这个映射函数叫做散列函数,存放记录的数组叫做哈希表。
1.哈希表的构造方法多种多样,实际工作中需视不同的情况采用不同的哈希函数,经常在构建一个哈希表选择构造方法时需要考虑的因素有:计算哈希函数所需时间、关键字的长度、哈希表的大小、关键字的分布情况、记录的查找频率等。
本次题目要求采用除留余数法构造哈希函数,一般方法如下:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。
即 H(key) = key MOD p,p<=m不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。
对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。
由于职工主要以姓名为标志,于是将职工姓名的汉语拼音所对应的ASCII码进行相加,所得到的和作为关键字;取p等于表长30,则关键字除以30以后所得到的余数便是哈希地址。
数据结构课程设计哈希表实验报告数据结构课程设计哈希表实验报告福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级: xxxxxx班座号: xxxxxxxxxxxx姓名: xxxxxxx12 月 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)姓名的折叠处理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) //冲突处理函数,采用二次探测再散列法解决冲突{。
洛阳理工学院课程设计说明书课程名称数据结构设计课题哈希表的设计与实现专业班级学号姓名完成日期 2课程设计任务书设计题目:哈希表的设计与实现设计内容与要求:设计哈希表实现电话号码查询系统。
[基本要求]1、设每个记录有下列数据项:电话号码、用户名、地址;2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;3、采用再哈希法解决冲突;4、查找并显示给定电话号码的记录;5、查找并显示给定用户名的记录。
6、在哈希函数确定的前提下,考察平均查找长度的变化。
指导教师:2014 年课程设计评语成绩:指导教师:年月日【问题描述】如何设计一个结构体数组使该数组中每个元素包含电话号码、用户名、地址。
如何分别以电话号码和用户名为关键字建立哈希表。
如何利用线性探测再散列法解决冲突。
如何实现用哈希法查找并显示给定电话号码的记录。
如何查找并显示给定用户的记录。
手工计算查找不成功的平均查找长度。
【基本要求】设计哈希表实现电话号码查询系统。
设计程序完成以下要求:(1)、设每个记录有下列数据项:电话号码、用户名、地址;(2)、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)、采用再哈希法解决冲突(4)、查找并显示给定电话号码的记录;(5)、查找并显示给定用户的记录。
(6)、在哈希函数确定的前提下,考察平均查找长度的变化。
【测试数据】1.用户名:weiguo,号码:123,地址:gansu2.用户名:zhangkui,号码:321,地址:shanxi【算法思想】进入主函数,用户输入1:输入哈希表元素,然后再选择2或者3按照用户名或者电话号码散列,在这下面又有分支语句选择解决冲突的办法,用线性探测再散列还是再哈希法。
生成哈希表之后,选择查找操作3分别以用户名和电话号码为关键字进行查找。
最后,输出查找不成功的平均查找长度。
在本程序当中用了两种解决冲突的办法,分别是线性探测再散列和再哈希法。
哈希函数构造方法是,除留余数法。
数据结构课程设计报告一、需求分析1问题描述:根据需要设计出合理的函数,并由此建立相应的表。
要求:1)每个电话用户信息包括(姓名,电话,住址)信息。
2)可以使用姓名与地址查找相应的用户信息。
3)使用表实现。
使用开放定址法解决冲突。
2 基本要求:1)记录每个用户的姓名、地址和电话。
2)从键盘输入,以姓名和地址为关键字分别建立表。
3)用开放地址法解决冲突。
4)分别按姓名和地址查找并显示电话号码。
二、概要设计三、详细设计定义结构表{定义表内的所有成员}[];( x[])关键字转换为数值{求字符数组x每个字符对应的值的绝对值之和,并返回最后结果}( )创建表{创建表,并初始化它}( d) 按姓名插入{以姓名为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。
若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。
}( d)按地址插入{以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。
若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。
}( )表插入{输入用户姓名、地址和电话,分别调用按姓名插入和按地址插入函数进行插入。
重复上面的步骤,直到你不想继续或空间已满。
}( )按姓名查找{输入你想要查询的姓名,对它进行转换,再查找。
若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。
若还有冲突重复上一步。
当所有空间都查过一遍,发现没有找到,则输出“不存在”。
若该位置空,则输出“不存在”。
若查找到,则输出电话号码。
}( )按地址查找{输入你想要查询的地址,对它进行转换,再查找。
若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。
成绩南京工程学院课程设计说明书(论文)题目哈希表的设计与性能分析课程名称数据结构院(系、部、中心)通信工程学院专业信息工程班级 K信息091学生姓名翟珂学号 240092610设计地点信息楼C213指导教师吴海涛设计起止时间:2011年8月29日至2011年9 月9 日目录1.功能描述(或设计目标)2.总体设计(或概要设计)2.1数据结构描述与定义2.2模块设计3.测试结果与分析 (8)4.课程设计总结 (9)参考文献: (10)附录: (11)1.功能描述(或设计目标)哈希表的设计与性能分析要求:(1)数据结构的定义(2)哈希表中,哈希函数构造方法多种多样,同时对于同一哈希函数解决冲突的方法也可以不同。
两者是影响查询算法性能的关键因素。
对于几种典型的哈希函数构造方法,做实验观察,不同的解决冲突方法对查询性能的影响(平均查找长度). 处理冲突的实际含义是:为产生冲突的地址寻找下一个哈希地址。
(1)开放定址法 为产生冲突的地址H(key)求得一个地址序列: H0, H1, H2, …, Hs 1≤s≤m-1 其中:H0 = H(key) Hi = ( H(key) + di ) MOD m i=1, 2, …,s(2)链地址法 将所有哈希地址相同的记录都链接在同一链表中。
线性探测容易产生二次聚集,链地址肯定不会产生二次聚集。
一次聚集的产生主要取决于哈希函数,在哈希函数均匀的前提下,可以认为没有一次聚集。
2.总体设计(或概要设计)第 3 页共18 页2.1数据结构描述与定义除数余留法#define hashlen 11 //哈希表长Int h[hashlen]={0}; //初始哈希表int status[hashlen]={0}; //状态数组用链地址法数据结构定义:typedef struct employee{int key_code;struct employee *next;}Employee;typedef struct hashtable{int key;struct employee *next;}HashTable[MAX];2.2模块设计系统共分几个模块,每个模块的算法描述及流程图(核心模块)除数余留法:Hash_Create:第 5 页共18 页Hash_Serach:链地址法:Hash_Create::Hash_Serach:3.测试结果与分析:第9 页共18 页4.课程设计总结为期4天的数据结构课程设计结束了,时间真的很快,觉得自己这次真的获得了很多。
数据结构哈希表设计1.引言哈希表(Hash Table)是一种常用的数据结构,用于快速存储和检索数据。
它通过将键(Key)映射到值(Value)来实现高效的数据存储和查找。
本文将介绍哈希表的设计原理和实现方法,以及一些常见的应用场景。
2.哈希函数的选择哈希函数是实现哈希表的关键,它将键映射到哈希值。
一个好的哈希函数应当具有以下特点:●均匀性:对于任意的输入,哈希函数应该能够将其均匀地映射到哈希表的各个位置,避免产生过多的冲突。
●高效性:哈希函数应当能够在常数时间内计算出哈希值,避免影响哈希表的性能。
●低冲突性:哈希函数应当能够尽可能少的冲突,即不同的键经过哈希函数计算得到相同的哈希值的概率应当很低。
3.冲突解决方法由于哈希函数的有限性,不同的键可能会产生相同的哈希值,这种情况称为冲突。
常见的冲突解决方法有以下几种:●链地质法(Chning):将哈希表的每个位置引入链表,当多个键映射到相同的位置时,将它们存储在链表中。
●开放寻址法(Open Addressing):当发生冲突时,通过一定的方法在哈希表中寻找下一个可用的位置,直到找到一个空位置或者遍历完整个哈希表。
●再哈希法(Rehashing):当发生冲突时,通过应用另一个哈希函数来计算出一个新的哈希值,以此来解决冲突。
4.哈希表的操作哈希表支持以下几种操作:●插入(Insert):将一个键值对插入到哈希表中。
●删除(Delete):从哈希表中删除指定的键值对。
●查找(Search):根据给定的键,在哈希表中查找对应的值。
●更新(Update):根据给定的键,更新哈希表中对应的值。
5.哈希表的应用哈希表广泛应用于各种场景,例如:●缓存:哈希表可以用于实现高效的缓存系统,根据请求的键值对快速查找到对应的数据。
●字典:哈希表可以被用作实现字典,将单词与其定义相关联。
●数据库索引:哈希表可以用于构建数据库的索引,提高数据的检索性能。
6.总结哈希表是一种高效的数据结构,通过将键映射到值来实现快速的数据存储和检索。
数据结构哈希表设计数据结构哈希表设计一、概述哈希表是一种在计算机科学中广泛应用的数据结构,它通过将关键字映射到哈希表中的位置来实现快速的查找、插入和删除操作。
本文将详细介绍哈希表的设计原理、实现方法和常见应用场景。
二、设计原理1、哈希函数的选择哈希函数是哈希表的关键,它将关键字映射到哈希表中的位置。
一个好的哈希函数能够尽可能地将关键字均匀地分布在哈希表中,减少冲突。
2、冲突解决方法由于哈希函数的输出值的范围通常远小于关键字的范围,不可避免地会出现冲突。
冲突解决方法主要有开放定址法、链地质法和再哈希法。
3、动态扩容在使用哈希表的过程中,可能会发生数据增加的情况。
为了保持哈希表的性能,需要进行动态扩容,重新计算哈希函数,并将原有数据重新散列。
三、实现方法1、哈希表的数据结构哈希表通常由一个数组和一个哈希函数组成。
数组的大小为哈希表的容量,每个位置存储一个链表或其他数据结构。
2、哈希函数的实现哈希函数的实现可以基于关键字的特征进行设计,例如,对于字符串关键字,可以使用字符的ASCII码值的和或乘积作为哈希函数。
3、冲突解决方法的实现- 开放定址法:当发生冲突时,依次查找下一个空位置,并将数据插入其中。
- 链地质法:每个位置存储一个链表,发生冲突时,将数据插入到链表的末尾。
- 再哈希法:使用不同的哈希函数重新计算哈希值,直到找到一个空位置。
四、常见应用场景1、数据库索引哈希表可以用于实现数据库的索引功能,快速定位到存储的数据。
2、缓存实现哈希表可以作为缓存系统的核心数据结构,用于存储缓存的键值对。
3、字典实现哈希表可以用于实现字典,将单词作为键进行存储和查询。
附件:无附件。
法律名词及注释:1、哈希表:是一种数据结构,它通过哈希函数将关键字映射到哈希表中的位置,实现快速的查找、插入和删除操作。
2、关键字:在哈希表中与数据相关联的标识符或键。
关键字是哈希函数的输入。
3、哈希函数:将关键字映射到哈希表中位置的函数。
数学与计算机学院课程设计说明书课程名称: 数据结构-课程设计课程代码: 8404181题目:哈希表的设计与实现年级/专业/班: 2009级软件工程3班学生姓名:张加发学号:312009*********开始时间:2011 年06 月20 日完成时间:2011 年06 月29 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书撰写质量(45)总分(100)指导教师签名: 年月日数据结构课程设计任务书学院名称: 数学与计算机学院课程代码:8404181专业:软件工程年级:2009级一、设计题目哈希表的设计与实现二、主要内容设计哈希表实现电话号码查找系统,要求如下:1)设每个记录有下列数据项:电话号码、用户名、地址;2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表(要求设计两种以上不同的散列函数);3)采用两种以上的方法解决冲突;4)查找并显示给定电话号码的记录;5)查找并显示给定用户名的记录。
三、具体要求及应提交的材料1.每个同学以自己的学号和姓名建一个文件夹,如:“312009*********张三”。
里面应包括:学生按照课程设计的具体要求所开发的所有源程序(应该放到一个文件夹中)、任务书和课程设计说明书的电子文档。
2.打印的课程设计说明书(注意:在封面后夹入打印的“任务书”以后再装订)。
四、主要技术路线提示法、除留余数法等,解决冲突的方法也较多,常用:开放定址法、链地址法等。
五、进度安排共计两周时间,建议进度安排如下:选题,应该在上机实验之前完成需求分析、概要设计可分配4学时完成详细设计可分配4学时调试和分析可分配10学时.2学时的机动,可用于答辩及按教师要求修改课程设计说明书。
注:只用课内上机时间一般不能完成设计任务,所以需要学生自行安排时间做补充.六、推荐参考资料[1]苏仕华等编著,数据结构课程设计,机械工业出版社,2007[2]严蔚敏等编著,数据结构(C语言版),清华大学出版社,2003[3]严蔚敏等编著,数据结构题集(C语言版),清华大学出版社,2003指导教师签名日期年月日系主任审核日期年月日摘要分析了对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的应用,对现实复杂问题的分析建模和解决方法!分析了针对系统的需求所要执行的解决方法的可行性,正确性.完成系统前需要进行问题描述、系统分析、设计建模、代码实现、调试修改,结果分析。
数据结构哈希表设计在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问、操作和管理数据。
哈希表(Hash Table)作为一种重要的数据结构,在许多应用中都发挥着关键作用。
它以其高效的查找、插入和删除操作,成为了处理大量数据时的得力工具。
那么,什么是哈希表呢?简单来说,哈希表是一种根据关键码值(Key)而直接进行访问的数据结构。
通过一个哈希函数(Hash Function),将关键码映射到表中的一个位置来访问记录,以加快查找的速度。
要设计一个有效的哈希表,首先需要考虑的是哈希函数的选择。
一个好的哈希函数应该尽可能地将不同的关键码值均匀地分布在哈希表的存储空间中,以减少冲突的发生。
常见的哈希函数设计方法包括直接定址法、数字分析法、平方取中法、折叠法、除留余数法等。
以除留余数法为例,假设我们要存储的关键码值是整数,哈希表的长度为 m,那么哈希函数可以设计为 h(key) = key % m 。
也就是说,用关键码值除以 m 取余数,得到的结果就是在哈希表中的存储位置。
然而,即使选择了一个较好的哈希函数,冲突仍然可能会发生。
这是因为哈希函数将一个无限的关键码值集合映射到一个有限的存储空间中,必然会存在多个关键码值被映射到相同位置的情况。
当发生冲突时,就需要采用合适的冲突解决方法。
常见的冲突解决方法有开放定址法和链地址法。
开放定址法是指当发生冲突时,按照某种探查方式在哈希表中寻找下一个空闲的位置来存储冲突的元素。
常见的探查方法有线性探查、二次探查和双重探查等。
链地址法则是将所有哈希地址相同的元素构成一个单链表,并将单链表的头指针存储在哈希表的对应位置。
当查找元素时,首先通过哈希函数计算出哈希地址,然后在对应的单链表中进行查找。
在实际设计哈希表时,还需要考虑哈希表的装填因子(Load Factor)。
装填因子是指哈希表中已存储的元素个数与哈希表的长度之比。
装填因子越大,冲突发生的可能性就越高;装填因子越小,虽然冲突减少,但会浪费更多的存储空间。
课程设计课程名称:数据结构课程设计专业班级:学生姓名:学号:指导教师:课程设计时间:地点:专业课程设计任务书学生姓名专业班级学号题目哈希表的设计课题性质 A.工程设计课题来源 D.自拟课题指导教师同组姓名无主要内容针对某个集体(比如你所在是班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查找程序。
如果随机函数自行构造,则应首先调整好随机函数,使其分布均匀。
人名的长度均不超过19个字符。
字符的取码方法可直接利用C语言中的toascii函数,并可对过长的人名先做折叠处理。
1假设人名为中国人姓名的汉语拼音形式。
2待填入哈希表的人名共有30个,取平均查找长度的上限为2。
3哈希函数用除留余数法构造,用伪随机探测再散列发处理冲突。
任务要求1、研究与应用哈希表2、分析算法的运行效率3.具有良好的运行界面4.算法具有良好的健壮性5.按要求撰写课程设计报告和设计总结。
参考文献1.《C程序设计(第二版)》,谭浩强,北京,清华大学出版社,1999. 2.《Visual C++实用教程(第一版)》,张荣梅、梁晓林,冶金工业出版社,2004.3.《数据结构(C语言版)》,严蔚敏,吴伟民,清华大学出版社,审查意见指导教师签字:教研室主任签字: 2011年12 月10日说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页1 需求分析1、问题描述:针对某个集体(比如你所在的班级)中的人名设计一个哈希表,使得平均查找长度不超过 R,完成相应的建表和查表程序;2、人名为中国人姓名的汉语拼音,人名有 30 个,平均查找长度的上限为 2;3、用伪随机探测再散列法处理冲突;4、输入为所要查询的人姓名(拼音);输出为该关键字的查找信息;2 概要设计算法思想:定义:2.1.1 定义:哈希表是为了便于快速搜索而组织的键/值组合的集合。
Hash Table 是一种数组,可以用任意简单变量值来访问其元素,这种数组叫哈希表。
目录1 前言 (1)2 需求分析 (1)2.1 任务和要求 (1)2.2 运行环境 (1)2.3 开发工具 (2)3 分析和设计 (2)3.1 系统分析及设计思路 (2)3.2 主要数据结构及算法 (2)3.3 函数流程图 (3)4 具体代码实现 (6)5 课程设计总结 (15)5.1 程序运行结果或预期运行结果 (15)5.2 设计结论 (17)参考文献 (17)致 (17)1 前言从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。
在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C语言基本相同。
学习、掌握C语言是每一个计算机技术人员的基本功之一。
根据本次课程设计的要求,我设计小组将编写一个C语言程序来处理哈希表问题,通过这个程序,将针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
2 需求分析2.1 任务和要求针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
要求:假设人名为中国的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用链表法处理冲突。
2.2 运行环境(1)WINDOWS2000/XP系统(2)Visual C++ 6.0编译环境或TC编译环境2.3 开发工具C语言3 分析和设计3.1 系统分析及设计思路(1)创建哈希表(2)(结构体数组)初始化(1)用除留余数法构建哈希函数(2)用链表法处理冲突(3)查找哈希表在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度(4) 显示哈希表显示哈希表的的格式:3.2 主要数据结构及算法定义结构体typedef struct hashtable创建哈希表定义函数Hash_Init(HashTable ht)来对哈希表初始化定义函数Hash_Insert(HashTable ht, Node *node)来为哈希表分配地址定义函数Hash_Init(ht)输入30个名字定义函数Hash_Create(HashTable ht)来求哈希表长度定义函数hash_output(HashTable h)来输出哈希表定义函数Hash_Link()构造链表函数定义函数int hash_search(int h[],int key)查找输入的名字3.3 函数流程图(1)哈希表的创建及初始化流程图图3.1 哈希表的创造及初始化流程图(2)创建哈希表链表的流程图图3.2 创造哈希表链表的流程图(3)查找输入数据的流程图图3.3 查找输入数据的流程图4 具体代码实现#include <stdio.h>#include <string.h>#include <stdlib.h>#include <conio.h>#define P 30 /*除数余留法中的除数*/#define NULLKEY 0#define MAX 30 /*人名个数*/#define hashlen 30 /*哈希表长度*/int sum=0,k=0;typedef struct Node /*哈希表结构体*/{char key_code[10]; /*哈希表地址*/struct Node *next;}Node;typedef struct hashtable /*创建哈希表*/{int key;struct Node *next;}HashTable[MAX];int Hash(int key){int mode = key % P; /*除留余数法得到的余数*/return mode;}void Hash_Init(HashTable ht) /*哈希表初始化*/ {int i;for(i = 0; i < MAX; i++){ht[i].key = NULLKEY;ht[i].next = NULL;}}int CharToInt(char str[]){return str[0]+str[1]+str[2];}int Hash_Insert(HashTable ht, Node *node) /*为哈希表分配地址*/ {int key = Hash(CharToInt(node->key_code));Node *p;p=(Node*)malloc(sizeof(Node));if(ht[key].key == NULLKEY){ht[key].key = key;ht[key].next = node;k++;}else if(ht[key].key == key){p = ht[key].next;k++;while(p->next!= NULL){p = p->next;k++;}p->next = node;k++;}return 1;}Node* Hash_Search(HashTable ht, int key) /*查找函数*/ {int p0 = Hash(key);if(ht[p0].key == NULLKEY){sum++;return NULL;}else if(ht[p0].key == p0){Node *p = ht[p0].next;while(p != NULL){if(CharToInt(p->key_code) == key){ sum++;return p;}p = p->next;sum++;}}return NULL;}int Hash_Create(HashTable ht) /*哈希表长度*/{int i;Node *node;Hash_Init(ht);printf("请输入:"); /*输入30个*/for(i=0;i<30;i++){node = (Node *)malloc(sizeof(Node));scanf("%s",node->key_code);node->next = NULL;Hash_Insert(ht, node);}printf("\nCreate Successfully!\n");return 1;}int hash_output(HashTable h) /*哈希表的输出部分*/ {Node *a;int i,j,count2=0;a=(Node*)malloc(sizeof(Node));j=0;for(i=0;i<hashlen;i++){printf("%4d",i);printf("%4d",h[i].key);if(h[i].next!=0)count2++;j=1;a=h[i].next;while(a){printf("->%s",(*a).key_code);a=(*a).next;j++;count2+=j;}printf("\n");}return count2;}void Hash_Link() /*链表法构造函数*/ {int key;int i;Node *node;HashTable ht;Hash_Create(ht);hash_output( ht);printf("count=%d\n",k); /*查找总长度*/printf("ASL=%d/8\n",k); /*平均查找长度*/ printf("请输入要查找的数据:"); /*输入查找的*/scanf("%s",&key);node = Hash_Search(ht, key);printf("查找次数:%d\n",sum);if(node != NULL)printf("查找成功!");elseprintf("查找不成功!");}void hash_create(int h[],int status[],int data){int address;int di;address=data%P;if(status[address]==0){h[address]=data;status[address]=1;}else{for(di=1;di<=hashlen-1;di++){address=((data%P)+di)%hashlen;if(status[address]==0){h[address]=data;status[address]=1;break;}}}return ;}int hash_search(int h[],int key){ int address, di;address=key % P;if(h[address]==key) /*哈希表中元素与查找元素是否相等*/ return 1;else{for(di=1;di<=hashlen-1;di++)/*哈希表中元素与查找元素不相等,查找下一元素*/{address=((key%P)+di)%hashlen;if(h[address]==key){return di+1;break;}}}if(di>=hashlen)return 0;}int main() /*主函数*/ {printf("\t\t\t************************\n"); printf("\t\t\t 哈希表设计\n");printf("\n");printf("\t\t\t************************\n"); printf("\n");Hash_Link();}5 课程设计总结5.1 程序运行结果或预期运行结果图5.1程序运行结果1图5.2程序运行结果2说明:输入的数为30个姓的拼音,查找的为“pan”,输出的如上图所示。
课程名称:数据结构XXXXXXXX本科学生课程设计(论文)题目哈希表的设计与实现姓名 XXX学号 XXXXXXXXXXXX学部计算机科学与技术专业、年级计算机科学与技术大二指导教师 XX2010 年 11月 28日摘要随着信息技术的发展,关于各种程序中的数据结构也是层出不穷,对于项目某一方面的计算或者是某一方面的研究,出现了专门的数据结构,哈希表就是其中之一,哈希表作为另类的一种数据结构,其作用也是区别于其它同类的数据结构的,它是由两部分组成的:键(key)和值,通过键可以迅速的查找到你需要的值。
常见的构造哈希函数的方法有直接定址法除留余数法平方取中法数字分析法等。
一般创建哈希表时可能会出现很多的冲突,常用的处理冲突的方法为开放定址法再哈希法链地址法建立一个公共溢出区。
关键词: 数据结构;哈希表;键(key);目录第1章前言与系统实现 ____________________________________________ 4 1.1前言__________________________________________________________ 4 1.2系统实现______________________________________________________ 51.2.1 开发环境_________________________________________________ 51.2.2 Visual C++环境的安装_____________________________________ 5 第2章系统功能分析_______________________________________________ 6 2.1 系统功能需求分析 ____________________________________________ 6 2.2 任务定义 ____________________________________________________ 6 第3章总体设计___________________________________________________ 7 3.1系统数据结构__________________________________________________ 7 3.2主要算法流程图________________________________________________ 83.2.1 以姓名为关键字的CreateHashList()函数流程图________________ 83.2.2 哈希表查找算法流程图______________________________________ 93.2.3主程序流程图_____________________________________________ 10 第4章详细设计和编码____________________________________________ 114.1节点的建立___________________________________________________ 11 4.2 对哈希函数的定义 ___________________________________________ 11 4.3 创建哈希表算法、代码如下所示: ________________________________ 124.3.1 算法_____________________________________________________ 124.3.2代码_____________________________________________________ 12 4.4哈希查找_____________________________________________________ 13 4.5显示哈希表___________________________________________________ 16 4.6主菜单设计___________________________________________________ 18 4.7 主函数设计 __________________________________________________ 18 第5章程序运行测试_______________________________________________ 215.1程序主界面___________________________________________________ 21 5.2哈希表初始化_________________________________________________ 21 5.3按姓名查找记录_______________________________________________ 23 5.4显示哈希表全部记录___________________________________________ 24 总结______________________________________________________________ 25 参考文献__________________________________________________________ 26第1章前言与系统实现1.1前言在信息化时代的今天,计算机技术已经是发展到一个很可观的地步了,特别是面向窗口的操作系统的出现,使得程序设计更加的容易了。
数据结构课程设计hash一、课程目标知识目标:1. 理解哈希表的基本概念,掌握哈希表的构建、插入、删除等操作方法;2. 了解哈希冲突的类型及解决方法,掌握线性探查法、链地址法等常见解决策略;3. 掌握哈希表的平均查找长度及其计算方法,了解影响哈希表性能的因素。
技能目标:1. 能够运用哈希表解决实际问题,如查找、统计等;2. 能够编写简单的哈希表程序,实现基本操作,并进行性能分析;3. 能够分析哈希表在不同应用场景下的优缺点,选择合适的哈希策略。
情感态度价值观目标:1. 培养学生主动探索、积极思考的学习态度,增强对数据结构知识的好奇心和求知欲;2. 培养学生的团队合作意识,学会在团队中分工协作,共同解决问题;3. 引导学生认识到数据结构在实际应用中的价值,激发学生将所学知识应用于实际问题的兴趣。
分析课程性质、学生特点和教学要求:1. 本课程为高中信息技术学科的数据结构部分,旨在让学生掌握哈希表的基本知识和应用;2. 学生已具备一定的编程基础和逻辑思维能力,对数据结构有一定了解;3. 教学要求注重理论与实践相结合,强调学生的动手实践能力和问题解决能力的培养。
二、教学内容1. 哈希表的基本概念与性质- 哈希表的定义、作用及适用场景;- 哈希表的存储结构及关键术语介绍;- 哈希表的平均查找长度、时间复杂度分析。
2. 哈希函数的构造方法- 直接定址法、数字分析法、平方取中法等常见哈希函数构造方法;- 哈希函数的评估标准:均匀性、冲突率、计算复杂度等。
3. 哈希冲突的解决策略- 线性探查法、二次探查法、链地址法等解决策略;- 各类解决策略的优缺点及适用场景。
4. 哈希表的构建与操作- 哈希表的初始化、插入、删除、查找等基本操作;- 哈希表操作程序的编写与性能分析。
5. 哈希表的应用实例- 案例分析:单词统计、查找重复元素等;- 学生实践:设计并实现一个简单的哈希表程序。
教学内容安排与进度:第一课时:哈希表基本概念与性质、哈希函数构造方法;第二课时:哈希冲突解决策略、哈希表构建与操作;第三课时:哈希表应用实例分析、学生实践。
目录课程设计任务书 01.问题描述 (2)1.1问题描述 (2)1.2基本要求 (2)1.3测试数据 (2)2.实现分析 (2)3.程序设计 (3)3.1存储结构设计 (3)3.2主要算法设计 (3)3.2.1程序主要函数原型及功能 (3)3.2.2各函数的实现 (4)3.2.3函数模块 (8)3.2.4程序流程图 (8)4.调试报告 (10)4.1调试中的问题 (10)4.2对设计和编码的讨论和分析 (10)5. 程序运行结果 (10)6.经验和体会 (12)6.1感受和体会 (12)6.2对算法改进的想法 (14)7.哈希表和源程序 (14)7.1哈希表 (14)7.2源程序 (15)本科生课程设计成绩评定表 (19)课程设计任务书学生姓名:专业班级:班指导教师:工作单位:计算机科学系题目: 哈希表设计初始条件:针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
假设人名为中国人姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用伪随机探测再散列发处理冲突。
测试用例见题集p166。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。
2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:1、第19周完成。
2、7月1 日14:00到计算中心检查程序、交课程设计报告、源程序(CD盘)。
学号:************课程设计题目哈希表及其应用教学院计算机学院专业09网络工程班级09网络工程(1)班姓名吴浪指导教师刘志远年月日课程设计任务书2010 ~2010 学年第 1 学期学生姓名:吴浪专业班级: 09网络工程指导教师刘志远工作部门:计算机学院一、课程设计题目哈希表及其应用二、课程设计内容建立一个小型信息管理系统(可以是图书、人事、学生、物资、商品等任何信息管理系统)。
要求:1.使用哈希查找表存储信息;2.实现查找、插入、删除、统计、输出等功能;三、进度安排1.初步完成总体设计,搭好框架;2.完成最低要求:尝试使用多种哈希函数和冲突解决方法,并通过实际运行测试给出自己的评价四、基本要求1.界面友好,函数功能要划分好2.程序要加必要的注释3.要提供程序测试方案教研室主任签名:年月日1 概述 (4)2 设计目的 (4)3 设计功能说明 (4)4 详细设计说明 (5)5 流程图 (5)6 程序代码 (6)7 程序运行结果 (15)8 总结 (19)参考文献 (19)成绩评定表 (20)数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁,只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。
通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实际动手能力。
为学生后继课程的学习打下良好的基础。
2 设计目的《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。
因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。
通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。
促使学生养成良好的编程习惯。
1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。
2.培养学生综合运用所学知识独立完成程序课题的能力。
实习6、哈希表设计一、需求分析1. 问题描述针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。
2. 基本要求假设人名为中国人姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。
3. 测试数据取读者周围较熟悉的30个人的姓名。
4. 实现提示如果随机数自行构造,则应首先调整好随机函数,使其分布均匀。
人名的长度均不超过19个字符(最长的人名如:庄双双(Zhuang Shuangshuang))。
字符的取码方法可直接利用C语言中的toascii函数,并可先对过长的人名先作折叠处理。
二、概要设计ADT Hash {数据对象D:D是具有相同特征的数据元素的集合。
各数据元素均含有类型相同,可唯一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。
InitNameTable()操作结果:初始化姓名表。
CreateHashTable()操作结果:建立哈希表。
DisplayNameTable()操作结果:显示姓名表。
DisplayHashTable()操作结果:显示哈希表。
FindName()操作结果:查找姓名。
}ADT Hash三、详细设计(源代码)(使用C语言)#include<stdio.h>#include<time.h>//time用到的头文件#include<stdlib.h>//随机数用到的头文件#include<ctype.h>//toascii()用到的头文件#include<string.h>//查找姓名时比较用的头文件#define HASH_LEN 50//哈希表的长度#define P 47//小于哈希表长度的P#define NAME_LEN 30//姓名表的长度typedef struct{//姓名表char *py; //名字的拼音int m; //拼音所对应的}NAME;NAME NameTable[HASH_LEN]; //全局定义姓名表typedef struct{//哈希表char *py; //名字的拼音int m; //拼音所对应的ASCII总和int si; //查找长度}HASH;HASH HashTable[HASH_LEN]; //全局定义哈希表int d[30],i,j; //全局定义随机数,循环用的i、jvoid InitNameTable(){//姓名表的初始化NameTable[0].py="caowukui";NameTable[1].py="langzhijie";NameTable[2].py="dongshuliang";NameTable[3].py="qiuhouyang";NameTable[4].py="zhangxu";NameTable[5].py="duhuan";NameTable[6].py="fanqing";NameTable[7].py="songxiaofei";NameTable[8].py="dutongtong";NameTable[9].py="sunhaohao";NameTable[10].py="shanjianfeng";NameTable[11].py="wangbaoshan";NameTable[12].py="houfeng";NameTable[13].py="hujiaming";NameTable[14].py="jiangkaiqiang";NameTable[15].py="xuyang";NameTable[16].py="lvdelu";NameTable[17].py="shenjinfeng";NameTable[18].py="xuhui";NameTable[19].py="hanle";NameTable[20].py="xunwenwen";NameTable[21].py="chenhongcong";NameTable[22].py="zhangyanyan";NameTable[23].py="nieyanshun";NameTable[24].py="haopengcheng";NameTable[25].py="yuhaiyuan";NameTable[26].py="shuxiang";NameTable[27].py="sunyingjie";NameTable[28].py="wangbo";NameTable[29].py="zhaoqing";NameTable[30].py="zhangshengqian";for (i=0;i<NAME_LEN;i++) //将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字{int s=0;char *p=NameTable[i].py;for (j=0;*(p+j)!='\0';j++)s+=toascii(*(p+j));NameTable[i].m=s;}}void CreateHashTable(){//建立哈希表for(i=0;i<HASH_LEN;i++)HashTable[i].py="\0";HashTable[i].m =0;HashTable[i].si=0;}for(i=0;i<NAME_LEN;i++){int sum=1,j=0;int adr=(NameTable[i].m)%P; //除留余数法H(key)=key MOD p,p<=mif(HashTable[adr].si==0) //如果不冲突,将姓名表赋值给哈希表{HashTable[adr].m =NameTable[i].m;HashTable[adr].py=NameTable[i].py;HashTable[adr].si=1;}else //如果冲突{while(HashTable[adr].si!=0){adr=(adr+d[j++])%HASH_LEN; //伪随机探测再散列法处理冲突sum=sum+1; //查找次数加1}HashTable[adr].m =NameTable[i].m; //将姓名表复制给哈希表对应的位置上HashTable[adr].py=NameTable[i].py;HashTable[adr].si=sum;}}}void DisplayNameTable(){//显示姓名表printf("\n地址\t\t 姓名\t\t 关键字\n");for (i=0;i<NAME_LEN;i++)printf("%2d %18s \t\t %d \n",i,NameTable[i].py,NameTable[i].m);}void DisplayHashTable(){// 显示哈希表float asl=0.0;printf("\n\n 地址\t\t 姓名\t\t 关键字\t 搜索长度\n"); //显示的格式for (i=0;i<HASH_LEN;i++){printf("%2d %18s \t\t %d\t\t %d\n",i,HashTable[i].py,HashTable[i].m,HashTable[i].si);asl+=HashTable[i].si;}asl/=NAME_LEN;//求得ASLprintf("\n\n平均查找长度:ASL(%d)=%f \n",NAME_LEN,asl);}void FindName()char name[20]={0};int s=0,sum=1,adr;printf("\n请输入想要查找的姓名的拼音:");scanf("%s",name);getchar();for (j=0;j<20;j++)//求出姓名的拼音所对应的ASCII作为关键字s+=toascii(name[j]);adr=s%P; //除留余数法j=0;if(HashTable[adr].m==s&&!strcmp(HashTable[adr].py,name)) //分3种情况进行判断,并输出超找结果printf("\n姓名:%s 关键字:%d 查找长度为: 1\n",HashTable[adr].py,s);else if (HashTable[adr].m==0)printf("没有想要查找的人!\n");else{while(1){adr=(adr+d[j++])%HASH_LEN;//伪随机探测再散列法处理冲突sum=sum+1; //查找次数加1if(HashTable[adr].m==0){printf("没有想要查找的人!\n");break;}if(HashTable[adr].m==s&&!strcmp(HashTable[adr].py,name)){printf("\n姓名:%s 关键字:%d 查找长度为:%d\n",HashTable[adr].py,s,sum);break;}}}}int main(){//主函数char c;int a=1;srand((int)time(0));for(i=0;i<30;i++)//用随机函数求得伪随机数列d[i](在1到50之间)d[i]=1+(int)(HASH_LEN*rand()/(RAND_MAX+1.0));InitNameTable();CreateHashTable();printf("*******************************************************\n");printf("* *\n");printf("* 哈希表设计*\n");printf("* *\n");printf("* A: 显示姓名表B: 显示哈希表*\n");printf("* *\n");printf("* C: 查找D: 退出*\n");printf("* *\n");printf("*******************************************************\n");while(a){printf("\n请选择:");scanf("%c",&c);getchar();switch(c)//根据选择进行判断,直到选择退出时才可以退出{case 'A':case 'a':DisplayNameTable();break;case 'B':case 'b':DisplayHashTable();break;case 'C':case 'c':FindName();break;case 'D':case 'd':a=0;break;default:printf("\n请输入正确的选择!\n");break;}}return 0;}四、调试分析编译环境为CodeBlocks。