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

合集下载

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

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

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

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

实验实现#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.掌握了为数组排序的方法。

查找的实验报告

查找的实验报告

实验名称:查找算法性能分析实验目的:比较不同查找算法的效率,并分析其性能。

实验时间:2022年3月15日实验地点:计算机实验室实验器材:计算机、实验软件一、实验背景随着计算机技术的发展,数据量越来越大,查找算法在数据处理中的应用越来越广泛。

查找算法的效率直接影响到数据处理的速度,因此研究不同查找算法的性能具有重要意义。

本实验旨在比较几种常见的查找算法的效率,并分析其性能。

二、实验内容1. 算法介绍(1)顺序查找顺序查找是一种最简单的查找方法,其基本思想是从线性表的第一个元素开始,依次将线性表中的元素与要查找的元素进行比较,直到找到目标元素或者查找结束。

(2)二分查找二分查找是一种效率较高的查找方法,其基本思想是将待查找的序列分为两半,每次将中间位置的元素与要查找的元素进行比较,如果相等,则查找成功;如果中间位置的元素大于要查找的元素,则将查找范围缩小到左半部分;如果中间位置的元素小于要查找的元素,则将查找范围缩小到右半部分。

重复此过程,直到找到目标元素或者查找结束。

(3)散列查找散列查找是一种基于散列函数的查找方法,其基本思想是将要查找的元素通过散列函数映射到散列表中的一个位置,然后直接访问该位置,如果找到目标元素,则查找成功;如果未找到,则查找失败。

2. 实验步骤(1)生成随机数据使用实验软件生成一组随机数据,包括顺序查找和二分查找的数据。

(2)编写查找算法根据上述算法介绍,编写顺序查找、二分查找和散列查找的代码。

(3)测试算法性能分别对三种查找算法进行测试,记录查找成功和失败的情况,统计查找成功和失败的平均时间。

三、实验结果与分析1. 顺序查找(1)查找成功实验结果显示,顺序查找在查找成功的情况下,平均查找时间为0.1秒。

(2)查找失败实验结果显示,顺序查找在查找失败的情况下,平均查找时间为0.2秒。

2. 二分查找(1)查找成功实验结果显示,二分查找在查找成功的情况下,平均查找时间为0.05秒。

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

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

散列表实验报告(不同装载因子下链表法和放寻址法对比)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语言环境)
四、实验步骤
(描述实验步骤及中间的结果或现象。

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

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

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

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

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

实验实现:#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. 顺序表的实现顺序表的实现需要用到一维数组,当创建顺序表时,先要确定它的最大长度,然后根据长度创建相应大小的一维数组,接着插入数据时,依次将数据插入到数组中,需要注意的是,数组是从0开始储存的,而不是从1开始。

以下是顺序表的实现代码示例:```python# 设定最大长度为10MAX_SIZE = 10class SeqList:def __init__(self):self.seq = [None] * MAX_SIZEdef insert(self, index, value):# 检查是否超出最大长度,或者下标越界if index < 0 or index > MAX_SIZE or index >= len(self.seq): raise IndexError# 移动数组,腾出位置for i in range(MAX_SIZE - 1, index - 1, -1):self.seq[i] = self.seq[i - 1]# 插入数据self.seq[index] = valuedef pop(self, index):# 检查下标合法性if index < 0 or index >= len(self.seq):raise IndexError# 移动数组,删除数据for i in range(index, MAX_SIZE - 1):self.seq[i] = self.seq[i + 1]# 最后一位设为None,释放空间self.seq[-1] = Nonedef __repr__(self):return str(self.seq)```3. 顺序表的应用顺序表可以用于很多场景,比如存储学生成绩、成绩排名、图书管理等,以下是一个简单的例子:存储学生成绩并排序```pythonseq = SeqList()seq.insert(0, 89)seq.insert(1, 92)seq.insert(2, 76)seq.insert(3, 68)seq.insert(4, 100)print(seq)```输出:`[89, 92, 76, 68, 100, None, None, None, None, None]` 对学生成绩进行排序:```pythonseq.seq.sort(reverse=True)print(seq)```输出:`[100, 92, 89, 76, 68, None, None, None, None, None]` 结论通过本次实验,我们掌握了顺序表的定义、实现及其应用,顺序表在大多数情况下提供了比较高效的数据访问,因此在实际开发中非常有用。

数据结构查找实验报告

数据结构查找实验报告

一、实验目的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)。

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

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

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

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

二、实验原理散列表(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)。

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

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

实验实现
#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.掌握了为数组排序的方法。

3.正确理解for循环与数组的共同使用方式
4.会灵活的使用函数。

相关文档
最新文档