MIT6_006F11_lec01習題

 

MIT6.006是Algo Intro這門課,據說語言使用python

Lec01是講peak finding,也就是峯值點

具體爲:

一維情況下一個數組中a[i]>a[i-1]且a[i]>a[i+1]那麼它是peak  邊界時檢查一個方向就ok

 

二維情況下需要某元素x比四個相鄰元素都大,邊界也類似一維去處理

只要找到一個peak返回就好

複雜度:

一維用二分,log n

二維先二分,二分後的一維數組遍歷一下,所以是O(n*log n)

二維的算法步驟:

代碼:

# peakfinder in 1D condition
def peakfinder(a):
    # a is a list. you can also treat it as an array
    n = len(a)/2
    while True:
        if n!=0 and n!=len(a):
             if a[n/2] < a[n/2-1]:
                 #look at left half
                peakfinder(a[:n/2])
            elif a[n/2] < a[n/2+1]:
                #look at right half
                peakfinder(a[n/2+1:])
            else:
                return a[n/2]
        elif n == 0:
            if a[0]>a[1]:return a[0]
            else:return a[1]
        elif n == len(a):
            if a[n]>a[n-1]:return a[n]
            else:return a[n-1]
  
# peakfinder in 2D condition

def globalMaxIndex(b):
    # you can assum b is a 1-D array
    key = 0
    val = b[0]
    blen = len(b)
    for j in (1,blen):
        if b[j] > val:
            key = j
            val = b[j]
    return key


def peakFinder(a):
    # a is a 2D-list 二維方格
    j = len(a)/2

    i = globalMaxIndex(a[j])
    # get the global max value in the j-th line
    if j!=0 and j!=len(a):
        if a[j-1][i] > a[j][i]:
            # 檢查上半部分
            return peakFinder(a[:j])
        elif a[j+1][i] > a[j][i]:
            # 檢查下半部分
            return peakFinder(a[j+1:])
        else:
            return a[j][i]
    elif j==0:
        if a[0][i]>a[1][i]:return a[0][i]
        else:return a[1][i]
    elif j==len(a):
        if a[n-1][i]>a[n][i]:return a[n-1][i]
        else:return a[n][i]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章