数据结构与算法-散列表查找操作实验

合集下载

散列查找顺序表的实现实验报告

散列查找顺序表的实现实验报告

题目:顺序表的实现一、实验题目顺序表的实现二、实验目的⑴掌握线性表的顺序存储结构;⑵验证顺序表及其基本操作的实现;⑶理解算法与程序的关系,能够将顺序表算法转换为对应的程序。

三、实验内容与实现⑴建立含有若干个元素的顺序表;⑵对已建立的顺序表实现插入、删除、查找等基本操作。

实验实现#include<stdio.h>#include<memory.h>int a[10000];int arrlong(){int j;for(j=0;j<12;j++)if(a[j]==0)break;return j;}int Insect(int n,int s) ////插入{int j;for(j=0;j<10000;j++)if(a[j]==0)break;printf("要操作的元素\n");for(int i=0;i<j;i++)printf("%d ",a[i]);printf("\n");for(int i=j;i>n-1;i--)a[i+1]=a[i];a[n]=s;for(int k=0;k<j+1;k++)printf("%d ",a[k]);printf("\n");}int Search(int p) //查找{int j,h;for(j=0;j<12;j++){if(a[j]==0)break;}for(h=0;h<j;h++){if(a[h]==p){printf("查找到的数在第%d位\n",h+1);break;}}if(h==j)printf("查无此数\n");}int Delate(int g,int q) //删除{int j;g=g-1;for(int j=g;j<12;j++)a[j]=a[j+1];for(q =0;q<12;q++){if(a[q]==0)break;}for(int i=0;i<q;i++)printf("%d ",a[i]);printf("\n");}int main(){int y,c;printf(" 菜单\n");printf("-------------------------------------------------\n");printf("0 建表\n1 插入\n2 查找\n3 删除\n4 退出\n");printf("-------------------------------------------------\n");while(scanf("%d",&y)!=EOF){int n,x,s;if(y==0){memset(a,0,sizeof(a));printf("请输入元素的个数:\n");scanf("%d",&c);printf("请输入数据:\n");for(int i = 0;i < c;i++)scanf("%d",&a[i]);}else if(y==1){int L;printf("请输入插入的第几位\n");scanf("%d",&n);//输入L=arrlong();if(n<=L){printf("请输入插入的数字\n");scanf("%d",&s);Insect(n,s);}else{printf("输入有误\n");continue;}}else if(y==2){int p;printf("请输入要查找的数字\n");scanf("%d",&p);Search(p);}else if(y==3){int g,q,L;printf("请输入要删除数的位置\n");scanf("%d",&g);L=arrlong();if(L>=g){Delate(g,q);}else{printf("输入有误\n");printf(" 菜单\n");printf("-------------------------------------------------\n");printf("0 建表\n1 插入\n2 查找\n3 删除\n4 退出\n");printf("-------------------------------------------------\n");continue;}}else if(y==4)break;else{printf("输入有误\n");printf(" 菜单\n");printf("-------------------------------------------------\n");printf("0 建表\n1 插入\n2 查找\n3 删除\n4 退出\n");printf("-------------------------------------------------\n");continue;}printf(" 菜单\n");printf("-------------------------------------------------\n");printf("0 建表\n1 插入\n2 查找\n3 删除\n4 退出\n");printf("-------------------------------------------------\n");}}建立顺序表:插入操作:查找操作:删除操作:插入数据超出顺序表范围:查找不到输入数据:删除数据超出顺序表范围:四、实验心得1.掌握了为数组赋值的方法,深刻理解了数组的含义2.掌握了为数组排序的方法。

散列表实验报告(不同装载因子下链表法和放寻址法对比)

散列表实验报告(不同装载因子下链表法和放寻址法对比)

散列表实验报告(不同装载因子下链表法和放寻址法对比)TOC \o “1-4“ \h \z \u 1 概述22 原理介绍22.1 散列表介绍22.2 直接寻址表32.3 散列函数32.3.1 除法散列42.3.2 乘法散列42.3.3 全域散列42.4 解决碰撞问题52.4.1 链接法52.4.2 开放寻址法52.4.2.1 线性探查62.4.2.2 二次探查62.4.2.3 双重散列73 算法说明73.1 概述73.2 使用链接法解决碰撞问题83.2.1 算法思想83.2.2 伪代码描述93.2.3 算法分析与证明103.3 使用开放寻址法的双重散列解决碰撞问题123.3.1 算法思想123.3.2 伪代码描述123.3.3 算法分析与证明143.4 两个算法的比较144 实验设计与分析165 C++实现与结果分析185.1 C++实现与结果185.2 结果分析266 实验总结和感想27概述该实验报告主要是通过介绍散列表的各种技术,包括散列函数、解决碰撞的机制等技术,并对两种解决碰撞的机制:链接法和开放寻址法进行分析和证明,并通过实验分析两者在不同的规模下的运行时间和空间占用的对比,来证明在“算法说明”一章中的理论分析。

