如果我不知道访问每个元素的概率,但我确信某些元素会比其他元素更频繁地被访问,我将使用Splay tree。如果我已经知道所有概率,我应该使用什么?我认为在这种情况下应该有一些比展开树更好的数据结构。
我试图想象我应该在何时何地使用每种类型的搜索树的所有情况。也许有人可以发布一些关于比较所有搜索树和类似结构的文章的链接?
编辑我希望仍然O(log n)
是最坏的情况,但总的来说它应该更快。展开树是很好的例子,但我想预定义这棵树的配置。
例如,我有一个要存储的元素数组[a1, a2, .. an]
,以及每个元素的概率,这些概率[p1, p2, .. pn]
定义了我访问每个元素的频率。我可以创建展开树,将每个元素添加到展开树 ( O(n log n)
),然后以给定的概率访问它们以制作所需的树。因此,如果我有概率[1/2, 1/4, 1/4]
,我需要展开第一个元素,使其成为第一个元素。所以,我需要按概率对元素进行排序,并按照访问概率从低到高的顺序展开它们。这O(n log n)
也需要。因此,构建这种树的总时间是O(n log n)
一个很大的常数。我的目标是降低这个数字。
我不介意使用其他东西,但不介意搜索树,但我希望时间低于 Splay 树的情况。我希望搜索、插入和删除都在O(log n)
摊销的范围内。