求二维数组局部峰值(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]]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章