考虑一个问题有两种解决方案。
答案 0 :(得分:6)
考虑这三种情况。
执行n/2
次。这意味着每次我们将n增加100倍,执行时间就会增加100倍。
执行sqrt(n)
次。这意味着每次我们将n增加100倍,执行时间就会增加10倍。
执行log(n)
次。这意味着每当我们将n增加100倍时,执行时间就会增加一定量。
不,这三件事情甚至都差不多。第一个比第二个差得多。第三个比第二个好得多。
答案 1 :(得分:1)
它们都不是O(logn)
以下是O(logn)
,Binary search algorithm
答案 2 :(得分:0)
最佳算法是您拥有的数据的最佳算法。如果您不知道自己拥有哪些数据,请考虑大量数据,例如n = 10亿。你会选择O(31623)还是O(5000000000)?绘制比较图并找出数据大小的位置。
如果您的数据集是n = 4,那么任一算法都是相同的。如果您了解详细信息,由于它执行的操作,实际上sqrt(n)算法可能需要更长的时间。
你可以拥有最快的O(1)。一个这样的例子是在哈希映射中查找,但是你的内存大小可能会受到影响。所以你应该考虑空间限制和时间限制。
您也会误解并过度分析复杂性分类。 O(n)算法不是用n个操作执行的算法。任何常数乘数都不会影响分类顺序。重要的是当问题增长时,操作数量的增加。考虑两种搜索算法。
A) Scan a sorted list sequentially from index 0 to (n-1) to find the number.
B) Scan a sorted list from from index 0 to (n-1), skipping by 2, and backtracking if necessary.
显然,A最多需要n次操作,而B需要n / 2 + 1次操作。但他们都是O(n)。你可以说算法B更快,但我可以在我的机器上运行它,速度是原来的两倍。因此,复杂性是一般的类,人们不应该对操作的细节过于挑剔。
如果您正在尝试开发更好的算法,那么搜索具有更好复杂性类的算法比使用稍微少一些算法的算法更有用。