数据结构学习笔记(10)---基于线性表的查找
来源:互联网 发布:json version 编辑:程序博客网 时间:2024/06/05 23:43
(1)顺序查找
顺序查找比较简单,其思路就是从顺序表的头部或者尾部依次查找数组,直到查找数值为止。其平均查找长度为:ASL = (n+1)/2
代码如下:
int SearchByIndex(int* arr,int length,int key){ while (-1 != --length) { if (key == arr[length]) { return length; } } return length;}
(2)折半查找
思路:折半查找的前提条件是该顺序表必须是有序的,先取该数组的中间值进行比较,如果大于该值则说明要查找的数值肯定是在其右边,如果小于该值说明查找的值肯定在其左边,依次循环下去,可定会找到存在的值。其平均查找长度为:ASL = log2(n+1)-1
代码如下:
int Search_Bin(int* arr, int length, int key){ int low = 0, high = length - 1,mid = (high + low) / 2; while (low<=high) { if (key == arr[mid]) { return mid; } else if (key < arr[mid]) { high = mid - 1; mid = (high + low) / 2; } else { low = mid + 1; mid = (high + low) / 2; } } cout << "不存在" << endl; return -1;}
(3)块查找
思路:分块查找要求把一个大的线性表分解成若干块,每块中的节点可以任意存放,但块与块之间必须排序。假设是按关键码值非递减的,那么这种块与块之间必须满足已排序要求,实际上就是对于任意的i,第i块中的所有节点的关键码值都必须小于第i+1块中的所有节点的关键码值。此外,还要建立一个索引表,把每块中的最大关键码值作为索引表的关键码值,按块的顺序存放到一个辅助数组中,显然这个辅助数组是按关键码值费递减排序的。查找时,首先在索引表中进行查找,确定要找的节点所在的块。由于索引表是排序的,因此,对索引表的查找可以采用顺序查找或折半查找;然后,在相应的块中采用顺序查找,即可找到对应的节点。平均查找长度 ASL = Lb + Lw;Lb是查找索引表中关键字的平均查找长度Lb 与 查找每一块顺序查找的平均查找长度 Lw,因此ASL = log2(n/s+1) + s /2 ;
百度百科
实现代码:
struct index /*定义块的结构*/{ int key; int start; int end;} index_table[16]; /*定义结构体数组*/int block_search(int key, int a[]) /*自定义实现分块查找*/{ int i, j; i = 1; while (i <= 3 && key > index_table[i].key) /*确定在那个块中*/ i++; if (i > 3) /*大于分得的块数,则返回0*/ return 0; j = index_table[i].start; /*j等于块范围的起始值*/ while (j <= index_table[i].end && a[j] != key) /*在确定的块内进行查找*/ j++; if (j > index_table[i].end) /*如果大于块范围的结束值,则说明没有要查找的数,j置0*/ j = 0; return j;}void Creat(){ int i, j = 0, k, key, a[16]; cout<<"please input the number:\n"; for (i = 1; i < 16; i++) cin>>a[i]; /*输入由小到大的15个数*/ for (i = 1; i <= 3; i++) { index_table[i].start = j + 1; /*确定每个块范围的起始值*/ j = j + 1; index_table[i].end = j + 4; /*确定每个块范围的结束值*/ j = j + 4; index_table[i].key = a[j]; /*确定每个块范围中元素的最大值*/ } cout<<"please input the number which do you want to search:\n"; cin>>key; /*输入要查询的数值*/ k = block_search(key, a); /*调用函数进行查找*/ if (k != 0) cout<<k; /*如果找到该数,则输出其位置*/ else cout <<"no found!"; /*若未找到则输出提示信息*/}}
阅读全文
0 0
- 数据结构学习笔记(10)---基于线性表的查找
- 【学习笔记----数据结构23-线性索引查找】
- 数据结构学习笔记吧(11)---基于树的查找
- 数据结构学习---线性表;树;哈希表进行查找的区别
- 数据结构-线性表(学习笔记)
- 数据结构学习笔记-线性表
- 查找-基于线性表
- 基于线性表的查找法
- 数据结构学习笔记——线性表的逻辑结构
- 严蔚敏数据结构学习笔记二.线性表
- 数据结构学习笔记(2)线性表
- 数据结构学习笔记 --- 线性表 (单链表)
- 《数据结构》学习笔记--第二章 线性表
- 数据结构学习笔记---线性表LIST
- 数据结构-链式线性表(学习笔记)
- 数据结构-----线性表学习笔记(一)
- 【学习笔记----数据结构02--线性表】
- 【学习笔记----数据结构03--线性链表】
- OKhttp上传图片
- okhttp的简单封装
- 微信小程序商城系统出售
- gcc 编译流程
- Android构建前台服务,以及PendingIntent返回到当前活动的解决办法
- 数据结构学习笔记(10)---基于线性表的查找
- for 循坏
- A Simple Math Problem(最小公倍数最大公约数变形应用)
- leetcode 94. Binary Tree Inorder Traversal
- 安装JDK、Java环境变量设置以及JVM、JRE和JDK的区别
- Sybase 系统存储过程
- 数据结构学习笔记吧(11)---基于树的查找
- Spring boot—— Starter详解
- Struts2基本知识