我正在刷新我的CS理论,我想知道如何识别算法O(log n)的复杂性。具体来说,有一种简单的方法可以识别它吗?
我知道O(n)通常是一个循环;O(n ^ 2)是一个双循环;O(n ^ 3)是一个三重循环,以此类推。O(log n)怎么样?
我正在刷新我的CS理论,我想知道如何识别算法O(log n)的复杂性。具体来说,有一种简单的方法可以识别它吗?
我知道O(n)通常是一个循环;O(n ^ 2)是一个双循环;O(n ^ 3)是一个三重循环,以此类推。O(log n)怎么样?
Answers:
我知道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),这是完全不同的。
这个想法是一种算法,O(log n)
如果您不是将结构逐一滚动,而是一次又一次地将结构一分为二,并对每个拆分执行固定数量的操作。答案空间不断分裂的搜索算法是O(log n)
。二进制搜索就是一个例子,您可以不断地将有序数组一分为二,直到找到数字为止。
注意:您不必一定要分成两半。
log n
触发二进制搜索反射的提及。
您想知道是否有一种简单的方法来识别算法是否为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)。