什么时候出现BigOh符号O(log n)?

时间:2012-03-30 10:01:27

标签: algorithm data-structures big-o

你能解释算法是什么使得O(log n)?

如果您能用简单的代码展示它,我将不胜感激。

由于

4 个答案:

答案 0 :(得分:5)

log(n)/log(i)是重新关系的解决方案

f(n) =  f(n/i) + c

每次你编写一个可以写成递归调用的函数,其中输入的大小在每次迭代时除以常量。像

function(input, N){
   do some constant work
   return function(input, N/c);
}

然后你有Theta(logn)复杂度。

示例:

  • 在平衡搜索树中搜索时:取大小为n的树,如果等于根返回(常量),或者在左子树中搜索(如果小)(大小为n / 2),则在右子树中搜索(大小n / 2)如果更大。
  • 指数a^n:如果n = 1,则返回a。否则取幂a^(n/2) = b(大小为n / 2的问题),将b乘以b,如果是偶数,则乘以一次。

答案 1 :(得分:1)

Plain English explanation of Big O。它在那里解释了。

  

我可以为Big-O表示法提供的最简单的定义是:

     

Big-O表示法是算法复杂性的相对表示。

     

有一些重要且刻意选择的词   句:

     
      
  • 亲戚:你只能比较苹果和苹果。您无法比较算法以对算法进行算术乘法   对整数列表进行排序。但是两个做算术的算法   操作(一次乘法,一次加法)会告诉你一些事情   有意义的;
  •   
  • 表示: Big-O(最简单的形式)减少了算法与单个变量之间的比较。那个变量是   根据观察或假设选择。例如,排序   通常基于比较操作来比较算法   (比较两个节点以确定它们的相对排序)。这个   假设比较昂贵。但如果比较便宜怎么办?   但交换费用昂贵?它改变了比较;和
  •   
  • 复杂性:如果需要一秒钟来排序10,000个元素需要多长时间才能排序一百万个?复杂性在此   实例是对其他事物的相对衡量标准。
  •   
     

当您阅读完其余内容后,请回过头来重读上述内容。

     

我能想到的Big-O最好的例子就是做算术。采取   两个数字(123456和789012)。我们的基本算术运算   在学校里学到的是:

     
      
  • 此外;
  •   
  • 减法;
  •   
  • 乘法;和
  •   
  • 分。
  •   
     

这些都是操作或问题。解决这些问题的方法   被称为算法

     

添加是最简单的。你将数字排成一行(向右)和   在列中添加数字,写入该添加的最后一个数字   结果。 ''''这个号码的一部分被转移到了   下一栏。

     

我们假设添加这些数字是最昂贵的   在这个算法中的操作。按理说添加这些   两个数字在一起我们必须加6个数字(可能   携带第7个)。如果我们将两个100位数字加在一起,我们必须这样做   100个补充。如果我们添加两个10,000位数字,我们必须这样做   10,000个新增内容。

     

看模式? 复杂性(即操作次数)   与更大的位数 n 成正比   数。我们称之为 O(n)线性复杂性

     

减法类似(除非你可能需要借用而不是   携带)。

     

乘法是不同的。你把数字排成一行,拿第一个   底部数字中的数字,然后依次乘以每个数字   在最顶层的数字中,依此类推。所以要倍增我们的   两个6位数字我们必须做36次乘法。我们可能需要这样做   多达10或11列添加以获得最终结果。

     

如果我们有两个100位数字,我们需要进行10,000次乘法运算   200加。对于两百万个数字,我们需要做一个   万亿(10 12 )乘法和200万增加。

     

当算法按n- 平方进行缩放时,这是 O(n 2   或二次复杂度。这是介绍另一个的好时机   重要的概念:

     

我们只关心复杂性中最重要的部分。

     

精明的人可能已经意识到我们可以表达的数量   操作为:n 2 + 2n。但正如你从我们的例子中看到的那样   每个数字为两位数百万,第二项(2n)   变得微不足道(占总运营的0.00002%)   到那个阶段)。

     

电话簿

     

我能想到的下一个最好的例子就是电话簿   称为白页或类似的,但它会因国家/地区而异   国家。但是,我正在谈论那个按姓氏列出人的人   然后是首字母或名字,可能是地址,然后是电话   号。

     

现在,如果您指示计算机查找电话号码   " John Smith",你会怎么做?忽略你可以的事实   猜猜S开始了多远(让我们假设你不能),会怎样?   你呢?

     

一个典型的实现可能是打开中间,采取   500,000 th 并将其与#34; Smith"进行比较。如果碰巧是   "史密斯,约翰",我们真的很幸运。更可能的是" John   史密斯"将在该名称之前或之后。如果它在我们之后呢   将电话簿的后半部分分成两半并重复。如果是的话   在此之前,我们将电话簿的前半部分分成两半   重复。等等。

     

这称为二分搜索,每天都在使用   编程你是否意识到。

     

所以,如果你想在一百万个名字的电话簿中找到一个名字   实际上可以通过最多21次这样做来找到任何名字(我   可能会被1)关闭。在比较搜索算法时,我们决定   这种比较是我们的'。

     

对于3个名字的电话簿,需要进行2次比较(最多)   7最多需要3个。
对于15个需要4.
...为   1,000,000需要21左右。

     

这真是令人难以置信的好不是吗?

     

在Big-O术语中,这是 O(log n)对数复杂度。   现在问题的对数可能是ln(基数e),log 10 ,   log 2 或其他一些基础。它并不重要   O(log n)就像O(2n 2 )和O(100n 2 )一样   O(n 2 )。

答案 2 :(得分:1)

Wikipedia给出了一些常见函数的命令示例:

  

O(log(n)),使用二进制搜索或平衡搜索树查找排序数组中的项以及二项式堆中的所有操作。

答案 3 :(得分:0)

最简单的例子:二进制搜索

原则:在每个步骤中,在可能的搜索空间的一半(搜索到的数组)中,在最多log(n)步之后,算法必须终止(因为减少了一半)。