在实际应用中,使用而不是O(log (n ))算法有具体的好处吗?
当使用例如van Emde Boas树而不是更常规的二进制搜索树实现时就是这种情况。但是例如,如果我们取那么在最佳情况下,双对数算法的对数性能比对数算法高(大约为5)。而且一般来说,实现起来更加棘手和复杂。
考虑到我个人比VEB树更喜欢BST,您怎么看?
一个人可以很容易地证明:
在实际应用中,使用而不是O(log (n ))算法有具体的好处吗?
当使用例如van Emde Boas树而不是更常规的二进制搜索树实现时就是这种情况。但是例如,如果我们取那么在最佳情况下,双对数算法的对数性能比对数算法高(大约为5)。而且一般来说,实现起来更加棘手和复杂。
考虑到我个人比VEB树更喜欢BST,您怎么看?
一个人可以很容易地证明:
Answers:
实际上,我自己曾经对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树的速度大约是哈希图的两倍,是位数组的十倍,是二进制搜索树的五倍。
当然,上面的内容需要免责声明:测试是人为的,您可以改进代码或将其他语言与输出速度更快的编译器一起使用,等等。
此免责声明是我们在算法设计中使用渐近分析的原因的核心:由于您不知道常量是什么,并且常量可能根据环境因素而变化,因此我们能做的最好的就是渐进分析。