为什么日志在算法复杂性中如此频繁出现?

时间:2014-10-15 19:36:10

标签: algorithm sorting search asymptotic-complexity computer-science-theory

这个问题是关于导致出现登录问题(如排序和搜索)的解决方案之间是否存在一些抽象的相似性。或者,更简单地说,为什么日志在算法复杂性中如此频繁出现?

3 个答案:

答案 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;通过将原始数据分解为单独的部分来解决这些操作的次数尽可能少,这就是为什么日志经常出现的原因