BigO log(m*n) 或 (m+n) 哪个更好?

What is better BigO log(m*n) or (m+n)?

mn 是二维矩阵的两个维度,具有给定 Big-O 的搜索算法被认为更快:

最好的是-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) 是最好的。

以上简化解释为:

  1. O(log(m*n)) 等同于 O(log m + log n)

  2. O(m+n)O(log(m)*log(n)) 是简化形式本身

因为数字的对数小于数字。因此订单将是

O(log(m*n)) < O(log(m)*log(n)) < O(m+n)

即 log(m*n) 效率最高。

记住是bigO。如果你考虑所有可能的输出会更好。

两者都不 "best" 在特定应用程序的上下文之外。请记住,O(f(x)) 意味着算法处理大小为 x 的输入所花费的时间是 f(x) 成正比的 ,但没有说明是什么比例群岛如果你有一个算法是 O(n)(即线性),但有一个常数乘法因子,比如 10^4,而第二个算法是 O(n^2),但只有一个乘法因子1 的因子,那么第二种算法对于最大 10^4 的问题规模会更好。如果保证您的实际问题域永远不会有大小超过 10^2 的输入,那么您没有理由选择第一种算法。诚然这是一个极端的例子,但关键是你需要知道你的问题领域和你期望必须处理的输入,以及你正在评估的不同算法和相关成本,以便为选择最佳算法你的程序。在许多现实世界的情况下,选择数学上最有效的(对于极其大规模的问题)算法并不是正确的选择,实际上可能会导致性能问题,因为您的输入永远不会大到足以实现节省理论上可能的效率。

在您的具体情况下,随着问题规模的增长,O(log(m*n)) 绝对是最有效的,但是如果您从不在更大的问题集领域中操作,那么其他人之一实际上可能"best" 适合您的特定用途。