算法学习之查找算法:静态查找表(2)有序表查找
来源:互联网 发布:多个表格数据汇总 编辑:程序博客网 时间:2024/06/05 17:30
如果静态查找表是一个有序表,则可以使用折半查找。
折半查找的过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止。
关键字key与表中某一元素array[i]比较,有3种情况:
1、key==array[i],查找成功
2、key > array[i],待查找元素可能的范围是array[i]之前
3、key < array[i],待查找元素可能的范围是array[i]之后
以如下有序表为例,分析折半查找的方法。
有序表如下:(05,13,19,21,37,56,64,75,80,88,92)
<一>查找有序表中存在的关键字,如查找21,查找过程如下:
(05,13,19,21,37,56,64,75,80,88,92)
↑ ↑ ↑
low = 0 mid = (low + high)/2 = 5 high = 10
① 因为array[mid] = 56 > 21,则令high = mid - 1; 说明待查元素若存在,必在区间[low, mid - 1]的范围内。
(05,13,19,21,37,56,64,75,80,88,92)
↑ ↑ ↑
low mid high = 5
②因为array[mid] = 19 < 21,则令low = mid + 1; 说明待查元素若存在,必在区间[mid + 1, high]的范围内。
(05,13,19,21,37,56,64,75,80,88,92)
↑ ↑
low/mid high = 5
③ 因为array[mid] = 21,说明待查元素存在。
<二>查找有序表中不存在的关键字,如查找85,查找过程如下:
(05,13,19,21,37,56,64,75,80,88,92)
↑ ↑ ↑
low = 0 mid = (low + high)/2 = 5 high = 10
① 因为array[mid] = 56 < 85,则令low = mid + 1; 说明待查元素若存在,必在区间[mid + 1, high]的范围内。
(05,13,19,21,37,56,64,75,80,88,92)
↑
low mid high
②因为array[mid] = 80 < 85,则令low = mid + 1; 说明待查元素若存在,必在区间[mid + 1, high]的范围内。
(05,13,19,21,37,56,64,75,80,88,92)
↑
low/mid high
③ 因为array[mid] = 88 > 85,则令high = mid - 1; 说明待查元素若存在,必在区间[low, mid -1]的范围内。
因为此时high小于low,所以查找失败。
有序表的折半查找C语言实现如下:
/*********************************************************************Author:李冰 date:2014-9-24Email:libing1209@126.com*********************************************************************/typedef int ElemType;#define EQ(a, b) ((a) == (b))#define LT(a, b) ((a) < (b))#define LQ(a, b) ((a) <= (b))int Search_Bin(ElemType array[], int num, int length){int index_low, index_mid, index_high;index_low = 1; index_high = length;while(index_low <= index_high){index_mid = (index_low + index_high) / 2;if(EQ(num, array[index_mid])) return index_mid + 1;else if(LT(num , array[index_mid])) index_high = index_mid - 1;else index_low = index_mid + 1;}return -1;}
适用范围:对于规模较大的有序表查找,效率较高。适合很少改动但经常查找的表。
优点:
1、折半查找的效率比顺序查找要高。
2、折半查找的时间复杂度为log2(n)
3、折半查找的平均查找长度为log2(n+1) - 1
缺点:
1、折半查找只适用于有序表
2、折半查找限于顺序存储结构,对线性链表无法有效地进行折半查找
- 算法学习之查找算法:静态查找表(2)有序表查找
- 算法学习之查找算法:静态查找表(1)顺序表查找
- 有序表查找优化算法
- 查找算法(静态查找)
- 查找算法总结之静态查找算法
- 概率算法之Sherhood算法 有序表的查找
- 查找算法整理(一)---静态查找表:顺序表查找、折半(判定树)查找、静态查找树
- 查找算法-顺序查找、有序查找
- 查找算法总结之一(静态查找表)
- 数据结构中的查找算法-静态查找表(1)
- 【数据结构】算法9.2 有序表查找-折半查找
- 算法:有序表的二分查找
- 有序表折半查找的递归算法
- [算法]有序二分查找
- 算法:静态查找表(Static Search Table)(顺序查找、二分查找、插值查找、斐波纳契查找)
- 查找算法之线性表查找
- 静态查找表(二)有序表的查找
- 查找之静态查找表
- Python 模块学习:os模块
- hdu 5017 Ellipsoid 模拟退火算法模板
- XP下安装Centos 6.4 双系统 :Linux系统分区及挂载点,关键引导程序启动设置
- JSP编程技术基础1-JSP运行环境的配置
- Universal-Image-Loader(android图片缓存)
- 算法学习之查找算法:静态查找表(2)有序表查找
- 东软学习,strut2初级学习的部分截图和笔记(九)-公用配置以及国际化
- android fragment 重复创建的问题
- c#关机
- new malloc
- 读《从1.5k到18k, 一个程序员的5年成长之路》有感
- C常见标准库函数实现
- dp-整数划分问题(理论分析)
- 【第一章 绪论导图】