m
和n
是2D矩阵的两个维度,使用givens Big-O的搜索算法被认为更快:
log(m*n)
或(m+n)
或log(m)*log(n)
?答案 0 :(得分:4)
以上简化的解释如下:
O(log(m * n))相当于 O(log m + log n)
O(m + n)和 O(log(m)* log(n))本身就是缩减形式
数字的对数小于数字。因此订单将
O(log(m * n))< O(log(m)* log(n))< O(M + N)强>
即log(m * n)效率最高。
记住这是一个大事。如果你考虑所有可能的输出会更好。
答案 1 :(得分:3)
在特定应用程序的上下文之外,两者都不是“最佳”。请注意,O(f(x))
表示算法处理大小为x
的输入所花费的时间与<{em>成比例到f(x)
,而没有指示该比例是多少。如果你有一个算法O(n)
(即线性),但有一个常数乘法因子,比如10^4
,第二个算法是O(n^2)
,但只有一个乘法系数为1
,那么第二种算法对于最大10^4
的问题大小会更好。如果您的实际问题域保证永远不会有大小超过10^2
的输入,那么您没有理由选择第一个算法。这无疑是一个极端的例子,但重点是您需要知道您的问题域和您希望必须处理的输入,以及您正在评估的不同算法和相关成本,以便选择最佳算法你的计划。有许多现实世界的情况,在数学上选择最有效(对于极大规模的问题)算法不是正确的选择,并且实际上可能导致性能问题,因为您的输入从未大到足以实现节省理论上可行的效率。
在您的具体情况下,随着问题规模的扩大,O(log(m*n))
绝对是最有效的,但如果您从未在较大问题集的领域中运营,那么其他人可能实际上是“最适合您的具体用途。
答案 2 :(得分:2)
最好的是 - log(m*n)
(相当于log(m) + log(n)
)
然后 - log(m)*log(n)
然后 - m+n
答案 3 :(得分:2)
将第一个写为log m + log n
。这明显优于m + n
。它也比log(m) * log(n)
好。
所以答案是log (m * n)
是最好的。