【问题标题】:Is a red-black tree my ideal data structure?红黑树是我理想的数据结构吗?
【发布时间】: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


【解决方案1】:

堆会给你O(1)O(log n) 删除和O(log n) 插入,并且比red-更容易实现黑树

【讨论】:

  • 其实移除是O(log N),定位(求值)最小值/最大值是O(1)。
  • 我从来没有见过有 1M-100M 物品的堆,有没有人知道这会如何影响它的速度?
  • @NickLarsen:这正是 Big-O 符号的用途。
  • 我意识到,然而,Big-O 是在理论世界中,而计算机上的 1 亿条记录是在物理世界中。在内存有限的情况下,还有比堆更好的结构吗?
  • @Nick:堆可以用数组实现,所以需要0个额外空间
【解决方案2】:

binary heap 更适合您的需求。由于您只关心定位最小的元素和插入,因此它更容易实现且更快。找到最小元素是O(1),移除是O(log N),插入也是O(log N)。

【讨论】:

  • 实际上,如果他知道他总是插入一个比删除的更大的项目,那么二进制堆(treap)最终会在某一时刻变得非常不平衡。 100M 记录很多,所以这可能会变得足够不平衡,以至于它不再是 O(log(n)),而是 O(n) - 例如,如果当 n=100M 时,treap 的高度最终为 160k,那就是 O(n/((lgn)^2))
  • @Etai - 对于我提到的操作,二进制堆总是O(log N)。我不知道你为什么提到traps,我的回答是指二进制堆,而不是traps。堆确实在堆的结构中发挥了作用,但两者是不同的数据结构。
  • 二进制堆插入平均为O(1)(Brodal 的最坏情况),这是在 BST 上使用它的主要原因:stackoverflow.com/a/29548834/895245
【解决方案3】:

如果需要,最好知道如何创建更复杂的数据结构。然而,通常你最好的选择是尽可能简单地开始,只有在你需要时才使用更复杂的东西。

我实现自平衡树的唯一一次是有一次我碰巧知道我的树会非常大(超过 10,000 个元素),并且数据会以有序的方式涌入。这意味着如果我使用普通的二叉树,我最终会得到几乎一个链表。

如果您的数据是以随机顺序输入的,那么您真的不应该为平衡算法而烦恼。

【讨论】:

  • 首先大致同意 KISS,仅在需要时才复杂。有很多方法可以绕过自平衡的要求,例如创建索引以随机顺序读取数据,但需要注意的是,这只有在您知道要求时才有效。 IE:不用于一般用途,例如创建库。把这个琐事留给以后必须维护你的代码的可怜的混蛋也是非常糟糕的礼仪。也就是说,我大体上同意你的理念。
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 2013-02-01
  • 2011-09-18
  • 2011-02-04
  • 2010-09-30
  • 2017-07-24
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多