数据结构与算法(二):寻找峰值

一维:

峰值规定:a[i]>a[i-1] and a[i]>a[i+1],假定只存在一个峰值

1 2 1 9 5 0

 

 

例如9就是一个峰值

方法一:顺序遍历,时间复杂度O(n)

方法二:分治策略,将列表折半查找,第一次查找n/2,左右两边哪一边大继续折半查找哪一边

def search_peak(alist):
    l=0
    r=len(alist)-1
    while l<=r:
        mid=(l+r)//2
        if mid==0 or mid==len(alist)-1:
            return mid
        else:
            if alist[mid]<alist[mid-1]:
                r=mid-1
            elif alist[mid]<alist[mid+1]:
                l=mid+1
            else:
                return mid
    return -1
    
print(search_peak([1,1,1,1,1,2,3,5,7,9]))

这种写法并未考虑相邻两数相等情况的处理,并且只能处理查找一个峰值的情况,如果查找多个峰值,即使利用二分查找复杂度仍然会降为O(n)

时间复杂度分析:

1,首先进行一次折半得:T(n) = T(n/2) + O(1) 

2,n为剩余元素,O(1)代表进行一次比较

3,再次进行折半得:T(n) =  T(n/4) + O(1) *2

4,以此类推得:T(n) = T(n/2^k)+O(1)*k  #注意前面是幂,后面乘

5,令n/2^k=1(表示最后剩下一个元素)得:k=log2n

所以T(n) = O(1)*log2n = O(logn)

 

 

上一篇:排序与搜索


下一篇:2020.3.11---Python作业记录