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



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

  • log(m*n)
  • (m+n)
  • log(m)*log(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(是最有效的。

记住这是一个大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)是最好的。

最新更新