原理介绍散列表介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。

也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

这个映射函数叫做散列函数,存放记录的数组叫做散列表。

它实际上是是普通数组概念的推广,因为可以对数组进行直接寻址,故可以而在O(1)时间内访问数组的任意元素。

如果存储空间允许,我们可以提供一个数组,为每个可能的关键字保留一个位置,就可以应用直接寻址技术。

基本概念若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。

由此,不需比较便可直接取得所查记录。

称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。

数据结构与算法实验报告5-查找与排序

数据结构与算法实验报告5-查找与排序

北京物资学院信息学院实验报告
课程名_数据结构与算法
实验名称查找与排序
实验日期年月日实验报告日期年月日姓名______ ___ 班级_____ ________ 学号___
一、实验目的
1.掌握线性表查找的方法;
2.了解树表查找思想;
3.掌握散列表查找的方法.
4.掌握插入排序、交换排序和选择排序的思想和方法;
二、实验内容
查找部分
1.实现顺序查找的两个算法(P307), 可以完成对顺序表的查找操作, 并根据查到和未查到两种情况输出结果;
2.实现对有序表的二分查找;
3.实现散列查找算法(链接法),应能够解决冲突;
排序部分
4.分别实现直接插入排序、直接选择排序、冒泡排序和快速排序算法
三、实验地点与环境
3.1 实验地点
3.2实验环境
(操作系统、C语言环境)
四、实验步骤
(描述实验步骤及中间的结果或现象。

在实验中做了什么事情, 怎么做的, 发生的现象和中间结果, 给出关键函数和主函数中的关键段落)
五、实验结果
六、总结
(说明实验过程中遇到的问题及解决办法;个人的收获;未解决的问题等)。

数据结构-散列查找

数据结构-散列查找

