【问题标题】:Data structures: Which should I use for these conditions?数据结构:我应该在这些条件下使用哪个?
【发布时间】:2010-02-21 09:49:46
【问题描述】:
这应该不是一个困难的问题,但我只是希望有人在我继续之前将其反弹。我只需要根据这些预期的活动来决定使用什么数据结构:
- 需要按排序顺序频繁迭代(从头部开始)。
- 需要从排序视图中删除/恢复任意元素。
- 稍后我将经常使用数据并处理多个排序视图。
- 稍后我还会经常更改元素在其排序视图中的位置。
顺便说一下,这是用 Java 编写的。
我最好的猜测是,我要么滚动一些自定义链接哈希集(按排序顺序排列链接),要么可能只使用树集。但我还不能完全确定。推荐?
编辑:我想由于任意删除/恢复,我应该坚持使用树集,对吧?
其实,不一定。嗯……
【问题讨论】:
标签:
java
performance
sorting
data-structures
multiway-tree
【解决方案1】:
理论上,我认为正确的数据结构是多路树 - 最好是像 B+ 树这样的东西。传统上这是一种基于磁盘的数据结构,但现代主存由于缓存和虚拟内存层而具有许多相似的特征。
B+ 树的按序迭代非常有效,因为 (1) 您只需遍历叶节点的链表 - 不需要分支节点,并且 (2) 您可以获得非常好的局部性。
查找、删除和插入任意元素是 log(n) 与任何平衡树一样,但具有不同的常数因子。
在树中进行重新排序主要是选择一种算法,该算法在对块的链表(叶节点)进行操作时提供良好的性能,最大限度地减少使用叶节点的需要 - 快速排序或合并排序的变体似乎很可能是候选者.一旦项目在分支节点中排序,只需通过叶节点将摘要信息传播回来。
但是 - 务实地说,这只是你非常确定自己需要它时才会做的事情。您最好使用一些标准容器的可能性很大。算法/数据结构优化是最好的优化方式,但仍为时过早。
【解决方案2】:
如果您希望数据结构存储非唯一值,请使用来自 google 集合的标准 LinkedHashSet 或 LinkedMultiset。