什么会导致一个算法有O(日志log n)的复杂性?(What would cause an algo

2019-09-02 10:57发布

这个问题早解决了一些可能导致算法有O(log n)的复杂的因素。

什么会导致一个算法有时间复杂度为O(log日志N)?

Answer 1:

为O(log log n)的条款可以在各种不同的地方出现,但通常有将在此运行时到达两个主要途径。

通过平方根收缩

正如答案的链接的问题提到的,对于算法的常用方法有时间复杂度为O(log n)是该算法通过反复的工作,即每次迭代的一些常数因子削减输入的大小了。 如果是这种情况,算法必须O(log n)的迭代后终止,因为这样做Ø后用一常数(log n)的部门,该算法必须缩小问题的规模下降到0或1。这是为什么,例如,二进制搜索具有复杂度为O(log n)的。

有趣的是,缩向下其产生的型O的运行时的问题的大小的类似的方式(对数log n)的。 而是将输入的一半在每一层的,如果我们采取大小的平方根在每个层会发生什么?

例如,让我们数65,536。 多少次,我们有2个,直到我们得到下降到1分呢? 如果我们这样做,我们得到

  • 65536/2 = 32768
  • 32768/2 = 16384
  • 16384/2 = 8192
  • 8192/2 = 4096
  • 4096/2 = 2048
  • 2048/2 = 1024
  • 1024/2 = 512
  • 2分之512= 256
  • 2分之256= 128
  • 2分之128= 64
  • 2分之64= 32
  • 32/2 = 16
  • 16/2 = 8
  • 8/2 = 4
  • 4/2 = 2
  • 2分之2= 1

此过程需要16个步骤,并且它也可以说65536 = 2 16。

但是,如果我们采取的平方根在每个层面上,我们得到

  • √65,536= 256
  • √256= 16
  • √16= 4
  • √4= 2

请注意,只需要四个步骤来获得一路下跌到2这是为什么? 好吧,让我们重写的两个大国而言,这顺序:

  • √65,536√2= 16 =(16 2)1/2 = 2 8 = 256
  • √256=√2= 8(8 2)1/2 = 2 4 = 16个
  • 4√16=√2=(2 4)2 = 2.1 2 = 4
  • √4=√2= 2(2 2)1/2 = 2 1 = 2

请注意,我们遵循序列2 16→2→8 2 4→2 2→1。 在每次迭代中,我们削减的两个半功率的指数。 这很有趣,因为这回连到我们已经知道 - 它下降到零之前,你只能除以2澳数k(日志K)倍。

因此,采取任何数量n,并将其写入为n = 2 k。 每次取n的平方根的时候,你减半,公式中的指数。 因此,只能有为O(log K)施加平方根ķ下降到1或更低(在这种情况下,n降低到2或更低)之前。 由于n = 2 K,这意味着K = 2登录n,以及因此采取平方根的数目为O(log K)= O(日志log n)的。 因此,如果有算法,通过反复地减少问题大小的子问题,它是原始问题的大小的平方根的作品,该算法将邻终止后(日志log n)的步骤。

一个真实世界的这个例子是面包车昂德博阿斯树 (VEB树)的数据结构。 甲VEB树为在范围0存储整数的专用数据结构... N - 1。它的工作原理如下:在树的根节点具有√N指针在它,分裂范围0 ... N - 1到√N铲斗各保持一个范围大致√N整数。 这些铲斗然后将每个内部细分为√(√N)桶,其中的每一个大致√保持(√N)的元件。 遍历树,你从根开始,确定哪个桶属于你,然后递归继续在适当的子树。 由于方式VEB树的结构,你可以在O确定(1)的时间下降到其子树,和O后因此(log日志N)的步骤,你将到达树的底部。 因此,在一个VEB树查找需要时间仅O(日志中记录N)。

又如Hopcroft-财富接近的一对点的算法 。 该算法试图2D点集合中找到最接近的两个点。 它的工作原理是建立桶的网格和点分配到这些分组。 如果在算法中的桶被发现,有超过√N点的某一点,该算法递归处理该桶。 因此,递归的最大深度是为O(log log n)的,并且使用它可以表明树中的每个层确实为O(n)工作递归树的分析。 因此,该算法的总运行时间为O(n日志log n)的。

小输入O(log n)的算法

有迹象表明,通过使用算法,如大小的O对象(log n)的二进制搜索实现为O(log log n)的运行时的一些其他算法。 例如, X-快速特里数据结构执行在高度为O(log U)的树以上的层的二进制搜索,所以对于一些它的操作的运行时都为O(log日志U)。 有关Y型快速特里得到了一些它的O(log日志U)运行时通过保持为O(log U)每个节点,允许那些树搜索到时间为O运行的平衡BSTS(日志记录U)。 在探戈树和相关multisplay树的数据结构,结束了一个O(日志log n)的任期在他们的分析,因为他们认为,含有O(log n)的项目每个树。

其他的例子

其他算法实现运行时间为O(log log n)的其他方式。 插值搜索已经预计运行时间为O(log log n)的找到一个排序的数组的数字,但分析是相当复杂的。 最终,分析的工作原理是示出了迭代次数等于数k使得n 2 -k 2≤,对于哪些日志日志n是正确的解决方案。 有些算法,如切瑞顿-的Tarjan MST算法 ,在涉及Ô运行时到达(日志log n)的求解复杂约束优化问题。

希望这可以帮助!



Answer 2:

看到的O因子(日志log n)的时间复杂性的一种方法是通过分裂状的东西在对方的回答解释,但有另一种方式来看到这个因素,当我们要的时间和空间之间的贸易/时间和逼近/时间和硬度/ ...的算法,我们对我们的算法,一些人为的迭代。

例如SSSP(单源最短路径)对平面图形的O(n)的算法,但复杂的算法之前有一个更容易的算法(但仍相当困难)与运行时间为O(n日志log n)的,在算法的基础是如下(只是非常粗略的描述,我会提供跳过理解这一部分,读答案的另一部分):

  1. 分图分成O尺寸的部分(对数N /(日志log n)的),还有一些限制。
  2. 假设各部分提到的是在时间为O新图形G“然后计算SSSP为G”节点(| G‘| *记录| G’|)==>在这里,因为| G'| = O(| G | * loglogN个/ log n)的,我们可以看到(日志log n)的因子。
  3. 计算SSSP每个零件:再次,因为我们有O(| G'|)的一部分,我们可以计算SSSP所有零件的时间| N / LOGN | * |登录N /日志LOGN *日志(LOGN / log日志N)。
  4. 更新的权重,这部分可以在O(N)来完成。 有关详细信息, 该讲义是好的。

但我的观点是,这里我们选择分工中尺寸的O(日志N /(日志中记录N))。 如果我们选择的其他部门一样为O(log N /(日志log n)的^ 2),这可能运行速度更快,带来的另一个结果。 我的意思是,在很多情况下(如在近似算法或随机算法,或算法,如SSSP如上),当我们遍历东西(子问题,可能的解决方案,...),我们选择对应的是,贸易迭代次数我们(的算法的算法/常数因子时间/空间/复杂性,...)。 所以,可能是我们看到比在现实工作算法“.log日志N”更复杂的东西。



文章来源: What would cause an algorithm to have O(log log n) complexity?