时间复杂度:
O(log(N)+M)
N
是元素的数量 排序集和M
返回的元素数。
这是来自Redis的文档。我理解Big O的概念,但我怀疑log()
在这种情况下扮演的角色。我读到log
和SO中的答案,例如它可以有不同的基础。
有人可以用很少的例子解释这个时间的复杂性吗?
例如:N = 1000, M = 10
和N = 1,000,000, M = 1000
答案 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 / 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
个边数的图表执行操作的算法可以将其复杂性定义为V
和E
的函数,例如:O(V + E)
或O(V * E)
或其他。最后,回到你的问题:
O(log(N) + M)
在这个特定背景下的含义是什么?
意味着它将是:
的总和O(log N)
就集合O(N)
就返回的元素而言(查询结果)