二维布尔矩阵由单个或非最小时间复杂度组成?

时间:2017-08-24 17:30:15

标签: c algorithm sorting data-structures

假设二维矩阵的值为0或1。

int mat[4][4] = { {0, 0, 0, 0},
                  {0, 0, 0, 0},
                  {0, 0, 0, 0},
                  {0, 0, 1, 0},
                };

如何通过最快算法而不是通过Brute Force 找到任何值集。 仅使用2D数组实现。有没有比O(N ^ 2)更快的方法?

  

假设矩阵大小为N X N

2 个答案:

答案 0 :(得分:0)

通过更紧凑的数据表示,问题仍然是O(dim ^ 2)或O(n)的阶数,但是具有比例因子,例如O(n ^ 2)/ 64,当高达8x8矩阵时打包到一个64位变量。

当这种打包变量可用时,可以使用'is two of two'位技巧来检查是否设置了一位:

return v && ((v & (v-1)) == 0);

否则可以在累积元素总和时提前退出> 1,在最坏的情况下永远不会到来。如果这是主导的情况,那么人们可以追求矩阵的稀疏表示,使得问题的复杂性为O(1) -

 // matrix presented as list of indices to non-zero elements
 return matrix.size == 1;

答案 1 :(得分:0)

另一种解决方案是,不是直接设置或删除矩阵的元素,而是创建一个setter方法,它也可以保持矩阵中1个值的数量。 (每当零值设置为1时递增,并在每次将1值设置为零时递减)

---编辑---

似乎我不够清楚。只有在您必须针对该特定方法进行优化时,此解决方案才有效。例如。你每天只修改几次矩阵,但你每秒都会多次调用这个方法。在这些特殊情况下,您必须优化整个代码,而不仅仅是方法本身。

如果问题纯粹是理论问题,那么这不是一个选择。如果它背后存在某种真正的问题,那么值得考虑一下。