【问题标题】:Median of areas given in a matrix矩阵中给定区域的中位数
【发布时间】:2018-09-04 13:45:45
【问题描述】:

给定一个 1 和 0 的矩阵 (n x n),其中 1 代表土地,0 代表水。 如何以最有效的方式找到土地面积的中位数?

例如:

1 1 0 0 0

1 0 0 1 1

1 0 1 0 0

一共有三个岛,面积为[1,2,4],中位数为2

一个岛可以由连续的非对角单元组成,其中包含 1: 例如:

1 0 1

0 1 0

这个矩阵包含三个区域[1,1,1]

我的解决方案是递归地找到这些区域,然后对它们进行排序以找到需要 O(n^2log(n^2)) 的中位数,有没有更有效的方法来做到这一点?

【问题讨论】:

  • 您只需要中间值,还是要识别具有中间值的岛?此外,如果您澄清“岛屿”的含义,这将有所帮助。
  • 我已经编辑了这篇文章

标签: algorithm performance sorting data-structures


【解决方案1】:

第一步,在网格上递归运行 DFS 并在O(n^2) 时间发现所有岛屿并计算面积。

第二步,您可以使用Median of Medians算法计算未排序岛屿区域数组在预期O(m)时间的中位数,其中m是岛屿的数量。

整体时间复杂度O(n^2)

如果您需要进一步的帮助,我可以提供我的实现。

【讨论】:

  • @meowgoesthedog 感谢您的指出。你能检查一下更新吗?
  • @pjs,你确定吗?我认为正是O(n)
  • @pjs 维基百科在这里是错误的。中位数算法的中位数并不是从字面上返回中位数的中位数,而是将该元素用作 QuickSelect 的枢轴,通过主定理的案例 3 在线性时间内给出准确的答案。
  • @DavidEisenstat 然后我想明确地看到答案状态。照原样,它说中位数的中位数将用于在 O(m) 时间内计算答案,因此我声明这只是一个近似答案。
【解决方案2】:

使用disjoint set 可以得到 O(A(N)),其中 A 是反 Ackermann 函数来查找岛屿,然后使用 nth_element(又名 IntroSelect)在 O(N) 中找到 N/2求中位数。

sets = DisjointSet(matrix)
median = nth_element(sets, N/2)

总共O(A(N))远小于O(N^2)

【讨论】:

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