问题

给出一个长度为的按升序排序的序列,询问一个数在序列中的出现位置,若未出现,则返回

解析

顺序查找

对于给定一个长度为的序列,要在其中寻找一个数,最简单的方法就是逐个遍历,当匹配到相应数后,返回对应下标,如果没有找到,则返回

二分查找

由于给出的是一个按升序排序的序列,对于任意的下标,如果则所有的均不符合条件,每次可以尝试序列的中间项,每次查找问题规模缩小一半,找到值后返回,若问题规模缩小到时还没有找到答案,则返回

设计

顺序查找

search(a[],len,x)
    for i=1;i<=len;++i
        if a[i]==x:
            return i
        if a[i]>x:
            return 0
    return 0

二分查找

search(a[],len,x)
    l=1,r=len
    while l<=r:
        mid=(l+r)/2
        if a[mid]>=x:
            r=mid-1
        else
            l=mid+1
    if l>len
        return 0
    return l

分析

顺序查找

最优情况:
显然,当查找的元素正好是第一项的时候,顺序查找可以在的复杂度内找到答案
最差情况:
显然,当不存在该元素,且该元素大于序列内所有数时,顺序查找需要遍历所有项,复杂度为
平均:
设对于任意一个元素,序列中有个小于等于它的项,则找到需要次枚举
考虑对于其中的每一项,需要查找次,则对于整个序列,总查找次数为,平局每一个的查找次数为
则平均复杂度为

二分查找

每次查找时,至少会抛去大小的区间,也就是说每一次问题规模缩小一般
记作问题规模为时的复杂度,可以列出表达式


所以问题就变成了一个数可以多少次,显然是
所以最后的复杂度为

源码

传送门