我的教授刚刚告诉我们,任何将输入长度减半的操作都有O(log(n))复杂度作为拇指规则。为什么不是O(sqrt(n)),它们都不是等价的?
答案 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>
。
答案 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 > 0
和base > 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