数据结构第三周笔记(2)——树(上)(慕课浙大版本--XiaoYu)

108 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

3.1.2 引子(二分查找例子)

方法3:二分查找(Binary Search)

使用前提:有序存放

image-20220630133518543

例子:假设有13个数据元素,按关键字由小到大顺序存放,二分查找关键字为444的数据元素过程如下:

image-20220630133710273

image-20220630133856929

image-20220630134122043

两个边界分别是leftright
具体过程数据就不展示了,用图片展示出来了,减少我的工作量
在13个元素的二分查找中,找第10个元素比找第8个元素快?对

例子2:仍然以上面13个数据元素构成的有序线性表为例,二分查找关键字为43的数据元素如下:

image-20220630134238735

image-20220630134317471

image-20220630134845190

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
​
在二分查找的程序实现中,如果leftright的更新不是取mid+1和mid-1而是都取mid,程序也是正确的?当然是错误的啦
    
​
//List定义: List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。使用时需要添加头文件 #include

二分查找算法具有对数的时间复杂度O(logN)

11个元素的二分查找判定树

image-20220630141214141

二分查找的启示

  1. 判定树上每个结点需要的查找次数刚好为该结点所在的层数
  2. 查找成功时的查找次数不会超过判定树的深度
  3. n个结点的判定树的深度是[log2n]+1 (这里的2是下标)
  4. ASL(平均成功查找次数) = (4 * 4 + 4 * 3 + 2 * 2 +1)/11 = 3