我有以下问题
假设我们有一个9 * 8矩阵
如果在某个位置,矩阵被认为具有“鞍点” 是行中的最小值,列中的最大值。 在符号中,如果
,则[i] [j]是鞍点 a[i][j]=min a[i][k] ==max a[k][k]
1<=k<=8 1<=k<=9
请帮我找到马鞍点的计算机位置。
答案 0 :(得分:4)
给定 MxN 矩阵,这是O(MN)
,这是最佳的。
INIT rowMin = [ +Infinify ] xM
INIT colMax = [ -Infinity ] xN
FOR r = 1..M
FOR c = 1..N
rowMin[r] = MIN(rowMin[r], mat[r][c])
colMax[c] = MAX(colMax[c], mat[r][c])
FOR r = 1..M
FOR c = 1..N
IF mat[r][c] == rowMin[r] == colMax[c]
DECLARE saddlePoint(r, c)
因为有 MxN 值,并且每个都需要查看,所以为了确定答案(即不是概率),下限是O(MN)
。
您可以稍微优化一下。它仍然是O(MN)
,但不是找到最大/最小值,而是找到他们的索引。这可以使第二阶段O(M)
处于最佳状态(即,当行/列中存在唯一的最小值/最大值时)。
请注意,在最坏的情况下,有O(MN)
个鞍点:当数组中的数字全部相等时。
答案 1 :(得分:3)
天真的解决方案是:
答案 2 :(得分:3)
简而言之:
这是Python中的一个实现:
def find_saddle_points(a):
"""Finds saddle points in a, a 2 dimensional array.
Args:
a: A 2 dimensional array in row-major (y, x) order.
Returns:
A list of (x, y) location of the saddle points.
"""
# Holds a (value, column) tuple of the min value and its column for each row.
row_mins = [min((a[row][col], col) for col in range(len(a[row]))) for row in range(len(a))]
# Holds a (value, row) tuple of the max value and its row for each column.
col_maxes = [max((a[row][col], row) for row in range(len(a))) for col in range(len(a[0]))]
ret = []
for row, (row_min, col) in enumerate(row_mins):
if col_maxes[col][1] == row:
ret.append((row, col))
return ret
答案 3 :(得分:0)
找到每行中最小元素的位置, 找到每列中最大元素的位置,
两个列表中出现的任何位置都是一个鞍点
还有改进的余地 - 但基本上就是这样呢