【发布时间】:2011-01-31 07:01:18
【问题描述】:
我有一组要处理的项目(大有理数)。在每种情况下,处理将包括删除集合中最小的项目,做一些工作,然后添加 0-2 个新项目(这将始终大于删除的项目)。集合将用一个项目初始化,工作将继续,直到它为空。我不确定该系列可能达到什么尺寸,但我希望在 1M-100M 范围内。除了最小的以外,我不需要找到任何物品。
我目前正计划使用红黑树,可能会进行调整以保留指向最小项目的指针。但是我以前从未使用过,我不确定我的使用模式是否适合它的特点。
1) 从左侧删除+随机插入的模式是否存在影响性能的危险,例如,需要比随机删除显着更高的旋转次数?或者在这种使用模式下删除和插入操作仍然是 O(log n) 吗?
2) 其他一些数据结构是否会因为删除模式或利用我只需要找到最小的项目这一事实给我更好的性能?
更新:很高兴我问到,对于这种情况,二叉堆显然是更好的解决方案,而且正如所承诺的那样很容易实现。
雨果
【问题讨论】:
-
除非您确定新计算的值不需要逻辑删除的节点,否则您可能希望忽略或延迟删除。 Halt & Sweep 方法应该适用于后者,其中重新平衡代码访问变得过于混乱的子树的根以重新平衡 en'masse。这可以防止严重退化,同时仍然提供可能的无删除性能前景。
标签: language-agnostic optimization data-structures binary-tree