求二維數組局部峯值(python)

思路

求二維數組局部的峯值,僅一個即可。將二維數組由“田”字進行分割,尋找“田”中的最大值,確定下一步遞歸的方位,不斷拆分,直到找到需要的值。
參考博客python分治法求二維數組局部峯值
與該博客相比,不做加0處理,允許長方形數組
此處找到數字7[4,2]

繼續進行查找

f = open('finename','r')
lines = []
for line in f.readlines():
    line = line.strip('\n').split(" ")
    line = list(map(int,line))
    print(line)
    lines.append(line)

#在多個列中找到最大值
def max_sit(n):
    position = [0,0]
    temp = 0
    for i in range(len(n)):
        for j in range(len(n[i])):
            if(n[i][j]>temp):
                temp = n[i][j]
                position[0] = i
                position[1] = j
    return position

#在一個列中找到最大值
def max_find(*n):
    temp = 0
    a = 0
    for i in range(len(n)):
        if(n[i]>temp):
            temp = n[i]
            a = i
    return a

#遞歸,選出拿去比較的列表
def dp(sx,sy,ex,ey):
    mx = int((ex-sx)/2)+sx
    my = int((ey-sy)/2)+sy
   # print("mx = "+str(mx)+" my = "+str(my))
    prepare = []
    prepare.append(lines[sx])#橫上0
    prepare.append(lines[mx])#橫中1
    prepare.append(lines[ex])#橫下2
    p1 = []
    p2 = []
    p3 = []
    for i in range(ex-sx+1):
        p1.append(lines[i][sy])#豎左3
        p2.append(lines[i][my])#豎中4
        p3.append(lines[i][ey])#豎右5

    prepare.append(p1)
    prepare.append(p2)
    prepare.append(p3)
    
    #復原
    position = max_sit(prepare)
    x = position[0]
    y = position[1]
    if(x == 0 or x == 1 or x == 2):
        x = int(position[0]*(ex-sx)/2)
    else:
        x = y
        y = int((position[0]-3)*(ey-sy)/2)
    #判斷
    t = max_find(lines[x][y],lines[x-1][y],lines[x+1][y],lines[x][y-1],lines[x][y+1])
    if(t==0):
        print("this is answer")
        print("x = "+str(x)+" y = "+str(y))
        return [x,y]
    elif (t==1):
        x-=1
    elif (t==2):
        x+=1
    elif (t==3):
        y-=1
    elif (t==4):
        y+=1    

    if(x<mx):
        ex = mx
    else:
        sx = mx
    if(y<my):
        ey = my
    else:
        sy = my

    return dp(sx,sy,ex,ey)

rows = len(lines)
cols = len(lines[0])
key = dp(0,0,rows-1,cols-1)
print("this is the index : "+str(key[0])+" "+str(key[1]))
print("this is the answer : "+str(lines[key[0]][key[1]]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章