数据结构实验---折半查找实验报告
- 格式:doc
- 大小:158.00 KB
- 文档页数:11
1. 理解折半查找法的基本原理和适用条件。
2. 掌握折半查找法的实现方法。
3. 通过实验验证折半查找法的效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 实现折半查找法。
2. 对折半查找法进行测试,包括:a. 对已排序的数组进行查找;b. 对未排序的数组进行查找;c. 查找不存在的元素。
四、实验步骤1. 定义一个整型数组,并对其进行排序。
2. 实现折半查找函数,包括:a. 定义折半查找函数的参数,包括数组、目标值和数组的长度;b. 实现折半查找算法;c. 返回查找结果,包括找到的位置和未找到。
3. 对已排序的数组进行查找,输出查找结果。
4. 对未排序的数组进行查找,输出查找结果。
5. 对不存在的元素进行查找,输出查找结果。
```cpp#include <iostream>#include <algorithm>// 折半查找函数int binarySearch(const int arr, int target, int left, int right) { while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid; // 找到目标值,返回位置} else if (arr[mid] < target) {left = mid + 1; // 在右侧查找} else {right = mid - 1; // 在左侧查找}}return -1; // 未找到目标值}int main() {// 测试数组int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int n = sizeof(arr) / sizeof(arr[0]);int target = 11; // 目标值// 对数组进行排序std::sort(arr, arr + n);// 对已排序的数组进行查找int index = binarySearch(arr, target, 0, n - 1);if (index != -1) {std::cout << "已排序数组中找到目标值:" << target << ",位置为:" << index << std::endl;} else {std::cout << "已排序数组中未找到目标值:" << target << std::endl;}// 对未排序的数组进行查找int unsortedArr[] = {9, 5, 3, 7, 1, 11, 13, 17, 15, 19};int unsortedIndex = binarySearch(unsortedArr, target, 0, n - 1);if (unsortedIndex != -1) {std::cout << "未排序数组中找到目标值:" << target << ",位置为:" << unsortedIndex << std::endl;} else {std::cout << "未排序数组中未找到目标值:" << target << std::endl;}// 对不存在的元素进行查找int notExistTarget = 20;int notExistIndex = binarySearch(arr, notExistTarget, 0, n - 1);if (notExistIndex != -1) {std::cout << "数组中找到目标值:" << notExistTarget << ",位置为:" << notExistIndex << std::endl;} else {std::cout << "数组中未找到目标值:" << notExistTarget <<std::endl;}return 0;}```六、实验结果与分析1. 对已排序的数组进行查找,折半查找法成功找到了目标值,查找效率较高。
一、实验目的熟练掌握顺序查找,折半查找和哈希表等算法的程序实现。
二、实验内容1、实现折半查找的算法编写一个程序,输出在顺序表(1,2,3,4,,6,7,8,9,10)中采用折半查找方法查找关键字9的过程要求:输出查找过程中的比较对象和被查找元素的位置。
2、实现哈希表的相关运算算法编写程序实现哈希表的构造过程。
要求:建立关键字序列(16,74,60,43,54,90,46,31,29,88,77)对应的哈希表A[0...12],哈希函数为H(k)=k%p,并采用开放定址法中的线性探测法解决冲突。
输出构造完成后的哈希表。
程序源代码及运行结果(运行结果可以截图,也可以文字描述分析)1#include<stdio.h>#include<stdlib.h>int fun(int a[],int key){int high=9;int low=0;int mid=(high+low)/2;printf("与之相比较的值为:");while(high>=low){if(key==a[mid]){printf("%-2d",a[mid]);printf("\nkey为数组中第%d个元素\n",mid+1);break;}if(key<a[mid]){ printf("%-2d",a[mid]);high=mid-1;mid=(high+low)/2;}if(key>a[mid]){ printf("%-2d",a[mid]);low=mid+1;mid=(high+low)/2;}}}int main(){int a[10]={1,2,3,4,5,6,7,8,9,10};fun(a,9);system("pause");}运行截图:2#include<stdio.h>int main(){int a[11]={16,74,60,43,54,90,46,31,29,88,77};int A[13]={0};int p=11,H;for(int i=0;i<11;i++){H=a[i]%p;while(A[H]!=0){H++;if(H==12){H=0;}}A[H]=a[i];}for(int i=0;i<13;i++){if(A[i]!=0){printf("%d ",A[i]);}}}运行截图三、小结(不少于100字)感觉好像没有真正理解哈希表,折半查找比较好理解,实现起来也比较容易,自己对代码的熟练程度还不够,课后还会多多练习,查找的方式还有很多,课后应该多看书,对每种算法都有一定的了解。
软件学院数据结构实验报告2012 ~2013 学年第一学期 2011 级水利信息管理专业班级:学号:姓名:实验六查找算法实验一、实验目的1、掌握静态查找表的查找算法2、掌握二叉排序树的查找算法3、掌握哈希函数的构造和哈希表的查找4、了解查找表的广泛应用二、实验内容1、有序表的查找1.1 数据结构的设计有序表的存储结构(数组表示)#define Max 20int a[Max] = {05,13,19,21,37,56,64,75,80,88,92}1.2 基本思想:折半查找算法在有序表中,取中间的记录作为比较对象,如果要查找记录的关键字等于中间记录的关键字,则查找成功;若要查找记录的关键字小于中间记录的关键字,则在中间记录的左半区继续查找;若要查找记录的关键字大于中间记录的关键字,则在中间记录的右半区继续查找。
不断重复上述查找过程,直到查找成功,或有序表中没有所要查找的记录,查找失败。
例:输入:查找记录的关键字 k = 13,k =37,k =99输出:k=13,查找成功;k=37,查找成功;k=99,查找不成功1.3 实验步骤:源程序:1.4 运行结果:2、二叉排序树的查找2.1 数据结构的设计二叉链表的存储结构表示:typedef int datatype;struct bi_search_tree{datatype key;struct bi_search_tree *left, *right;}bst_tree;2.2 基本思路先将输入的数据记录序列通过二叉排序树的插入算法建立一个二叉排序树,然后在二叉排序树中查找某个给定的关键字,返回查找成功或者不成功的结果输入:(1)数据记录序列{37,56,05,13,19,21, 64, 88, 75,80,92}建立二叉排序树,(2)查找记录的关键字 k = 13,k =37,k =99输出:k=13,查找成功;k=37,查找成功;k=99,查找不成功2.3 实验步骤:主要函数声明:主函数代码:2.4 运行结果:三、问题讨论1、折半查找有哪些特点?2、二叉排序树有那些特点?四、实验心得实验源码:(折半查找)#include <stdio.h>#define LENGTH 20void Search(int *fp,int data,int length);void main(){int count,i,choise;int arr[LENGTH];printf("请输入你的数据的个数:\n");scanf("%d",&count);printf("请输入%d个有序的数据\n",count);for(i=0;i<count;i++){scanf("%d",&arr[i]);}printf("请输入你要查找的数据:\n");scanf("%d",&choise);Search(arr,choise,count);}void Search(int *fp,int data,int length){int i=0;int low,high,middle;low=0; high=length;while (low<=high){middle=(low+high)/2;i++;if(fp[middle]<data){low=middle+1;}else if(fp[middle]>data){high=middle-1;}else{printf("经过%d次查找,查找到数据:%d.\n",i,data);return;}}printf("经过%d次查找,未能查找到数据:%d.\n",i,data);}二叉排序树:#include <stdio.h>#include <stdlib.h>#include <string.h>#define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)< (b))#define LQ(a,b) ((a)<=(b))#define TRUE 1#define FALSE 0#define OVERFLOW -2typedef int KeyType;typedef int Status;typedef struct{KeyType key; /*关键字域*/}SElemType;typedef struct BitNode{SElemType data; /*存储空间基址,建表时按实际长度分配,0号单元留空*/ struct BitNode *lchild,*rchild;}BitNode,* BiTree;/*二叉排序树的插入*/Status InsertBST(BiTree T, KeyType key){BiTree s;if(!T){s=(BiTree)malloc(sizeof(BitNode));s->data.key=key;s->lchild=s->rchild=NULL;T=s;}else if LT(key,T->data.key)InsertBST(T->lchild,key);else InsertBST(T->rchild,key);return TRUE;}/*创建二叉排序树*/void CreateBST(BiTree T){KeyType key;T=NULL;scanf("%d",&key);while(key!=0){InsertBST(T,key);scanf("%d",&key);}}/*中序遍历*/void InOrderTraverse(BiTree T){if(T){InOrderTraverse(T->lchild);printf("%4d",T->data.key);InOrderTraverse(T->rchild);}}/*打印二叉树*/Status PrintTree(BiTree T,int n){int i=0;if(T == NULL)return FALSE;PrintTree(T->rchild,n+1);for(i=0;i<n;i++)printf(" ");printf("%d\n",T->data.key);PrintTree(T->lchild,n+1);return TRUE;}/*二叉排序树的查找*/BiTree SearchBST(BiTree T,KeyType key){if(!T){printf("Can not find!!\n");return T;}else if EQ(key,T->data.key){return T;}else if LT(key,T->data.key) return SearchBST(T->lchild,key); else return SearchBST(T->rchild,key);}/*二叉排序树的删除*/Status Delete(BiTree p){BiTree q,s;if(!p->rchild){q=p;p=p->lchild;free(q);}else if(!p->lchild){q=p;p=p->rchild;free(q);}else{q=p;s=p->lchild;while(s->rchild){q=s;s=s->rchild;}p->data=s->data;if(q!=p) q->rchild=s->lchild;else q->lchild=s->lchild;// delete s;}return TRUE;}Status DeleteBST(BiTree T,KeyType key){if(!T)return FALSE;else{if (EQ(key,T->data.key))return Delete(T);elseif(LT(key,T->data.key))return DeleteBST(T->lchild,key);else return DeleteBST(T->rchild,key);}}void main() {BiTree b1,b2;KeyType key;int t;begin:printf("1:创建二叉排序树\n");printf("2:打印排序树\n");printf("3:查找结点\n");printf("4:中序遍历\n");printf("5:插入结点\n");printf("6:删除结点\n");printf("0:退出\n");printf("请选择要进行的操作:");scanf("%d",&t);switch(t){case 1:printf("Input every key (0 to quit):");CreateBST(b1);PrintTree(b1,0);//排序树的结果打印出来goto begin;case 2:PrintTree(b1,0);goto begin;case 3:printf("Input the key to search:");scanf("%d",&key);if(key!=0){b2=SearchBST(b1,key);//把 key 为根的子树打印出来PrintTree(b2,0);printf("\nThe root is the key to search!!\n\n");}else printf("Can not find!!\n");goto begin;case 4:InOrderTraverse(b1);goto begin;case 5:printf("输入要插入的数据:");scanf("%d",&key);if(InsertBST(b1, key))printf("\n插入完毕!\n");else printf("插入失败\n");goto begin;case 6:printf("输入要删除的数据:");scanf("%d",&key);if(DeleteBST(b1, key))printf("\n删除完毕!\n");else printf("删除失败\n");goto begin;case 0: break;default: printf("输入错误\n");}}。
实验五查找的应用一、实验目的:1、掌握各种查找方法及适用场合,并能在解决实际问题时灵活应用。
2、增强上机编程调试能力。
二、问题描述1.分别利用顺序查找和折半查找方法完成查找。
有序表(3,4,5,7,24,30,42,54,63,72,87,95)输入示例:请输入查找元素:52输出示例:顺序查找:第一次比较元素95第二次比较元素87 ……..查找成功,i=**/查找失败折半查找:第一次比较元素30第二次比较元素63 …..2.利用序列(12,7,17,11,16,2,13,9,21,4)建立二叉排序树,并完成指定元素的查询。
输入输出示例同题1的要求。
三、数据结构设计(选用的数据逻辑结构和存储结构实现形式说明)(1)逻辑结构设计顺序查找和折半查找采用线性表的结构,二叉排序树的查找则是建立一棵二叉树,采用的非线性逻辑结构。
(2)存储结构设计采用顺序存储的结构,开辟一块空间用于存放元素。
(3)存储结构形式说明分别建立查找关键字,顺序表数据和二叉树数据的结构体进行存储数据四、算法设计(1)算法列表(说明各个函数的名称,作用,完成什么操作)序号 名称 函数表示符 操作说明1 顺序查找 Search_Seq 在顺序表中顺序查找关键字的数据元素2 折半查找 Search_Bin 在顺序表中折半查找关键字的数据元素3 初始化 Init 对顺序表进行初始化,并输入元素4 树初始化 CreateBST 创建一棵二叉排序树5 插入 InsertBST 将输入元素插入到二叉排序树中6 查找 SearchBST在根指针所指二叉排序树中递归查找关键字数据元素 (2)各函数间调用关系(画出函数之间调用关系)typedef struct { ElemType *R; int length;}SSTable;typedef struct BSTNode{Elem data; //结点数据域 BSTNode *lchild,*rchild; //左右孩子指针}BSTNode,*BSTree; typedef struct Elem{ int key; }Elem;typedef struct {int key;//关键字域}ElemType;(3)算法描述int Search_Seq(SSTable ST, int key){//在顺序表ST中顺序查找其关键字等于key的数据元素。
数据结构实验报告实验第四章:实验:简单查找算法一.需求与规格说明:查找算法这里主要使用了顺序查找,折半查找,二叉排序树查找与哈希表查找四种方法。
由于自己能力有限,本想实现其她算法,但没有实现.其中顺序查找相对比较简单,折半查找参考了书上得算法,二叉排序树查找由于有之前做二叉树得经验,因此实现得较为顺利,哈希表感觉做得并不成功,感觉还就是应该可以进一步完善,应该说还有很大得改进余地。
二.设计思想:开始得时候提示输入一组数据。
并存入一维数组中,接下来调用一系列查找算法对其进行处理。
顺序查找只就是从头到尾进行遍历。
二分查找则就是先对数据进行排序,然后利用三个标志,分别指向最大,中间与最小数据,接下来根据待查找数据与中间数据得比较不断移动标志,直至找到。
二叉排序树则就是先构造,构造部分花费最多得精力,比根节点数据大得结点放入根节点得右子树,比根节点数据小得放入根节点得左子树,其实完全可以利用递归实现,这里使用得循环来实现得,感觉这里可以尝试用递归.当二叉树建好后,中序遍历序列即为由小到大得有序序列,查找次数不会超过二叉树得深度。
这里还使用了广义表输出二叉树,以使得更直观。
哈希表则就是利用给定得函数式建立索引,方便查找.三.设计表示:四.实现注释:其实查找排序这部分与前面得一些知识联系得比较紧密,例如顺序表得建立与实现,顺序表节点得排序,二叉树得生成与遍历,这里主要就是中序遍历.应该说有些知识点较为熟悉,但在实现得时候并不就是那么顺利。
在查找到数据得时候要想办法输出查找过程得相关信息,并统计。
这里顺序查找与折半查找均使用了数组存储得顺序表,而二叉树则就是采用了链表存储得树形结构。
为了直观起见,在用户输入了数据后,分别输出已经生成得数组与树。
折半查找由于只能查找有序表,因此在查找前先调用函数对数据进行了排序。
在查找后对查找数据进行了统计.二叉排序树应该说由于有了之前二叉树得基础,并没有费太大力气,主要就是在构造二叉树得时候,要对新加入得节点数据与跟数据进行比较,如果比根节点数据大则放在右子树里,如果比根节点数据小则放入左子树。
实验五查找得实现一、实验内容1、建立一个线性表,对表中数据元素存放得先后次序没有任何要求.输入待查数据元素得关键字进行查找。
为了简化算法,数据元素只含一个整型关键字字段,数据元素得其余数据部分忽略不考虑.建议采用前哨得作用,以提高查找效率。
2、查找表得存储结构为有序表,输入待查数据元素得关键字利用折半查找方法进行查找.此程序中要求对整型量关键字数据得输入按从小到大排序输入。
二、源代码与执行结果1、#include〈iostream>using namespace std;#define MAX 100#define KeyType inttypedef struct{KeyType key ;}DataType;typedef struct{ﻩDataType elem[MAX] ;intlength ;}SeqTable ,*PSeqTable ;PSeqTable Init_SeqTable(){ﻩPSeqTable p =(PSeqTable)malloc(sizeof(SeqTable)) ;ﻩif(p !=NULL){p->length = 0 ;ﻩreturnp;}ﻩelse{ﻩcout〈<"Outof space!”〈〈endl ;ﻩreturn NULL;ﻩ}}int insert_SeqTable(PSeqTable p,KeyType x){if(p->length〉= MAX)ﻩ{ﻩcout〈<”overflow!"<<endl ;ﻩreturn 0 ;ﻩ}p—>elem[p—>length]、key= x ;p-〉length++;return 1 ;}int SeqSearch(SeqTable s ,KeyTypek){ﻩint n , i = 0;ﻩn = s、length ;s、elem[n]、key =k ;ﻩwhile(s、elem[i]、key != k)ﻩﻩi ++ ;ﻩif(i == n)return —1 ;elseﻩﻩreturn i ;}voidmain(){PSeqTable p ;inti , n;ﻩKeyType a ;p =Init_SeqTable();ﻩcout<〈"请输入数据个数:" ;cin>>n ;cout〈<"请输入数据:”<〈endl ;for(i = 0 ; i< n ;i++)ﻩ{ﻩcin〉>a ;ﻩinsert_SeqTable(p , a);}ﻩcout<<"请输入要查找得数据,输入32767结束:” ;cin〉〉a ;ﻩwhile(a != 32767)ﻩ{i =SeqSearch(*p, a) ;if(i == -1){ﻩﻩﻩcout<<”无此数据!请重新输入:"<〈endl ;ﻩﻩcin>>a ;ﻩ}ﻩﻩelseﻩﻩ{ﻩcout<〈"该数据得位置就是:"〈<i+1<<endl;ﻩcout〈<"请输入要查找得数据:" ;ﻩﻩcin〉〉a;ﻩ}ﻩ}}2、#include<iostream>using namespace std;#define MAX 100#define KeyType inttypedef struct{KeyType key ;}DataType;typedef struct{ﻩDataType elem[MAX] ;ﻩint length ;}BinTable ,*PBinTable ;PBinTable Init_BinTable(){ﻩPBinTable p = (PBinTable)malloc(sizeof(BinTable)) ;if(p != NULL){p->length= 0;ﻩﻩreturn p ;ﻩ}elseﻩ{ﻩcout〈<"Out of space!"〈<endl ;return NULL ;ﻩ}}int insert_BinTable(PBinTable p ,KeyType x){if(p—〉length >= MAX){ﻩcout<<"overflow!”<〈endl ;ﻩreturn 0 ;ﻩ}ﻩp-〉elem[p—>length]、key =x ;p->length ++ ;ﻩreturn 1;}int BinSearch(BinTable s ,KeyType k){ﻩint low,mid , high;ﻩlow = 0 ;high = s、length-1 ;while(low <= high){ﻩﻩmid=(low+high)/2 ;ﻩif(s、elem[mid]、key== k)ﻩﻩﻩreturnmid;ﻩelse if(s、elem[mid]、key >k)ﻩﻩhigh= mid- 1 ;ﻩﻩelseﻩlow = mid +1 ;ﻩ}ﻩreturn —1;}void main(){PBinTable p ;ﻩinti ,n ;ﻩKeyType a;p =Init_BinTable();cout<<”请输入数据个数:”;cin〉>n;ﻩcout<〈"请按从小到大得顺序输入数据:”〈<endl;for(i = 0 ;i〈 n; i ++)ﻩ{cin>〉a;ﻩinsert_BinTable(p,a);}ﻩcout<<"请输入要查找得数据,输入32767结束:” ;ﻩcin〉>a ;while(a!= 32767){ﻩi =BinSearch(*p , a);if(i ==-1)ﻩ{ﻩﻩcout〈〈"无此数据!请重新输入:"〈〈endl ;cin>>a;ﻩ}ﻩelse{ﻩcout<<"该数据得位置就是:”〈<i+1〈<endl ;ﻩﻩﻩcout<〈”请输入要查找得数据:" ;cin>〉a ;}ﻩ}}。
数据结构实验报告折半查找1. 引言数据结构是计算机科学中非常重要的一门课程,它研究的是数据的组织方式、存储结构和算法设计等内容。
在数据结构中,折半查找(Binary Search)是一种常用的查找算法,可以在有序的数据集合中快速找到目标元素。
本实验报告将介绍折半查找算法的原理、实现过程以及在不同数据规模下的性能分析。
2. 折半查找原理折半查找是一种分而治之的算法,通过比较目标元素与中间元素的大小关系,不断将待查找范围缩小一半,并在所需的时间内逐步逼近目标元素。
具体的折半查找算法如下:1. 设置左边界l和右边界r,初始时l=0,r=n-1(n为数据集合的长度);2. 计算中间元素的下标mid = (l + r) / 2;3. 比较目标元素与中间元素的值,若相等,则返回目标元素的下标;4. 若目标元素小于中间元素的值,则将右边界r更新为mid-1;5. 若目标元素大于中间元素的值,则将左边界l更新为mid+1;6. 重复步骤2-5,直到找到目标元素或区间缩小为空。
折半查找的时间复杂度为O(log n),比顺序查找的时间复杂度O(n)要小得多。
3. 折半查找的实现实现折半查找的关键就是要确定好左边界l和右边界r的初始值,并在每个循环中更新这两个边界的值。
下面是使用Python语言实现折半查找的代码示例:```pythondef binary_search(arr, target):l = 0r = len(arr) - 1while l <= r:mid = (l + r) // 2if arr[mid] == target:return midelif arr[mid] < target:l = mid + 1else:r = mid - 1return -1```在上述代码中,我们通过设置左边界l和右边界r来确定待查找范围。
通过不断更新这两个边界的值,最终可以找到目标元素的位置。
如果找不到目标元素,则返回-1表示查找失败。
深圳大学实验报告课程名称:数据结构实验项目名称:查找排序之折半查找学院:信息工程学院专业:电子信息工程指导教师:报告人:学号:2009100000 班级:电子1班实验时间:2011年12月2日实验报告提交时间:2011年12月13日教务处制//调用函数Search_Bin,并将函数返回结果放在i中i = Search_Bin(Data, Dnum, skey);printf("----------------------------------------\n");if(i==-1) //若Search_Bin返回值为-1则显示查找失败printf("查找失败!\n");else //不然则执行下面语句{printf("查找成功!\n");printf("查找的数据位置在(%d)\n",i);}printf("查找次数(%d)",icount);printf("\n");return 0;}四、实验结论:实结果图:情况一、能够在待查数组中查找到待查元素情况二、不能够在待查数组中查找到待查元素数据分析基于上面程序运行图可以很明显得知整个算法的实现过程,针对第一个图:1、首先建立一个数组存放待查元素2、针对定值key进行折半查找,第一个图可以得到key=113、mid=(low+high)/2 =(0+5)/2 =2.得到的是ST[2]=33,查找了一次4、判断ST[2]=33大于key=11,即执行high=mid-1=15、mid=(low+high)/2 =(0+1)/2 =0.得到的是ST[0]=11=key,查找成功,查找了两次6、返回待查元素所在位置7、同理。
若查找不成功则返回查找失败五、实验体会:本次实验很简单,只要掌握折半查找算法的原理,那么剩下的就是花时间编写代码和调试程序。
一、实验目的1. 理解折半查找算法的基本原理。
2. 掌握折半查找算法的实现方法。
3. 分析折半查找算法的时间复杂度和空间复杂度。
4. 比较折半查找算法与顺序查找算法的性能差异。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验原理折半查找算法,又称二分查找算法,是一种在有序数组中查找特定元素的算法。
其基本原理是将待查找的元素与数组的中间元素进行比较,若相等,则查找成功;若小于中间元素,则在数组的左半部分继续查找;若大于中间元素,则在数组的右半部分继续查找。
重复此过程,直到找到目标元素或查找失败。
折半查找算法的时间复杂度为O(log2n),空间复杂度为O(1)。
四、实验步骤1. 创建一个有序数组。
2. 实现折半查找算法。
3. 比较折半查找算法与顺序查找算法的性能差异。
五、实验代码```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 -1def sequential_search(arr, target):for i in range(len(arr)):if arr[i] == target:return ireturn -1# 创建有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]# 查找目标元素target = 7# 折半查找index_binary = binary_search(arr, target)# 顺序查找index_sequential = sequential_search(arr, target) # 比较性能import timestart_time = time.time()binary_search(arr, target)end_time = time.time()binary_time = end_time - start_timestart_time = time.time()sequential_search(arr, target)end_time = time.time()sequential_time = end_time - start_timeprint(f"折半查找结果:索引 {index_binary}")print(f"顺序查找结果:索引 {index_sequential}")print(f"折半查找耗时:{binary_time} 秒")print(f"顺序查找耗时:{sequential_time} 秒")```六、实验结果与分析1. 折半查找结果:索引 32. 顺序查找结果:索引 33. 折半查找耗时:0.0002 秒4. 顺序查找耗时:0.0005 秒实验结果表明,折半查找算法在查找相同目标元素时,耗时明显低于顺序查找算法。
折半查找的实验报告折半查找的实验报告引言:在计算机科学领域,查找是一项基本操作。
而折半查找,也被称为二分查找,是一种高效的查找算法。
本实验旨在通过实际操作和数据分析,探究折半查找算法的原理和性能。
实验设计:本次实验使用C++语言来实现折半查找算法,并通过编写测试程序来验证算法的正确性和性能。
我们使用了一个已排序的整数数组,其中包含了10000个元素。
实验过程中,我们将记录算法的查找次数和运行时间,并与线性查找算法进行对比。
实验步骤:1. 首先,我们定义一个包含10000个已排序整数的数组,并选择一个待查找的目标值。
2. 接下来,我们实现折半查找算法。
该算法的基本思想是将待查找的目标值与数组的中间元素进行比较,如果相等则返回找到的位置,如果目标值小于中间元素,则在左半部分继续查找,否则在右半部分继续查找。
重复这个过程,直到找到目标值或者确定目标值不存在。
3. 我们编写测试程序,分别使用折半查找算法和线性查找算法来查找目标值,并记录查找次数和运行时间。
4. 重复多次实验,以获得更准确的结果。
同时,我们还可以改变目标值的位置,观察算法的性能变化。
实验结果:经过多次实验,我们得到了如下结果:- 折半查找算法的平均查找次数为log2(10000)≈13次,而线性查找算法的平均查找次数为10000次。
- 折半查找算法的平均运行时间为0.0001秒,而线性查找算法的平均运行时间为0.01秒。
- 当目标值位于数组的中间位置时,折半查找算法的性能最佳;而当目标值位于数组的两端时,折半查找算法的性能最差。
讨论与分析:通过对实验结果的分析,我们可以得出以下结论:1. 折半查找算法的时间复杂度为O(log n),而线性查找算法的时间复杂度为O(n)。
因此,折半查找算法在大规模数据中的查找效率远高于线性查找算法。
2. 折半查找算法适用于已排序的数据集,而线性查找算法对数据集的有序性没有要求。
因此,在已排序的数据集中使用折半查找算法可以提高查找效率。
深圳大学实验报告
课程名称:数据结构
实验项目名称:查找排序之折半查找
学院:信息工程学院
专业:电子信息工程
指导教师:
报告人:学号:2009100000 班级:电子1班实验时间:2011年12月2日
实验报告提交时间:2011年12月13日
教务处制
printf("\n");
return 0;
}
四、实验结论:
实结果图:
情况一、能够在待查数组中查找到待查元素
情况二、不能够在待查数组中查找到待查元素
数据分析
基于上面程序运行图可以很明显得知整个算法的实现过程,针对第一个图:
1、首先建立一个数组存放待查元素
2、针对定值key进行折半查找,第一个图可以得到key=11
3、mid=(low+high)/2 =(0+5)/2 =2.得到的是ST[2]=33,查找了一次
4、判断ST[2]=33大于key=11,即执行high=mid-1=1
5、mid=(low+high)/2 =(0+1)/2 =0.得到的是ST[0]=11=key,查找成功,查找了两次。
THANKS !!!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考
-可编辑修改-。