假设二维矩阵的值为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
答案 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值设置为零时递减)
---编辑---
似乎我不够清楚。只有在您必须针对该特定方法进行优化时,此解决方案才有效。例如。你每天只修改几次矩阵,但你每秒都会多次调用这个方法。在这些特殊情况下,您必须优化整个代码,而不仅仅是方法本身。
如果问题纯粹是理论问题,那么这不是一个选择。如果它背后存在某种真正的问题,那么值得考虑一下。