m
和n
是二维矩阵的两个维度,使用给定的Big-O搜索算法被认为更快:
-
log(m*n)
或 -
(m+n)
或 -
log(m)*log(n)
?
以上简化的解释如下:
-
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(是最有效的。
记住这是一个大O。如果您考虑所有可能的输出会更好。
应用程序的上下文之外,两者都不是"最佳"。请记住,O(f(x))
意味着算法处理大小x
的输入所需的时间与f(x)
成正比,没有指示该比例是多少。如果你有一个O(n)
的算法(即线性(,但有一个常数乘法因子,比如10^4
,第二个算法是O(n^2)
的,但只有一个乘法因子1
,那么第二种算法对于最多 10^4
的问题大小会更好。如果你的实际问题域保证永远不会有大小超过10^2
的输入,那么没有任何理由选择第一种算法。诚然,这是一个极端的例子,但关键是你需要知道你的问题域和你期望必须处理的输入,以及你正在评估的不同算法和相关成本,以便为你的程序选择最佳算法。在很多现实世界中,选择数学上最有效的(对于超大规模问题(算法并不是正确的选择,并且实际上可能会导致性能问题,因为您的输入永远不够大,无法实现理论上可能的效率节省。
在你的特定情况下,随着问题规模的扩大,O(log(m*n))
绝对是最有效的,但如果你从来没有在更大的问题集中操作,那么另一个实际上可能是"最好的"你的特定用途。
最好的是 - log(m*n)
(相当于log(m) + log(n)
(
然后 - log(m)*log(n)
然后 - m+n
将第一个写成log m + log n
。这显然比m + n
要好。也比log(m) * log(n)
好.
所以答案是log (m * n)
是最好的。