数据结构:我应该将哪些条件用于这些条件?

时间:2010-02-21 09:49:47

标签: java performance sorting data-structures multiway-tree

这不应该是一个困难的问题,但我希望有人在我继续之前将其反弹。我只需根据这些预期的活动来决定使用哪种数据结构:

  1. 需要经常按排序顺序进行迭代(从头开始)。
  2. 需要从/ a sorted视图中删除/恢复任意元素。
  3. 稍后我将经常使用数据并处理多个已排序的视图。
  4. 稍后我会经常更改其排序视图中元素的位置。
  5. 顺便说一句,这是Java中的。

    我最好的猜测是,我要么滚动一些自定义链接哈希集(按排序顺序排列链接),要么只使用树集。但我还不完全确定。建议?

    编辑:我想因为任意删除/恢复,我应该坚持使用树集,对吗?

    实际上,不一定。嗯...

2 个答案:

答案 0 :(得分:3)

标准LinkedHashSet或Google集合中的LinkedMultiset,如果您希望数据结构不存储唯一值。

答案 1 :(得分:3)

理论上,我认为正确的数据结构是一个多路树 - 最好像B +树。传统上这是一种基于磁盘的数据结构,但由于缓存和虚拟内存层,现代主存储器具有许多类似的特性。

B +树的有序迭代非常有效,因为(1)您只遍历叶节点的链表 - 不需要分支节点,(2)您获得了非常好的局部性。

查找,删除和插入任意元素是log(n),与任何平衡树一样,但具有不同的常数因子。

在树中求助主要是选择一种算法,该算法在链接的块列表(叶节点)上运行时提供良好的性能,最大限度地减少使用叶节点的需要 - 快速排序或mergesort的变体似乎可能是候选者。一旦项目在分支节点中排序,只需通过叶节点传回摘要信息。

但是 - 实际上,如果你非常确定你需要它,这只是你要做的事情。使用一些标准容器最好的几率是好的。算法/数据结构优化是最好的一种优化,但它仍然是不成熟的。