这个问题是关于导致出现登录问题(如排序和搜索)的解决方案之间是否存在一些抽象的相似性。或者,更简单地说,为什么日志在算法复杂性中如此频繁出现?
答案 0 :(得分:6)
当问题可以通过乘法因子反复减小时,通常会出现对数。根据定义,将问题缩小到恒定大小(例如,大小为1)需要一个对数步骤。
一个典型的例子就是重复消除一半的数据集,就像二进制搜索一样。这会带来O(log2(n))
复杂性。一些排序算法通过将数据集重复分成两半来工作,因此在时间复杂度上也有一个对数项。
更一般地说,对数经常出现在divide-and-conquer递归关系的解决方案中。有关进一步的讨论,请参阅维基百科中的Master Theorem。
答案 1 :(得分:1)
log 在计算机科学中经常出现。所有内容都可以减少为 true vs false 或 1 vs 0 或是<或> 。如果你有一个if
语句,你有一个选项,否则你有另一个选择。这可以应用于位(您有0或1)或高影响问题,但有一个决定。就像在现实生活中一样,当你做出决定时,如果你另有决定,你就不会关心可能发生的问题。这就是 log 2 (n)经常出现的原因。
然后,每个更复杂的情况(例如:从3个州选择一个可能的状态)可以减少到 log 2 (n) =&gt;对数基数并不重要(常数不影响函数的趋势 - 它具有相同的程度):
数学证明:
loga(y) 1
logx(y) = ------- = -------- * loga(y) = constant * loga(y)
loga(x) loga(x)
程序员证明:
switch(a) {
case 1: ... ;
case 2: ... ;
...
default: ... ;
}
类似于:
if (a == 1) {
...
} else {
if ( a == 2 ) {
...
}
...
}
(switch
个选项k
相当于k-1
if-else
条,其中k
=常数)
但为什么要记录?因为它是指数的倒数。在第一个决定时,你将大问题分成两部分。然后你只打破&#34;好&#34;一半分两部分等。
n = n/2^0 // step 1
n/2 = n/2^1 // step 2
n/4 = n/2^2 // step 3
n/8 = n/2^3 // step 4
...
n/2^i = n/2^i // step i+1
问:有多少步骤?
A :i + 1(从0到i)
因为当你找到想要的元素时它会停止(你可以采取其他决定)=&gt; n = 2^i
。如果我们应用对数,则基数为2:
log2(n) = log2(2^i)
log2(n) = i
=> i + 1 = log2(n) + 1
但是常数并不会影响复杂性=&gt;你有〜 log 2 (n)步骤。
答案 2 :(得分:0)
log在算法复杂性方面出现很多,特别是在递归算法中。
让我们以二进制搜索为例。
你有一个100个元素的排序数组A,你正在寻找数字15 ..
在二进制搜索中,您将查看中间元素(50)并将其与15进行比较..如果元素大于15,那么您会发现介于50和100之间的中间元素为75 ..并再次进行比较..如果15大于75处的元素那么你看75到100之间的元素是元素87 ...你继续这样做直到你找到元素或者直到没有更多的中间数...
每次使用这种检查中间数字的方法时,你将剩余的元素总数减少一半..
所以第一遍将给你O(n / 2)复杂度..下一遍将是O(n / 4)... O(n / 8)等等.. 为了表示这种模式,我们使用了日志..
因为我们正在减少搜索的元素数量,因为算法的每次传递都会成为日志库,因此二进制搜索将产生O(log2(n))复杂度
大多数算法都试图削减&#39;通过将原始数据分解为单独的部分来解决这些操作的次数尽可能少,这就是为什么日志经常出现的原因