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]