2

我正在做一些事情,我必须存储相当多的项目(大约几千个)。

项目会被频繁地插入、删除和访问;然而,一个项目的值越大,它就越有可能被插入、删除或访问。

此外,我想支持对结构中的前“k”个项目进行非常快速的排序,其中“k”相当小。

因此,理想情况下,进行这些操作的成本将与其价值直接相关。

一个简单的旧链表,其中项目始终保持排序将是这里的幼稚方法,但在所有情况下的性能仍然很重要;在一般情况下,我希望操作比 O(n) 更好。

我在这个问题上进行了相当多的头脑风暴,我很困惑。

起初我认为Beap可能是理想的数据结构,但搜索并不偏向于 Beap 的顶部;相反,他们从底角开始,然后向上和向上工作。不是我需要的。

某种风格的二叉搜索树似乎不是正确的解决方案,因为尽管这些操作是 O(log n),但我希望对更大的值做得更好。

我需要的几乎是一个翻转的二叉搜索树,这样我就可以从右下角开始遍历。但我正试图绕过它,看看它是否对我有用。我认为它会提供 O(2 log n) 最坏情况下的性能,并且对于更大的值比 O(log n) 更好......但我不完全确定。

有这样的数据结构吗?还是我必须发明一个?

4

2 回答 2

1

如果可以接受概率数据结构,请使用(稍作修改)Skip list

元素应按降序存储。还应修改搜索操作以在底部列表中的头元素处开始搜索(而不是在顶部列表中,如普通跳过列表)。

插入/删除/搜索操作的预期时间为 O(log K),其中 K 是大于插入/删除/搜索的元素的数量。最坏情况的时间复杂度是 O(K)。

于 2013-03-01T13:20:56.747 回答
0

为什么不能使用?它们将最大的项目存储在更靠近顶部的位置,并支持亚线性时间内的所有操作。此外,显然基于堆的heapsort允许非常快速地对数组进行部分排序(获取前 N 个元素)。

于 2013-03-01T13:53:40.633 回答