【问题标题】:Array search algorithms for largest group of elements based on value基于值的最大元素组的数组搜索算法
【发布时间】:2019-11-21 23:24:26
【问题描述】:

我需要一种搜索​​算法,它可以在 0 和 1 的矩阵中找到大部分为 1 的最大矩形;具体来说,我需要它返回这些矩形左上角和右下角的 (x,y) 坐标对。

例如,考虑以下矩阵:

[1,1,0,0,0,
 1,0,0,0,0,
 0,0,0,0,0,
 0,0,0,1,1,
 0,0,0,1,1]

如果我将阈值设置为 75%(矩形的平均值为 0.75),则会在矩阵的左上角和右下角找到两个矩形(特别是正方形)。每个点的元组输出将是左上角 (x,y)、右下角 (x,y)。

{rectangle_1: ((0,0),(1,1)),
rectangle_2: ((3,3),(4,4))} 

我应该考虑将任何数组/矩阵搜索算法作为这项任务的起点吗?

如果它很重要,我将使用 python。所以如果这样的算法有python实现,那将不胜感激。

【问题讨论】:

  • 你在使用 NumPy 吗?更多上下文会更好。
  • 您希望这些矩阵有多大?
  • @TedBrownlow ,我期待 [15x15] 到 [20x20] 大小的矩阵
  • @AlexanderCécile,numpy 是我的意图。我认为这是我最快的选择;肯定比嵌套列表好。
  • @j9000 好的,我去看看:)

标签: python search matrix array-algorithms


【解决方案1】:

我对这个问题的看法 - 我将矩阵转换为字典,键为位置 (x, y),值等于 0 或 1(当然,这不是最快的方法 - 你是NumPy 肯定更好):

from itertools import count

lst = [
 1,1,0,0,0,
 1,0,0,0,0,
 0,0,0,0,0,
 0,0,0,1,1,
 0,0,0,1,1]

def get_values(d, i1, j1, i2, j2):
    c = 0
    s = 0
    for i in range(i1, i2+1):
        for j in range(j1, j2+1):
            s += d[(i, j)]
            c += 1
    return s / c

def find_squares(lst, m, n, t):
    lst = iter(lst)
    d = {(j, i): next(lst) for i in range(m) for j in range(n)}

    seen_squares = []

    for i1 in range(m):
        for j1 in range(n):
            ii2 = count(i1+1)
            ij2 = count(j1+1)

            i2 = next(ii2)
            j2 = next(ij2)
            current_square = None
            while i2 < m and j2 < n:
                if get_values(d, i1, j1, i2, j2) >= t:
                    current_square = i1, j1, i2, j2
                else:
                    break

                i2 = next(ii2)
                j2 = next(ij2)

            if current_square:
                for x1, y1, x2, y2 in seen_squares:
                    if i1 >= x1 and i2 - 1  <= x2 and j1 >= y1 and j2 - 1 <= y2:
                        break
                else:
                    seen_squares.append(current_square)
                    yield current_square

for i1, j1, i2, j2 in find_squares(lst, 5, 5, 0.75):
    print(i1, j1, i2, j2)

打印:

0 0 1 1
3 3 4 4

对于矩阵:

lst = [
 1,1,0,0,0,
 1,0,0,0,0,
 0,0,0,1,1,
 0,0,0,1,1,
 0,0,0,1,1]

输出是:

0 0 1 1
3 2 4 3
3 3 4 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多