在做了一些思考之后,我得出结论,我需要一个支持的数据结构:
当然,我想以最好的复杂性实现这一点。
我的想法是,自平衡二分查找树将在O(log(n))中执行A-D(最坏情况)。 也许这可以以某种方式改进,所以A-C将在O(log(n))和D(我认为会更频繁)将在O(1)中运行。
我做了一个最糟糕的案例分析,但是如果你能想到一些“快速”运行的东西,但是它的摊销分析或平均而不是没有问题。 欢迎任何改进我的想法!
(注意:我相信A和D会比B和C更频繁)
答案 0 :(得分:0)
它需要是某种排序的,平衡的树。任何树都不太可能明显更适合最小删除,因为它仍然需要重新平衡。您要求的所有操作都是O(log(n))。红黑树很容易用C ++和Java语言提供。
答案 1 :(得分:0)
您所描述的是priority queue,并通过“查找”操作进行了扩充。
通常以min-heap来实现。您列出的所有操作(“查找”除外)都在O(log n )中运行,特别是此作业的最高效整体数据结构。值得注意的是,这是一个二叉树的特例,它可以比一般的二叉搜索树更有效地实现,无论是在内存消耗和性能方面(相同的渐近性能,还有更好的常数因子)。
不幸的是,“find”仍然需要O( n )。
它在PriorityQueue
类中以Java实现。