例:m=1000 ,将下面4个关键字用1000去除 关键字值 % 1000
10052501 10052502 01110525 02110525
501 502 525 Hash函数值一样,显然不好 525
p的选择* : 理论分析和实践结果均证明,p应取小于或等于
m的(最大)素数。
例: H(key)=key % 997
在实际应用中,不产生冲突的散列函数极少存在。
散列技术的首要问题
采用散列技术时需要考虑两个首要问题:
如何选择使记录“分布均匀”的散列函数? 一旦发生冲突,用什么方法来解决?
还需考虑散列表本身的组织方法。
10.4.2 Hash函数的构造方法
Hash函数的选取原则:
① 计算尽可能简单 ② 函数的值域必须在Hash表长的范围内 ③ 尽可能随机性要好:是指Hash函数应当尽可能均匀地
return(sum % tableSize);//整数的除留余数法 }
一个好的字符串Hash函数
int H (char *key, int tableSize ) { int hashVal = 0;
while( *key != '\0' ) hashVal = 37* hashVal + *key++;
散列函数H:把关键字值key映射到散列表存储位置 的函数,通常用H来表示。
Address = H ( key )
装载因子:
α=n/m
m为散列表的空间大小; n为填入散列表中的记录数。
冲突
某个散列函数对于不相等的关键字计算出了相同的散列地 址,称为“发生了冲突”。发生冲突的两个关键字称为“ 同义词”。
begin

数据结构实验报告散列查找

数据结构实验报告散列查找

《数据结构》实验报告题目: 散列查找一、实验题目散列查找二、实验目的⑴掌握散列查找的基本思想;⑵掌握闭散列表的构造方法;⑶掌握线性探测处理冲突的方法;⑷验证散列技术的查找性能。

三、实验内容与实现⑴对于给定的一组整数和散列函数,采用线性探测法处理冲突构造散列表;⑵设计查找算法,验证查找性能。

实验实现:#include <stdio.h>#include <stdlib.h>#define HASHSIZE 10 // 长度#define NULLKEY -32768typedef struct{int *elem; // 数据元素存储地址,动态分配数组int count; // 当前数据元素个数}HashTable;int m = 0;int Init(HashTable *H){int i;m = HASHSIZE;H->elem = (int *)malloc(m * sizeof(int)); //分配内存H->count = m;for (i = 0; i<m; i++){H->elem[i] = NULLKEY;}return 1;}int Hash(int k)//除留余数法{return k % m;}void Insert(HashTable *H, int k)//插入数字如果有冲突用开放定址法{int addr = Hash(k);while (H->elem[addr] != NULLKEY){addr = (addr+1) % m;}H->elem[addr] = k;}int Search(HashTable *H, int k)//求哈希地址开放定址法解决冲突{int addr = Hash(k);while (H->elem[addr] != k){addr = (addr+1) % m;if (H->elem[addr] == NULLKEY || addr == Hash(k)) return -1;}return addr;}void Result(HashTable *H)//散列表元素显示{int i;for (i = 0; i<H->count; i++){if(H->elem[i]!=-32768)printf("%d ", H->elem[i]);}printf("\n");}int main(){int i, j, addr,n;HashTable H;int arr[HASHSIZE] = { NULL };Init(&H);printf("请输入数:");for (i = 0; i<10; i++)scanf("%d", &arr[i]);Insert(&H, arr[i]);}printf("输入的数存入哈希表后:");Result(&H);int b;printf("输入需要查找的数:\n");while(scanf("%d",&j)!=EOF){addr = Search(&H, j);if (addr == -1){printf("元素不存在,程序结束\n");break;}elseprintf("%d元素在表中的位置是:%d\n", j,addr+1); }}四、实验心得。

数据结构查找实验报告

数据结构查找实验报告

一、实验目的1. 理解并掌握几种常见查找算法的基本原理和实现方法。

2. 比较不同查找算法的时间复杂度和空间复杂度。

3. 通过实验验证查找算法的效率和适用场景。

二、实验内容本次实验主要涉及以下查找算法:1. 顺序查找法2. 二分查找法3. 散列查找法三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发环境:PyCharm四、实验步骤1. 实现顺序查找法2. 实现二分查找法3. 实现散列查找法4. 编写测试程序,分别对三种查找算法进行测试5. 比较三种查找算法的性能五、实验结果与分析1. 顺序查找法(1)实现代码```pythondef sequential_search(arr, target):for i in range(len(arr)):if arr[i] == target:return ireturn -1```(2)测试程序```pythonarr = [5, 3, 8, 6, 2, 7, 4, 9, 1]target = 6print("顺序查找结果:", sequential_search(arr, target))```(3)分析顺序查找法的时间复杂度为O(n),空间复杂度为O(1)。

当数据量较大时,查找效率较低。

2. 二分查找法(1)实现代码```pythondef binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] < target:left = mid + 1else:right = mid - 1return -1```(2)测试程序```pythonarr = [1, 2, 3, 4, 5, 6, 7, 8, 9]target = 6print("二分查找结果:", binary_search(arr, target))```(3)分析二分查找法的时间复杂度为O(log2n),空间复杂度为O(1)。

湖南大学数据结构试验8散列表问题

湖南大学数据结构试验8散列表问题

HUNAN UNIVERSITY 课程实习报告题目:散列表问题学生姓名刘乐学生学号20080820208专业班级通信工程2班指导老师朱宁波完成日期2010年6月8日一、需求分析:1.本程序来自于图书馆靠书名来检索想要查找的书问题。

2.本程序要求:(1)根据输入建立图书名称表,采用创建散列表实现。

(2)建散列表后,如果想要查找的数据在散列表中输出yes否则输出no。

3在dos系统下输入散列表内容和要查找的数据个数和数据。

4测试数据:二、概要设计为实现上述功能需要用到散列表的存储结构。

算法基本思想散列表存储的基本思想是用关键字的值决定数据元素的存储地址,散列表存储中解决碰撞的基本方法:①开放定址法:形成地址序列的公式是:Hi=(H(key)+di)% m,其中m是表长,di是增量。

根据di取法不同,又分为三种:a.di =1,2,…,m-1 称为线性探测再散列,其特点是逐个探测表空间,只要散列表中有空闲空间,就可解决碰撞,缺点是容易造成“聚集”,即不是同义词的关键字争夺同一散列地址。

b.di =12,-12,22,-22,… ,±k2(k≤m/2)称为二次探测再散列,它减少了聚集,但不容易探测到全部表空间,只有当表长为形如4j+3(j为整数)的素数时才有可能。

c.di =伪随机数序列,称为随机探测再散列。

②再散列法:Hi=RHi(key)i=1,2,…,k,是不同的散列函数,即在同义词产生碰撞时,用另一散列函数计算散列地址,直到解决碰撞。

该方法不易产生“聚集”,但增加了计算时间。

③链地址法:将关键字为同义词的记录存储在同一链表中,散列表地址区间用H[0..m-1]表示,分量初始值为空指针。

凡散列地址为i(0≤i≤m-1)的记录均插在以H[i]为头指针的链表中。

这种解决方法中数据元素个数不受表长限制,插入和删除操作方便,但增加了指针的空间开销。

这种散列表常称为开散列表,而①中的散列表称闭散列表,含义是元素个数受表长限制。

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

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

数据结构实验散列表实验报告一、实验目的本次实验的主要目的是深入理解和掌握散列表这种数据结构的基本原理、实现方法以及其在实际应用中的性能特点。

通过实际编写代码和进行相关测试,提高对散列表的操作能力,并能够分析和解决在使用散列表过程中可能遇到的问题。

二、实验原理散列表(Hash Table)是一种根据关键码值(Key value)而直接进行访问的数据结构。

通过一个特定的函数(哈希函数)将关键码映射到表中的一个位置来访问记录,以加快查找的速度。

这个映射函数称为哈希函数,存放记录的数组称为哈希表。

哈希函数的设计至关重要,它需要尽可能地将不同的关键码值均匀地分布在哈希表中,以减少冲突的发生。

常见的哈希函数有直接定址法、除留余数法、数字分析法等。

冲突解决方法也是散列表中的重要部分。

当不同的关键码通过哈希函数映射到相同的位置时,就会产生冲突。

常见的冲突解决方法有开放定址法(线性探测、二次探测等)和链地址法。

三、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

四、实验内容1、哈希函数的实现采用除留余数法实现哈希函数。

代码如下:```cppint hashFunction(int key, int tableSize) {return key % tableSize;}```2、散列表的创建与初始化使用动态数组创建散列表,并将所有位置初始化为空。

```cppclass HashTable {private:int table;int size;public:HashTable(int tableSize) {size = tableSize;table = new intsize;for (int i = 0; i < size; i++){tablei =-1; //-1 表示为空}}~HashTable(){delete table;}};```3、数据插入操作采用线性探测法解决冲突。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广州XX学院数据结构与算法实验报告专业班级计科181 实验日期2019.12.10 姓名XX 学号20181533 实验名称实验6.散列表查找操作指导教师曾岫一、实验目的1.熟悉散列查找方法和特点。

2.掌握散列查找解决冲突的方法。

3.用C语言完成算法和程序设计并上机调试通过;4.撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。

二、实验要求1、程序要求包含头文件以及main函数2、实验中所设计的函数(算法)需要满足实验的要求3、程序的编译、运行要成功通过4、运行的结果正确,且有相应的提示三、实验环境WIND7、VC++6.0或C与C++程序设计学习与实验系统四、实验内容1.闭散列表查找的实现2.开散列表查找的实现五、源代码及算法分析1.闭散列表查找的实现#include "stdio.h"#define MAXSIZE 20 /* 假定的最大存储单元数 */typedef int keytype; /* 以整型为元素类型 */typedef keytype HTable[MAXSIZE]; /* 定义散列表数组 *//* 用线性探测再散列法处理冲突建立散列表 */void creHT(HTable HT,int m,int p) /* 创建长度为m的散列表,p为除留余数中的除数 */{ int i,n=0; keytype x;for(i=0;i<m;i++) HT[i]=-1; /* 初始化散列表 */printf("Input datas(-1:End):");scanf("%d",&x);while(x!=-1){ n++;if(n>m) break; /* n记录散列表中的元素个数 */ i=x%p; /* 计算散列地址 */while(HT[i]!=-1) /* 线性探测 */i=(i+1)%m;HT[i]=x; /* 将元素存入空闲单元 */scanf("%d",&x);}}/* 输出散列表 */void list(HTable HT,int m) /* 输出长度为m的散列表 */ { int i;for(i=0;i<m;i++)printf("%5d",i);printf("\n");for(i=0;i<m;i++)printf("%5d",HT[i]);printf("\n");}/* 查找算法 */int search(HTable HT,int m,keytype x,int p)/* 在长度为m的散列表中查找关键字为x的元素 */{ int i,j;i=x%p; /* 取地址 */j=i;while(HT[j]!=-1){ if(HT[j]==x) return j; /* 找到 */j=(j+1)%m;if(j==i) break; /* 没找到 */}return -1;}/* 计算查找成功时的平均查找长度 */float ASLsucc(HTable HT,int m,int p) /* 计算查找成功时的平均查找长度 */{ int i,j,n,s=0;for(i=0,n=m;i<m;i++) /* 查找成功的可能性有n种 */ { if(HT[i]==-1){ n--;continue;} /* 统计散列表中的元素个数 */ j=HT[i]%p;s+=(m+i-j+1)%m; /* 计算成功查找HT[i]的比较次数,并进行累加 */}return (float)s/n;}/* 计算查找失败时的平均查找长度 */float ASLfail(HTable HT,int m,int p) /* 计算查找失败时的平均查找长度 */{ int i,j,k,s=0;for(i=0;i<p;i++) /* 查找失败的可能性有p种 */ { k=0;j=i;while(HT[j]!=-1){ k++;j=(j+1)%m;if(j==i) break; /* 当元素填满整个空间时的情况 */}s+=k; /* k为查找失败时的比较次数,并进行累加 */}return (float)s/p;}main(){ HTable HT;int m=9,p=9;keytype key;creHT(HT,m,p); /* 建立散列表,长度为9,散列函数的余数为9。

以【例7.8】为例 */list(HT,m); /* 输出散列表 */printf("\n");scanf("%d",&key); /* 输入查找元素 */printf("%d\n",search(HT,m,key,p)); /* 输出查找结果 */printf("%6.2f\n",ASLsucc(HT,m,p)); /* 输出查找成功时的平均查找长度 */printf("%6.2f\n",ASLfail(HT,m,p)); /* 输出查找失败时的平均查找长度 */}2.开散列表查找的实现#include "stdio.h"typedef int keytype; /* 关键字类型 */typedef struct node{ keytype data;struct node *next;}slink; /* 链表结点类型 *//* 用拉链法处理冲突建立散列表 */void creHT(slink *HT[],int m,int p) /* 建立表长为m的散列表,p为除数 */{ int i; keytype x; slink *s;for(i=0;i<m;i++)HT[i]=NULL; /* 散列表初始化 */printf("Input datas(-1:End):");scanf("%d",&x);while(x!=-1){ i=x%p; /* 计算散列地址 */s=(slink *)malloc(sizeof(slink));s->data=x; /* 生成结点 */s->next=HT[i];HT[i]=s; /* 用首插法插入结点 */scanf("%d",&x);}}/* 输出散列表 */void list(slink *HT[],int m) /* 输出散列表,m是表长 */ { int i;slink *q;for(i=0;i<m;i++){ printf("%5d==> ",i);q=HT[i];while(q){ printf("%5d ",q->data);q=q->next;}printf("\n");}}/* 查找算法 */int search(slink *HT[],int p,keytype x) /* 在散列表中查找指定元素,p为除数 */{ slink *q;int i;i=x%p; /* 计算散列地址 */q=HT[i];while(q) /* 在相应链表中查找 */ { if(q->data==x) return i; /* 找到 */q=q->next;}return -1; /* 没找到 */}/* 计算查找成功时的平均查找长度 */float ASLsucc(slink *HT[],int p) /* 计算查找成功时的平均查找长度,p为除数 */{ int i,n=0,k,s=0; slink *q;for(i=0;i<p;i++){ k=0;q=HT[i];while(q){ s+=++k; /* 计算比较次数,并进行累加 */n++; /* 统计表中的元素个数 */ q=q->next;}}return (float)s/n;}/* 计算查找失败时的平均查找长度 */float ASLfail(slink *HT[],int p) /* 计算查找失败时的平均查找长度,p为除数 */{ int i,n=0; slink *q;for(i=0;i<p;i++){ q=HT[i];while(q){ n++; /* n既是元素个数,也是比较次数 */q=q->next;}}return (float)n/p;}main(){ slink *HT[9];int m=9,p=9;keytype key;creHT(HT,m,p); /* 建立散列表,以【例7.9】为例 */list(HT,m); /* 输出散列表 */scanf("%d",&key); /* 输入查找元素 */printf("%d\n",search(HT,p,key)); /* 输出查找结果 */printf("\n%f\n",ASLsucc(HT,p)); /* 输出查找成功时的平均查找长度 */printf("\n%f\n",ASLfail(HT,p)); /* 输出查找失败时的平均查找长度 */}六、运行测试(对实验结果进行相应分析,或总结实验的心得体会,并提出算法的改进意见)。

相关文档
最新文档