对数与双对数时间复杂度


9

在实际应用中,使用而不是Olog n 算法有具体的好处吗?O(log(log(n))O(log(n))

当使用例如van Emde Boas树而不是更常规的二进制搜索树实现时就是这种情况。但是例如,如果我们取那么在最佳情况下,双对数算法的对数性能比对数算法高(大约为5)。而且一般来说,实现起来更加棘手和复杂。n<1065

考虑到我个人比VEB树更喜欢BST,您怎么看?

一个人可以很容易地证明:

n<106. lognlog(log(n))<5.26146


基本上,您应该查看算法中涉及的常量以减小输入的值/大小。理想情况下,我们希望它们很小。
singhsumit 2012年

3
O(log log n)O(log log n)O(n log log n)的预期时间与线性空间。O(log log n)由Han和Thorup撰写。
2012年

在现实世界中,因子5非常重要,并且项数通常可以是10 ^ 9甚至10 ^ 12。
RBarryYoung

Answers:


10

lognlog(n)log(logn)

log(n)log(log(n))

log(n)/ log(log(n))
[ 来源 ]

100000clog(n)dlog(log(n))c,d

n

n * log(n)/(n * log(log(n)))
[ 来源 ]

现在,如果那不值得,那我就不知道了。


6

可以想象,复杂性的差异实际上并不重要,而实际的运行时间更为重要。但是,如果该算法是另一种算法的核心,那么这种差异可能很重要。

从纯粹的理论目的来看,差异当然很重要,尤其是如果该算法是另一算法的一部分。可能会将较大的算法放在不同的复杂度类别中。


6

实际上,我自己曾经对van Emde-Boas树进行了基准测试。我将其与AA树,哈希图和位数组进行了比较。

测试size将在间隔中执行随机插入[0, bound],然后size搜索,然后size删除,然后再次size搜索。删除操作也会对随机数进行,因此您首先必须确定它们是否完全在结构中。

以下是以秒为单位的结果(size= 2000000,bound= 10000000):

AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting...  7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting...  0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting...  1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting...  0.2387776
Searching... 0.3413800

如您所见,van Emde-Boas树的速度大约是哈希图的两倍,是位数组的十倍,是二进制搜索树的五倍。

当然,上面的内容需要免责声明:测试是人为的,您可以改进代码或将其他语言与输出速度更快的编译器一起使用,等等。

此免责声明是我们在算法设计中使用渐近分析的原因的核心:由于您不知道常量是什么,并且常量可能根据环境因素而变化,因此我们能做的最好的就是渐进分析。

lognloglogn232log232=32log32=5


也许跳入R(或等效项)并生成一些漂亮的图形(如@Raphael那样)。
戴夫·克拉克

1
lognloglogn

@DaveClarke:感谢您的建议。不幸的是,我很难产生漂亮的图片-我认为我的编辑确实提高了结果的可读性。
Alex 10 Brink 2012年

可能没有足够的数据来拍摄合适的照片。没关系....但是学习制作好照片是一种方便的技能。
戴夫·克拉克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.