确定算法是否为O(log n)


25

我正在刷新我的CS理论,我想知道如何识别算法O(log n)的复杂性。具体来说,有一种简单的方法可以识别它吗?

我知道O(n)通常是一个循环;O(n ^ 2)是一个双循环;O(n ^ 3)是一个三重循环,以此类推。O(log n)怎么样?



啊,那是我没看过的地方:)
Atif 2012年

Answers:


32

我知道O(n)通常是一个循环;O(n ^ 2)是一个双循环;O(n ^ 3)是一个三重循环,以此类推。O(log n)怎么样?

您实际上是在以错误的方式进行操作。您试图记住给定的算法结构使用哪种big-O表达式,但是您实际上应该只算出算法所需的操作数,然后将其与输入的大小进行比较。遍历整个输入的算法之所以具有O(n)性能,是因为它运行了n次循环,而不是因为它只有一个循环。这是一个具有O(log n)性能的循环:

for (i = 0; i < log2(input.count); i++) {
    doSomething(...);
}

因此,所需操作数约为输入大小对数数量级的任何算法都是O(log n)。big-O分析告诉您的重要事情是算法的执行时间如何相对于输入的大小发生变化:如果将输入的大小增加一倍,该算法还会再执行1步(O(log n)) ,是步长(O(n))的两倍,步长(O(n ^ 2))的四倍,等等。

从经验中知道重复划分输入的算法通常会将“ log n”作为其性能的一部分吗?当然。但是不要寻找分区,而得出结论,即算法的性能为O(log n)-可能类似于O(n log n),这是完全不同的。


3
注意,通俗地说“按尺寸的对数的顺序”是指“按尺寸的位数的顺序”。

@Caleb在讨论缩放比例时,对数的实际底数并不重要。

@Caleb谈论绝对值对big-O没有意义。您可能会更喜欢这样的措辞:当数字位数加倍时,步数加倍。

@Caleb谈论绝对值对big-O没有意义。您可能会更喜欢这样的措辞:当数字位数加倍时,步数加倍。

@ThorbjørnRavnAndersen是的,这就是“大小的对数”的含义。我不确定这句话的问题是什么,除了您会选择不同的说法。从根本上说,我认为我们同意。
Caleb

25

这个想法是一种算法,O(log n)如果您不是将结构逐一滚动,而是一次又一次地将结构一分为二,并对每个拆分执行固定数量的操作。答案空间不断分裂的搜索算法是O(log n)二进制搜索就是一个例子,您可以不断地将有序数组一分为二,直到找到数字为止。

注意:您不必一定要分成两半。


1
如果我将输入一分为二,然后对余数进行2 ^(n / 2)次迭代,然后再再次拆分,该怎么办?(当然我知道那是什么,我只是想展示一个简单方法失败的例子)。
陶Szelei

@afish这很罕见。搜索时极为罕见。
Donal Fellows

1
@DonalFellows算法理论不是经验科学。问题不在于搜索,而在于人们中log n触发二进制搜索反射的提及。
陶Szelei

2
分区不会使算法成为O(log n),它通常会将log n的因数加到big-O限制。像堆排序和合并排序之类的递归排序就是一个很好的例子:它们对输入进行分区,但随后对两个结果分区进行递归分区。结果是O(n log n)性能。
Caleb

@afish:好点。考虑到问题的性质,我的答案是使问题尽可能简单。我将“将结构分成两半...”行更改为“将结构分成两半...并对每个拆分进行恒定数量的操作”以尝试简单地理解这一点。
Casey Patton'4

2

典型示例是处理二进制搜索的示例。例如,二进制搜索算法通常是O(log n)

如果您有一个二叉搜索树,查找,插入和删除都是O(log n)复杂的。

不断划分空间的任何情况通常都会涉及一个log n组件。这就是为什么许多排序算法具有O(nlog n)复杂性的原因,因为它们经常对集合进行分区并按需进行排序。


1

如果您希望它像“单循环-> O(n),双循环-> O(n ^ 2)”那样简单,那么答案可能是“树-> O(log n)”。更准确地将树从根遍历到一个(不是全部!)叶,或者反过来遍历。但是,这些都是过分简单的。


那么,我的答案出了什么问题?我愿意接受建设性的批评。
围巾岭

0

您想知道是否有一种简单的方法来识别算法是否为O(log N)。

好吧:运行并计时。运行它以输入1.000、10.000、100.000和一百万。

如果您看到运行时间为3、4、5、6秒(或几倍),则可以放心地说它是O(log N)。如果它更像是:1,10,100,1000秒,则可能是O(N)。如果是3,40,500,6000秒,则为O(N log N)。


每个人都应该给这个答案一个赞成和一个反对,这两个原因都是显而易见的:-)
gnasher729
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.