【发布时间】:2015-03-03 01:08:07
【问题描述】:
我的目标是一个可以完成两件事的排序数据结构:
- 快速插入(在位置根据排序顺序)
- 我可以快速地将我的数据分割成所有大于或小于或等于元素的集合。 我需要知道每个分区的大小,并且我需要能够“获取”这些分区。
目前,我正在使用 ArrayList 在 java 中实现这一点,它很容易提供 #2,因为我可以执行二进制搜索 (Collections.binarySearch) 并获得一个插入索引,告诉我在什么时候插入一个元素。然后基于索引范围从 0 到数组大小的事实,我立即知道有多少元素大于我的元素或小于我的元素,并且我可以轻松获取这些元素(作为子列表)。但是,这没有属性 #1,并导致过多的数组复制。
这让我想使用像 SkipList 或 RedBlackTree 这样可以更快地执行插入的东西,但是我不知道如何在不花费 O(N) 时间的情况下满足属性 #2。
任何建议将不胜感激。谢谢
编辑:感谢以下参考数据结构的答案,这些数据结构在 O(logN) 时间内执行插入并且也可以快速分区,但我想强调 size() 要求 - 我需要知道这些分区而不必遍历整个分区(其中,according to this 是 TreeSet 所做的。这背后的原因是,在我的用例中,我使用多个不同的数据结构副本来维护我的数据,每个副本都使用不同的比较器,然后需要问“根据什么比较器是大于特定元素最小的所有事物的集合”。在ArrayList 的情况下,这实际上很容易,并且只需要 O(YlogN) 其中 Y 是比较器的数量,因为我只需对每个 Y 数组进行二进制搜索并返回具有最高插入索引的数组列表。我不清楚如何在不采用 O(YN) 的情况下使用 TreeSet。
我还应该补充一点,即使无法准确求解,插入索引的近似答案仍然很有价值。
【问题讨论】:
-
我可能有误解,但是将堆实现为数组有什么问题?
标签: java arrays data-structures