数据结构实验报告-查找最高分与次高分
数据结构 查找 实验报告

数据结构查找实验报告数据结构查找实验报告1·实验目的本实验旨在研究不同的查找算法在不同数据结构下的性能表现,通过实验结果对比分析,选取最优算法来完成查找操作。
2·实验方法2·1 数据结构选择在本实验中,我们选择了常用的数据结构进行查找性能比较,包括线性表、二叉树、哈希表等。
2·2 查找算法选择我们选择了以下常用的查找算法进行实验:●顺序查找●二分查找●插值查找●二叉查找树●平衡二叉查找树(AVL树)●哈希查找3·实验过程3·1 实验环境设置首先,我们需要搭建合适的实验环境,包括编程语言选择、编译器、开发环境等。
在本次实验中,我们选择了C++编程语言,并使用了Visual Studio 2019作为开发环境。
3·2 实验步骤为了比较各个查找算法的性能,我们按照以下步骤进行实验: 1·创建用于查找的数据结构,并初始化数据集合。
2·调用每个查找算法进行查找,并记录查找耗时。
3·分析实验结果,比较各个查找算法的性能。
4·实验结果与分析根据实验步骤中记录的各个查找算法的耗时,我们得到了以下结果:●对于小规模数据集,顺序查找表现较好。
●对于有序数据集,二分查找和插值查找表现最佳。
●对于动态数据集,哈希表的查找效率最高。
5·结论根据实验结果与分析,我们得出以下结论:●不同的数据结构适用于不同的查找需求。
●在静态有序数据集中,二分查找和插值查找是较好的选择。
●在动态数据集中,哈希表具有较高的查找效率。
附件:附件1:实验数据集附件2:查找算法代码法律名词及注释:1·数据结构:数据之间的组织方式和关系,使得我们可以高效地进行数据的存储和操作。
2·查找算法:在给定某个目标值的情况下,在给定数据集内寻找目标值的算法。
3·顺序查找:逐个比较目标值和数据集内的元素,直到找到目标值或者遍历完整个数据集。
数据结构查找实验报告

一、实验目的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)。
数据结构实验六——最高分次高分问题

五、运行测试与分析 输出 最高分次高分均相同且正确 实际 √
六、实验收获与思考 本次实验中无论是锦标赛法还是堆查找法都用到了顺序树的思想,对树的顺序存储结构 有了更加清晰的认识。 写程序的速度有所提高,然后又完成了一次综合型实验,写代码的思路要更加明确。 教师评分:
教师签字:
二、数据结构设计 typedef struct { int num; //编号 int grade; //分数 }person; 采用的结构体数组的数据结构,数组中的每个元素有两个数据域,分别用来存编号和分数 三、算法设计 1) 顺序查找
2)
标赛法查找
3)
堆查找法
四、界面设计 编号 得分 ……(依次输出 512 名玩家的得分) ------------------------------------------顺序查找法: 最高分编号为 72,分数为 998 次高分编号为 167,分数为 993 锦标赛查找法: 最高分编号为 72,分数为 998 次高分编号为 167,分数为 993 堆查找法: 最高分编号为 72,分数为 998 次高分编号为 167,分数为 993 是否再次进行查找,是按 1.否按 0
实验报告六 实验课名称:数据结构与程序设计实验 实验名称:查找最高分与次高分 班级: 学号: 姓名: 时间: 一、问题描述 有 512 人参与玩某游戏,从 1~512 给每个人分配一个编号,每个人的游戏得分在 0~999 之间,现要用不同方法查找出游戏参与者的最高分和次高分。要求:
数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构实验报告-查找最高分与次高分

