查找->静态查找表->折半查找(有序表)
文字描述
以有序表表示静态查找表时,可用折半查找算法查找指定元素。
折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止。
示意图
算法分析
折半查找过程可以用一颗二叉判定树来表示,而具有n个结点的判定树的深度为[log2n]+1,所以折半查找法在查找成功和不成功时,与给定值进行比较的关键字个数都不会超过[log2n]+1. 现讨论折半查找算法的平均查找长度。
为讨论方便,假设有序表长度为n=2h-1,则描述折半查找的判定树是深度为h的满二叉树。假设每个记录的查找概率相等Pi = 1/n, 则折半查找查找成功的平均查找长度
当n足够大时,平均查找长度约为log2(n+1)-1 可见,折半查找的效率比顺序查找要高,但是折半查找只适用于有序表,且限于顺序存储结构,对线性链表无法有效地进行折半查找。
代码实现
/*
./a.out 5 13 19 21 37 56 64 75 80 88 92
*/
#include <stdio.h>
#include <stdlib.h> #define EQ(a, b) ((a) == (b))
#define LT(a, b) ((a) < (b))
#define LQ(a, b) ((a) <= (b))
#define MAX_SIZE 50
#define DEBUG typedef int KeyType;
typedef char InfoType;
/*数据元素类型定义*/
typedef struct{
//关键字域
KeyType key;
//其他域
InfoType otherinfo;
}ElemType;
/*静态查找表的顺序存储结构*/
typedef struct{
//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
ElemType *elem;
//表长度
int length;
}SSTable; /*折半查找算法
*
*顺序表中的元素应该按照由小到大顺序排列.
*
*在顺序表ST中顺序查找其关键字等于key的数据元素。
*若找到,则函数值为该元素在表中的位置,否则为0
*/
int Search_Bin(SSTable ST, KeyType key){
//置区间初值
int low = ;
int high = ST.length;
int mid = (low+high)/;
while(low<=high){
mid = (low+high)/;
if(EQ(ST.elem[mid].key, key)){
//找到待查元素
return mid;
}else if(LT(ST.elem[mid].key, key)){
//继续在后半区间查找
low = mid+;
}else{
//继续在前半区间查找
high = mid-;
}
}
return ;
} //顺序打印顺序表中的数据元素
void print_Seq(SSTable ST){
int i = ;
for(i=; i<= ST.length; i++){
printf("[%d]=%d/%c; ", i, ST.elem[i].key, ST.elem[i].otherinfo);
}
printf("\n");
} int main(int argc, char *argv[])
{
int i = , loc = , key=;
ElemType arr[MAX_SIZE+] = {};
for(i=; i<argc; i++){
arr[i].key = atoi(argv[i]);
arr[i].otherinfo = 'a'+i-;
}
SSTable ST;
ST.length = i-;
ST.elem = arr;
#ifdef DEBUG
printf("输入了数据:");
print_Seq(ST);
#endif
while(){
printf("输入待查找的key值(负值表示结束):");
scanf("%d", &key);
if(key < )
break;
loc = Search_Bin(ST, key);
printf("key值为%d的位置在%d\n", key, loc);
}
return ;
}
折半查找(有序表)
运行
查找->静态查找表->折半查找(有序表)的更多相关文章
- JAVA通过继承线性表来实现有序表
1,对于线性表而言,里面的元素是无序的,可以随意地将新元素增加到线性表中而不需要考虑该元素在线性表中的位置.但是,对于有序表而言,其中的元素是按照某种方式进行排序的,因此在有序表中插入元素时,需要按照 ...
- java数据结构之有序表查找
这篇文章是关于有序表的查找,主要包括了顺序查找的优化用法.折半查找.插值查找.斐波那契查找: 顺序优化查找:效率极为底下,但是算法简单,适用于小型数据查找: 折半查找:又称为二分查找,它是从查找表的中 ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- LeetCode编程训练 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- 算法与数据结构基础 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- java基础-数组的折半查找原理
java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
- 算法学习记录-查找——折半查找(Binary Search)
以前有个游戏,一方写一个数字,另一方猜这个数字.比如0-100内一个数字,看谁猜中用的次数少. 这个里面用折半思想猜会大大减少次数. 步骤:(加入数字为9) 1.因为数字的范围是0-100,所以第一次 ...
- 查找(顺序表&有序表)
[1]查找概论 查找表是由同一类型是数据元素(或记录)构成的集合. 关键字是数据元素中某个数据项的值,又称为键值. 若此关键字可以唯一标识一个记录,则称此关键字为主关键字. 查找就是根据给定的某个值, ...
- 查找->静态查找表->次优查找(静态树表)
文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如 ...
随机推荐
- 15款基于 jQuery模态对话框
在数字世界的竞争已大大增加.这就是为什么要确保网络设计的各个方面都是一流的,这是很重要的.从布局到一些非常小的东西,比如对话框,每一件都需要设计得很好.对话框通常被忽视,但它们可能对访问者有很大的影响 ...
- Ubuntu 卸载重装 IntelliJ Idea Community
参考: https://stackoverflow.com/questions/22983101/how-to-uninstall-intellij-idea-on-ubuntu-13-10 @SLH ...
- emacs快捷键速记表
纯手工打造,O(∩_∩)O哈哈~ * emacs快捷键速记表 ** 帮助*** C-h l 显示最后100个键入的内容*** C-h b 显示当前缓冲区所有可用的快捷键*** C-h t 打开emac ...
- 【转】XML 特殊字符处理
from: http://gdutlzh.blog.163.com/blog/static/164746951201222934328455/ 1. 在XML文件中,如果内容包含一些特殊字符会导致XM ...
- 第三百九十九节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装mysql5.6
第三百九十九节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装mysql5.6 1.检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除,否则第4步 ...
- Linux权限详解 命令之 chmod:修改权限
权限简介 Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功. Linux下文件的权限类型一般包括读,写,执行.对应字母为 r.w.x. Li ...
- iOS手机淘宝加入购物车动画分析
本文转载至 http://www.jianshu.com/p/e77e3ce8ee24 1.最终效果 仿淘宝动画 2.核心代码 _cartAnimView=[[UIImageView alloc] i ...
- 【租房合同】2017北京市房屋租赁合同(自行成交版).doc
最近在北京租房,找租房合同 这个文档还是比较新的,在百度文库上需要积分下载的文档,现在共享给大家吧. 下载地址: https://pan.baidu.com/s/1cEh7lhBqQgkJhB32Df ...
- Android Studio设置代理,解决检查更新gradle信息的问题
Android Studio是基于JetBrains公司的IDEA开发的,Android Studio里的项目都是由Gradle构建的,Gradle集合了Ant和Maven的优点,又解决了他们的缺点, ...
- libuv示例代码
https://github.com/nikhilm/uvbook/tree/master/code