【发布时间】:2017-11-09 15:42:49
【问题描述】:
我正在尝试解决这个算法问题:在 numpy 数组中找到只有一个值的最大正方形。
示例图片:
我的代码花费了太多时间。有没有办法提高速度?
import numpy as np
answer = 0
def allsame(board):
memory = board[0,0]
board = np.matrix(board)
for i in range(board[0].size):
for j in range(board[0].size):
if board[i,j] != memory: return False
return True
def findLargestSquare(board):
global answer
list = []
a = np.matrix(board)
if a[0].size == 1 or a[:,1].size==1: return answer
if a[1].size < a[:,1].size: ran = a[1].size
else: ran = a[:,1].size
for i in range(ran+1):
for j in range(ran+1):
if a[i:j,i:j].size > 0 and allsame(a[i:j,i:j])==True:
if a[i:j,i:j].size > answer:
list.append(a[i:j,i:j].size)
answer = a[i:j,i:j].size
findLargestSquare(a[1:])
return findLargestSquare(a[:,1:])
return answer
#testBoard = [['x','o','g'],['b','a','j'],['u','q','p']]
testBoard = [['X','O','O','O','X'],['X','O','O','O','O'],['X','X','O','O','O'],['X','X','O','O','O'],['X','X','X','X','X']]
print(findLargestSquare(testBoard))
我将我的代码更改为自卷积方法。 你能看看哪一部分是错的吗?
import numpy as np
import time
answer = 0
def findLargestSquare(board):
global answer
a = np.array(board)
for k in reversed(range(a[0].size + 1)):
conv_size = k
for i in range(a[0].size - conv_size + 1):
num = i
for j in range(a[0].size - conv_size + 1):
#print('i:', i, 'j:', j)
print(a[i:i + conv_size, j:j + conv_size])
#print('unique: ',np.unique(a[i:i+ conv_size,j:j+conv_size]).size)
if(np.unique(a[i:i+ conv_size,j:j+conv_size]).size == 1):
#print("returning")
return len(a[i:i+ conv_size,j:j+conv_size])**2
num = num + 1
print("================")
return len(a[i:i+ conv_size,j:j+conv_size])**2
# testBoard = [['x','o','g'],['b','a','j'],['u','q','p']]
testBoard = [['X', 'O', 'O', 'O', 'X'], ['X', 'O', 'O', 'O', 'O'], ['X', 'X', 'O', 'O', 'O'], ['X', 'X', 'O', 'O', 'O'],
['X', 'X', 'X', 'X', 'X']]
print(findLargestSquare(testBoard))
【问题讨论】:
-
这是一个众所周知的
DP问题。Link。在这里,您只需要调用此方法 2 次。第一次是O,下次是X。