学号
年级
姓名
专业
计算机科学与技术
学生所在学院
计算机学院
指导教师
杨静
实验室名称地点
21B276
哈尔滨工程大学
实验报告六
实验课名称:数据结构与程序设计实验
实验名称:查找最高分与次高分
班级:
学号:
姓名:
时间:2016.05.05
一、问题描述
有 512 人参与玩某游戏,从 1~512 给每个人分配一个编号,每个人的游戏得
return 0;
}
2.锦标赛查找
(a). 每次将最大值选择至树根后调整树
void Adjust(Peoples *p, int x, int n) {
int l = x * 2; //左子树
int r = l + 1; //右子树
if(l >= n){ //x为叶子节点
p->base[x] = MIN;
p->base[n].sc>length = 512;
return 0;
}
int copy_people(Peoples *p1, Peoples *p2){
int n;
for(n=1; n<=512; n++){
p2->base[n].num = p1->base[n].num;
a->base[i] = b->base[1];
Adjust(b, 1, len);
}
printf("第%d人的的分数最大:%d\n", a->base[1].num, a->base[1].score);
数据结构实验报告

数据结构实验报告一、实验目的本实验旨在通过对数据结构的学习和实践,掌握基本的数据结构概念、原理及其应用,培养学生的问题分析与解决能力,提升编程实践能力。
二、实验背景数据结构是计算机科学中的重要基础,它研究数据的存储方式和组织形式,以及数据之间的关系和操作方法。
在软件开发过程中,合理选用和使用数据结构,能够提高算法效率,优化内存利用,提升软件系统的性能和稳定性。
三、实验内容本次实验主要涉及以下几个方面的内容:1.线性表的基本操作:包括线性表的创建、插入、删除、查找、修改等操作。
通过编程实现不同线性表的操作,掌握它们的原理和实现方法。
2.栈和队列的应用:栈和队列是常用的数据结构,通过实现栈和队列的基本操作,学会如何解决实际问题。
例如,利用栈实现括号匹配,利用队列实现银行排队等。
3.递归和回溯算法:递归和回溯是解决很多求解问题的常用方法。
通过编程实现递归和回溯算法,理解它们的思想和应用场景。
4.树和二叉树的遍历:学习树和二叉树的遍历方法,包括前序、中序和后序遍历。
通过编程实现这些遍历算法,加深对树结构的理解。
5.图的基本算法:学习图的基本存储结构和算法,包括图的遍历、最短路径、最小生成树等。
通过编程实现这些算法,掌握图的基本操作和应用。
四、实验过程1.具体实验内容安排:根据实验要求,准备好所需的编程环境和工具。
根据实验要求逐步完成实验任务,注意记录并整理实验过程中遇到的问题和解决方法。
2.实验数据采集和处理:对于每个实验任务,根据要求采集并整理测试数据,进行相应的数据处理和分析。
记录实验过程中的数据和结果。
3.实验结果展示和分析:将实验结果进行适当的展示,例如表格、图形等形式,分析实验结果的特点和规律。
4.实验总结与反思:总结实验过程和结果,回顾实验中的收获和不足,提出改进意见和建议。
五、实验结果与分析根据实验步骤和要求完成实验任务后,得到了相应的实验结果。
对于每个实验任务,根据实验结果进行适当的分析。
数据结构-查找-实验报告

实验报告实验八查找一、实验目的1、掌握顺序表查找中不同查找方法的查找思想,并能用C/C++语言实现。
2、掌握树表查找中二叉排序树查找、平衡二叉树查找的查找思想,并能用C/C++语言实现。
3、掌握Hash表查找中的查找思想,并能用C/C++语言实现。
4、能够针对具体实际,灵活选用适宜的查找方法。
二、实验环境PC微机,Windows,DOS,Turbo C或Visual C++三、实验内容1、二叉排序树查找(1)问题描述查找是计算机操作中的一种重要应用技术,查找的方法有许多,不同的查找方法有不同的查找效率,而二叉排序树查找就是效率较高的查找方法之一。
所谓二叉排序树,就是指将原来已有数据根据大小构成一棵二叉树,二叉树中的所有结点数据满足一定的大小关系,所有左子树中的结点均比根结点小,所有右子树中的结点均比根结点大。
二叉排序树查找是指按照二叉排序树中结点的关系进行查找,查找关键字首先同树根结点进行比较,如果相等则查找成功;如果比根结点小,则在左子树中查找;如果比根结点大,则在右子树中进行查找。
这种查找方法可以快速缩小查找范围,大大减少了查找关键字的比较次数,从而提高了查找效率。
(2)基本要求编程实现时,体现查找的全过程,即二叉排序树的创建、查找关键字的输入、查找关键字的查找、查找结果的输出等。
(3)算法实现#include<stdio.h>#include<stdlib.h>void Getemptylist(); // 建立空树void Getlist(); // 建立二叉排序树void SortL(); // 排序void Connectlist(); // 结点连接处理void Lookup(); // 查找typedef struct list{int data;struct list *left;struct list *right;}JD;JD *head;int L[20];int size;int num;int main(){Getemptylist();Getlist();Lookup();return 0;}//+*void Getemptylist(){printf("建立空树:\n");head=(JD*)malloc(sizeof(JD));head->left = NULL;head->right = NULL;if(!head){printf("建立失败!\n");exit(-1);}else{printf("建立成功!\n");}}void Getlist(){int i;printf("建立二叉排序树:\n");printf("请输入元素个数:");scanf("%d",&size);printf("请输入元素:");for(i = 0;i < size;i++){scanf("%d",&(L[i]));}SortL();printf("二叉排序树建立中。
数据结构 查找 实验报告

数据结构查找实验报告数据结构查找实验报告1. 简介查找是计算机科学中一种常见的操作,它用于在一组数据中快速定位特定的元素。
数据结构是计算机存储、组织数据的方式,可以有效地支持查找操作。
本实验报告将介绍查找算法的原理和实现,以及实验结果的分析和总结。
2. 查找算法2.1 顺序查找顺序查找是一种简单直观的查找算法,它从数据集的第一个元素开始逐个比较,直至找到目标元素或遍历完所有元素。
顺序查找的时间复杂度为O(n),其中n是数据集的大小。
2.2 二分查找二分查找是一种高效的查找算法,它要求数据集必须是有序的。
它通过将数据集分成两部分,并与目标元素进行比较,以确定目标元素所在的区间,然后在该区间内继续二分查找,直至找到目标元素或确定目标元素不存在。
二分查找的时间复杂度为O(log n),其中n是数据集的大小。
2.3 插值查找插值查找是对二分查找的一种改进,它根据目标元素的估计位置来确定比较的起始位置。
它适用于数据集分布均匀的情况,可以进一步减少查找的次数。
插值查找的时间复杂度为O(log(log n))。
3. 实验结果本次实验我们使用了三种查找算法(顺序查找、二分查找和插值查找)在不同大小的数据集上进行了性能测试。
实验结果如下表所示:---- 数据集大小 ---- 顺序查找时间(ms) ---- 二分查找时间(ms) ---- 插值查找时间(ms) ---------------------------------------------------------------------------------------------- 1000 ---- 10 ---- 2 ---- 1 -------- 10000 ---- 100 ---- 4 ---- 2 -------- 100000 ---- 1000 ---- 6 ---- 3 -------- 1000000 ---- 10000 ---- 8 ---- 4 ----从实验结果可以看出,随着数据集的增大,顺序查找的时间成正比增加,而二分查找和插值查找的时间相对较稳定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
3.通过无序序列建堆和堆调整得到取得最高分者和次高分者及其分数
(a).筛选:除p->base[s]外均满足堆定义,调整p->base[s],将p->base[s,m]建立为大顶堆
int HeapAdjust(Peoples *p, int s, int m){
People rc = p->base[s];
HeapAdjust(p, i, p->length);
}
for(i=p->length; i>510; --i){ //只将最大和次大的得分交换到末尾
swap(p->base[1], p->base[i]);
HeapAdjust(p, 1, i-1);
}
printf("第%d人的的分数最大:%d\n", p->base[512].num, p->base[512].score);
p->base[n].score = rand()%1000;
}
p->length = 512;
return 0;
}
int copy_people(Peoples *p1, Peoples *p2){
int n;
for(n=1; n<=512; n++){
p2->base[n].num = p1->base[n].num;
p2->base[n].score = p1->base[n].score;
}
p2->length = p1->length;
return 0;
}
int display(Peoples *p){
int n;
for(n=1; n<=512; n++){
printf("第%3d个人的分数是%3d ", p->base[n].num, p->base[n].score);
}People;
2.设置MIN表示People数据类型的最小值,用于竞标赛查找
#define IN_MAX (int)(((unsigned)(~((int)0)))>>1)
#define IN_MIN (-IN_MAX-1)
const People MIN={513, IN_MIN};
3.使用结构体Peoples作为顺序表,存储每个个体
printf("第%d人和第%d人的分数一样大\n", p->base[n].num, biggest.num);
}
}
printf("第%d人的的分数最大:%d\n", biggest.num, biggest.score);
printf("第%d人的的分数次大:%d\n", bigger.num, bigger.score);
int j;
for(j=2*s; j<=m; j*=2){
if(j<m && (p->base[j].score < p->base[j+1].score)){
++j; //j指向较大的孩子节点
}
if(!(rc.score < p->base[j].score)){
break;
}
p->base[s] = p->base[j];
#define swap(x, y) { _=x; x=y; y=_; }
int init_all_people(Peoples *p){
int n;
srand((unsigned)time(NULL)); //设置每个人的成绩为随机值
for(n=1; n<=512; n++){
p->base[n].num = n;
return;
}else if(r >= n){ //x有左子树,无右子树
p->base[x] = p->base[l];
return;
}
if(p->base[l].num == p->base[x].num){
Adjust(p, l, n);
}else{
Adjust(p, r, n);
}
p->base[x] = max(p->base[l], p->base[r]);
3.输出顺序查找,锦标赛查找,堆排序查找的结果
五、实验收获与思考
通过本次实验,巩固了关于查找算法的知识,同时在编程过程中发现了自己的不足,遇到了很多语法错误及逻辑错误,通过不断的调试解决问题,使我对编程有了更加深入的体会和认识。
顺序查找,锦标赛查找,堆查找的效率及特点:
如果有n个待查找元素,顺序查找每次查找均需进行n-1次比较,但不需额外存储空间。锦标赛排序构成的树是满的完全二叉树,深度为log2n+1,除第一次选择具有最大关键码的记录需要进行n-1次比较外,重构树选择具有次小、再次小关键码记录所需的比较次数均为O(log2n),但这种选择方法虽然减少了许多查找时间,但是使用了较多的附加存储。堆查找的运行时间主要耗费在初始和调整堆时进行的反复筛选上,堆查找仅需记录一个大小供交换的辅助存储空间,每个记录仅占有一个存储空间。
return 0;
}
2.锦标赛查找
(a).每次将最大值选择至树根后调整树
void Adjust(Peoples *p, int x, int n) {
int l = x * 2; //左子树
int r = n){ //x为叶子节点
p->base[x] = MIN;
printf("第%d人的的分数次大:%d\n", p->base[511].num, p->base[511].score);
return 0;
}
四、运行测试与分析
1.开始运行后,自行产生512个的随机整数作为所有游戏参与者的得分,并输出所有游戏参与者(用编号表示)及其得分。
2.省略中间部分,余下输出
姓名:
时间:2016.05.05
一、问题描述
有512人参与玩某游戏,从1~512给每个人分配一个编号,每个人的游戏得
分在0~999之间,现要用不同方法查找出游戏参与者的最高分和次高分。要求:
a.自行产生512个的随机整数作为所有游戏参与者的得分。
b.输出所有游戏参与者(用编号表示)及其得分。
c.用顺序查找方法查找出其中取得最高分和次高分者及其分数,并输出。
p->base[x] = p->base[l];
return 0;
}
if(p->base[l].num == p->base[x].num){
Adjust(p, l, n);
}else{
Adjust(p, r, n);
d.锦标赛法查找出其中取得最高分和次高分者及其分数,并输出。
e.通过无序序列建堆和堆调整得到取得最高分者和次高分者及其分数,并输出。
f.比较不同方法的查找效率和各自的特点。
二、数据结构设计
1.使用结构体People存储序号和得分,表示个体
typedef struct{
int num;
int score;
if(p->base[n].score > biggest.score){
bigger = biggest;
biggest = p->base[n];
}else if(p->base[n].score > bigger.score){
bigger = p->base[n];
}
if(p->base[n].num != biggest.num && p->base[n].score == biggest.score){
数据结构与程序设计实验
实验报告
课程名称
数据结构与程序设计实验
课程编号
0906550
实验项目名称
查找最高分与次高分
学号
年级
姓名
专业
计算机科学与技术
学生所在学院
计算机学院
指导教师
杨静
实验室名称地点
21B276
哈尔滨工程大学
实验报告六
实验课名称:数据结构与程序设计实验
实验名称:查找最高分与次高分
班级:
学号:
#define IN_MIN (-IN_MAX-1)
typedef struct{
int num;
int score;
}People;
typedef struct{
People *base;
int length;
}Peoples;
const People MIN={513, IN_MIN};
People _;
bigger = biggest;
biggest = p->base[n];
}else if(p->base[n].score > bigger.score){
bigger = p->base[n];
}
if(p->base[n].num != biggest.num && p->base[n].score == biggest.score){
s=j;
}
p->base[s] = rc;
return 0;
}
(b).对p->base[1..512]建堆,进行堆调整取得最高分和次高分者,并输出
int HeapSort(Peoples *p){