开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
3.1.2 引子(二分查找例子)
方法3:二分查找(Binary Search)
使用前提:有序存放
例子:假设有13个数据元素,按关键字由小到大顺序存放,二分查找关键字为444的数据元素过程如下:
两个边界分别是left跟right
具体过程数据就不展示了,用图片展示出来了,减少我的工作量
在13个元素的二分查找中,找第10个元素比找第8个元素快?对
例子2:仍然以上面13个数据元素构成的有序线性表为例,二分查找关键字为43的数据元素如下:
3.1.3 引子(二分查找实现)
二分查找算法
int BinarySearch(List Tbl,ElementType K)//List Tbl是结构的指针,包含了数组Element和它的大小Length
{
//在表Tbl中查找关键字为K的数据元素
int left,right,mid,NoFound = -1;
left = 1;//初始左边界
right = Tbl->Length//初始右边界
while(left <= right)
{
mid = (left + right)/2 //计算中间元素坐标
if(K < Tbl->Element[mid]) right = mid - 1;//调整右边界
else if(K > Tbl->Element[mid]) left = mid + 1;//调整左边界
else return mid;//查找成功,返回数据元素下标
}
return NotFound;//查找不成功,返回-1
}
所以我们就return NotFound
在二分查找的程序实现中,如果left和right的更新不是取mid+1和mid-1而是都取mid,程序也是正确的?当然是错误的啦
//List定义: List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。使用时需要添加头文件 #include
二分查找算法具有对数的时间复杂度O(logN)
11个元素的二分查找判定树
二分查找的启示:
- 判定树上每个结点需要的查找次数刚好为该结点所在的层数
- 查找成功时的查找次数不会超过判定树的深度
- n个结点的判定树的深度是[log2n]+1 (这里的2是下标)
- ASL(平均成功查找次数) = (4 * 4 + 4 * 3 + 2 * 2 +1)/11 = 3