矩阵中给出的区域的中位数

时间:2018-09-04 13:45:45

标签: algorithm performance sorting data-structures

给出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))的中位数,有没有更有效的方法呢?

2 个答案:

答案 0 :(得分:3)

第一步,在网格上递归运行DFS,并在AttributeError: 'tuple' object has no attribute 'get' 时间发现所有孤岛并计算面积。

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

总体时间复杂度m

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

答案 1 :(得分:1)

使用disjoint set可以得到O(A(N)),其中A是逆阿克曼函数来查找孤岛,然后使用nth_element(aka IntroSelect)在其中找到N / 2 O(N)来找到中位数。

jq -r -c  $foo sample.json

O(A(N))的总数远小于O(N ^ 2)