Redis时间复杂度为O(log(N)+ M)

时间:2017-05-04 23:48:35

标签: big-o

  

时间复杂度O(log(N)+M) N是元素的数量   排序集和M返回的元素数。

这是来自Redis的文档。我理解Big O的概念,但我怀疑log()在这种情况下扮演的角色。我读到log和SO中的答案,例如它可以有不同的基础。

有人可以用很少的例子解释这个时间的复杂性吗?

例如:N = 1000, M = 10N = 1,000,000, M = 1000

2 个答案:

答案 0 :(得分:2)

请记住,大O符号表示长期增长率,而不是某些算法所需的实际步骤数。如果函数的运行时是100log N + 200M或3log N + 150M,则在两种情况下运行时都是O(log N + M),所以只知道big-O表示法不会让你预测给定N和先验地。

您可以做的是使用您对运行时为O(log N + M)这一事实的了解,在给定一些数据点的情况下推断运行时。例如,如果您知道运行时N = 10,000,000且M = 1,000是1,那么您可以预测N = 10,000,000和M = 2,000时的运行时间可能类似于2s,因为运行时间线性地缩放为M的函数。您必须使用的数据点越多,您的预测就越好。您还可以看到运行时对N的变化的敏感性远远低于M,因为对于log N增加2倍,您需要有效地平方N的值。

答案 1 :(得分:2)

让我逐一剖析这件事......

O(log n):对数复杂度

要理解这个复杂性类,首先需要围绕log函数建立直觉。

你有:

  • ln:自然对数或对数基数e
  • log:二进制对数或对数基数2.除非指定了另一个基数
  • log*:也称为迭代对数

复杂性类经常使用二进制对数或对数基数2而不是其余的。 但是区分仍然很重要。

log函数由“必须提高数字2以获得值n”的幂来定义。然而,对于像你我这样的人来说,这个定义可能有点难以理解。

你可以用更正式/更不正确的方式来理解它:“你可以用数字除以2的次数

  • 8可以减半分3次
    • 8 / 2 = 4 - > 4 / 2 = 2 - > 2 / 2 = 1
    • 因此log(8) = 3

包装:O(log n)表示如果输入的大小为n,则函数使用的时间将与log n成比例。

O(log n)O(n)快得多。

O(n):线性复杂性

这意味着如果输入的大小为n,则函数使用的时间将与n成比例。意思是,它具有1:1的比例。

不同变量

现在,当你有不同的变量名时该怎么做......

在这种情况下,N和M说的是不同的变量。 一些例子

  • 通过M x N(例如:M行和N列)矩阵迭代可能需要O(M * N)次。
  • 对具有V个顶点数和E个边数的图表执行操作的算法可以将其复杂性定义为VE的函数,例如:O(V + E)O(V * E)或其他。

最后,回到你的问题:

O(log(N) + M)在这个特定背景下的含义是什么?

意味着它将是:

的总和
  • O(log N)就集合
  • 的要素而言
  • O(N)就返回的元素而言(查询结果)