复杂度O(log(n))是否等于O(sqrt(n))?

时间:2017-02-04 08:39:38

标签: algorithm time-complexity

我的教授刚刚告诉我们,任何将输入长度减半的操作都有O(log(n))复杂度作为拇指规则。为什么不是O(sqrt(n)),它们都不是等价的?

8 个答案:

答案 0 :(得分:37)

它们不等价: sqrt(N) log 2 (N)增加更多。没有常数 C ,因此您将拥有 sqrt(N)< C.log(N) N 的所有值都大于某个最小值。

获取此功能的一种简单方法是, log 2 (N)将是一个接近 N <(二进制)位数的值/ em>,而 sqrt(N)将是一个数字,其自身的数字是 N 的数字的一半。或者,说出平等:

log 2 (N)= 2log 2 (sqrt(N))

所以你需要取 sqrt(N)的对数(!),使其与 log 2 (N)的复杂度相同)

例如,对于11位二进制数,0b10000000000(= 2 10 ),平方根为0b100000,但对数仅为10.

答案 1 :(得分:10)

假设lim {n->inf} log n / sqrt(n) = (inf / inf)(否则只乘以常数),我们有

= lim {n->inf} 1/n / 1/(2*sqrt(n)) (by L'Hospital) = lim {n->inf} 2*sqrt(n)/n = lim {n->inf} 2/sqrt(n) = 0 < inf

O(.)

请参阅https://en.wikipedia.org/wiki/Big_O_notation了解log n = O(sqrt(n))的替代定义,从而从上面我们可以说log n

同时比较以下函数的增长情况,sqrt(n)总是在n的上限为<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>jQuery UI Sortable - Default functionality</title> <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> <link rel="stylesheet" href="/resources/demos/style.css"> <style> #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; } #sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; } #sortable li span { position: absolute; margin-left: -1.3em; } </style> <script src="https://code.jquery.com/jquery-1.12.4.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <script> $( function() { $( "#sortable" ).sortable(); $( "#sortable" ).disableSelection(); }); function sortItems() { var items = $('#sortable li').get(); items.sort(function(a,b){ var keyA = $(a).text(); var keyB = $(b).text(); if (keyA < keyB) return -1; if (keyA > keyB) return 1; return 0; }); var ul = $('#sortable'); $.each(items, function(i, li){ ul.append(li); }); }; function checkOrd() { var items = $('#sortable li').map(function(){ return $.trim($(this).text()); }).get(); var itsort = $('#sortable li').map(function(){ return $.trim($(this).text()); }).get(); itsort.sort(); if (JSON.stringify(items) == JSON.stringify(itsort)) alert("Right order!"); else alert("Wrong order!"); }; </script> </head> <body> <ul id="sortable"> <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li> <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li> <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li> <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li> <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li> <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li> <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li> </ul> <button onclick="sortItems();">Sort lists</button> <button onclick="checkOrd();">Check order</button> </body> </html>

enter image description here

答案 2 :(得分:3)

不,它不相同。

@trincot在他的回答中给出了一个很好的解释。我再加一点了。你的教授教你这个

any operation that halves the length of the input has an O(log(n)) complexity

也是如此,

any operation that reduces the length of the input by 2/3rd, has a O(log3(n)) complexity
any operation that reduces the length of the input by 3/4th, has a O(log4(n)) complexity
any operation that reduces the length of the input by 4/5th, has a O(log5(n)) complexity
So on ...

所有输入长度减少(B-1)/Bth.的情况确实如此。它的复杂度为O(logB(n))

N:B: O(logB(n))表示基于B的对数n

答案 3 :(得分:2)

不,他们等同;你甚至可以证明

   O(n**k) > O(log(n, base)) 

适用于k > 0base > 1 k = 1/2的{​​{1}}。

sqrt谈话时,我们要调查 large O(f(n))的行为, 限制是很好的手段。假设两个大n都是等价的:

O

这意味着有一些有限常数 O(n**k) = O(log(n, base)) ,这样

C

从一些足够大的 O(n**k) <= C * O(log(n, base)) 开始;换句话说(n不是log(n, base)从大0开始,两个函数都是连续可微的):

n

要找出极限值,我们可以使用L'Hospital's Rule,即将分子和分母的衍生物分开并除以它们:

  lim(n**k/log(n, base)) = C 
  n->+inf

所以我们可以得出结论, lim(n**k/log(n)) = lim([k*n**(k-1)]/[ln(base)/n]) = ln(base) * k * lim(n**k) = +infinity 或其他词语

没有C
O(n**k) < C*log(n, base)

答案 4 :(得分:1)

不,不是。 在处理时间复杂性时,我们认为输入量很大。因此,让我们取n = 2 ^ 18。现在,对于sqrt(n),操作数将为2 ^ 9,对于log(n),其操作数将等于18(此处考虑以2为底的log)。显然2 ^ 9比18大得多。 因此,可以说O(log n)小于O(sqrt n)。

答案 5 :(得分:1)

解决该问题的一种方法是比较O(sqrt(n))的增长率
和O(log(n)

  • sqrt(n)的导数为1/2(n ^ -1/2)----(1)

  • log(n)的导数为1 / n ----(2)

随着n的增加,我们看到(2)小于(1)。 因此,随着n的增加,log(n)会更好。

答案 6 :(得分:0)

只需比较两个功能:

sqrt(n) ---------- log(n)
n^(1/2) ---------- log(n)

Plug in Log
log( n^(1/2) ) --- log( log(n) )
(1/2) log(n) ----- log( log(n) )

很明显: const。 log(n)> log(log(n))

答案 7 :(得分:0)

要证明sqrt(n)的增长速度快于l gn(base2),您可以将第2个限制取为1个,并证明当n接近无穷大时它接近0。

lim(n—>inf) of (lgn/sqrt(n))

应用L'Hopitals规则:

= lim(n—>inf) of (2/(sqrt(n)*ln2))


由于sqrt(n)ln2将随着n的增加而无限增加,并且2是一个常数,因此证明了

lim(n—>inf) of (2/(sqrt(n)*ln2)) = 0