Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找最大出现次数为1的行_Algorithm - Fatal编程技术网

Algorithm 查找最大出现次数为1的行

Algorithm 查找最大出现次数为1的行,algorithm,Algorithm,我在一次采访中遇到了这个问题。 你有一个包含1和0的nxn矩阵。您必须以最有效的方式找到包含最大数量的1的行。我知道它可以在n^2中完成,但有没有最佳解决方案?最佳解决方案在^2上。假设矩阵只包含零。你必须检查每一个细胞,以确保这一点。这是在^2上 您可以优化算法,使其在找到仅包含1的行时停止搜索。这必须是最优的,或者如果它在一行中看到了太多的零,以至于不可能超过迄今为止看到的最大值。在某些情况下,这可能会大大加快速度,但在一般情况下仍将是^2。作为优化:解析列,计算从现在起每行最多1个。在n/

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

最佳解决方案在^2上。假设矩阵只包含零。你必须检查每一个细胞,以确保这一点。这是在^2上


您可以优化算法,使其在找到仅包含1的行时停止搜索。这必须是最优的,或者如果它在一行中看到了太多的零,以至于不可能超过迄今为止看到的最大值。在某些情况下,这可能会大大加快速度,但在一般情况下仍将是^2。

作为优化:解析列,计算从现在起每行最多1个。在n/2步之后,开始消除那些不合适的行。最大行数为1的行-行总数该行中的行数>未选中的列数-^2上的复杂性最坏情况下的复杂性将始终为O n2

但是我们可以减少常量和一般复杂性

计算x 对于剩余的n-x行,当我们发现无法从该行中找到下一个答案时停止

现在的重点是获得x的最佳值


PS:类似于-从100人中选出最佳人选,前提是您只能选择三次。

以下是JavaScript中最有效的实现

就像上面的答案所暗示的那样;如果用N 1击中一行,它会短路,如果当前行不可能有更多的1,它会继续外部行循环

但这个答案也证明了使用read的有效性:放置所涉及的条件逻辑

// 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;
}

在最坏的情况下,你无法击败Omegan^2,因为最坏的情况是整个矩阵中只有一个1,因此问题归结为找到它,你必须检查它们。我所能想到的最明显的优化是,如果到目前为止最好的是m,那么到目前为止,您在正在检查的行中找到的1的数量是k,并且要检查的剩余列少于m-k,那么就尽早退出,因为您当前的行显然没有超过目前为止最好的一行。还可以使用SIMD指令执行某些操作,并并行化以利用多个核。优于n^2意味着您不会访问矩阵中的所有单元。在某些情况下,可以快速确定最大行,但对于一般情况,必须至少访问所有单元格一次