找到最大出现次数为1的行

时间:2012-01-05 12:05:16

标签: algorithm

我在接受采访时遇到了这个问题。 你有一个包含1和0的nxn矩阵。您必须以最有效的方式找到包含最大数量1的行。我知道它可以在n ^ 2中完成,但是有没有最佳解决方案?

4 个答案:

答案 0 :(得分:7)

最优解是O(n ^ 2)。假设矩阵仅包含零。你必须检查每个细胞以确定这一点。这是O(n ^ 2)。

你可以优化算法,使它停止搜索,如果它找到一个只包含1s的行(这必须是最优的),或者如果它已连续看到那么多的零,那么它不可能超过目前为止看到的最大值。在某些情况下,这可能会显着提高速度,但在一般情况下仍然是O(n ^ 2)。

答案 1 :(得分:0)

作为优化:您解析列,从现在起计算每行1的MAX。在n / 2步之后,你开始消除那些不合适的行。 (The rows with MAX number of 1s - rowSum(number of ones in that row) > (the number of columns unchecked) - 复杂度O(n^2)

答案 2 :(得分:0)

最坏的情况复杂性无论如何都是O(n 2 )。

但我们可以减少常数和一般的复杂性。

以x (x < n)行数计算#1。

对于剩余的n-x行,当我们发现我们无法从该行找到bext答案时停止。

现在要点是获得x的最佳值。

PS:类似于 - 选择100中最好的男人,条件是你只能选择三次。

答案 3 :(得分:0)

这是JavaScript中“最”有效的实现。

像上面的答案一样;如果你用N 1打一行就会短路,如果当前行不可能有更大的1,则继续外(行)循环。

但是这个答案也证明了有效地使用(读取:放置)所涉及的条件逻辑。

// return the smallest row index 0 - (N-1) containing the greatest number of 1's
function MaxRow(M, N) {
// initialize max to 0 if you want to return null for an all zero matrix
// initialize max to -1 if you want to return 0 (row 0) for an all zero matrix
var max = 0;
var result = null;
var row1s;
rowLoop: 
for(var row = 0; row < N; row++) {
    row1s = 0;
    for(var col = 0; col < N; col++) {
        if((N - col) + row1s < max) { // row's current potential 1's
            continue rowLoop; // next row
        }
        row1s += M[row * N + col]; // + 0 or + 1
    }
    if(row1s > max) { // new max
        max = row1s; // save new max value
        if(max == N) { // largest possible
            return row;
        }
        result = row;
    }
}
return result;
}