鞍点的位置

时间:2010-06-17 13:48:35

标签: algorithm

我有以下问题

假设我们有一个9 * 8矩阵

如果在某个位置,矩阵被认为具有“鞍点” 是行中的最小值,列中的最大值。 在符号中,如果

,则[i] [j]是鞍点
 a[i][j]=min a[i][k]  ==max a[k][k]
             1<=k<=8      1<=k<=9

请帮我找到马鞍点的计算机位置。

4 个答案:

答案 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)

简而言之:

  1. 遍历每一行,找到该行中最小值的列号。
  2. 遍历每一列,找到该列中最大值的行号。
  3. 遍历rows-mins或column-maxes,检查相应的单元格是否也是另一个数组中的最大值。
  4. 这是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)

你自己回答了这个问题:

找到每行中最小元素的位置, 找到每列中最大元素的位置,

两个列表中出现的任何位置都是一个鞍点

还有改进的余地 - 但基本上就是这样呢