3

我需要一个节省空间的集合来存储大量基元int(s)(大约 800,000 个整数),它允许快速操作contains()& 允许按定义的顺序进行迭代。

contains()检查列表中是否存在 int 的更快操作是主要优先事项,因为这种操作非常频繁。


我愿意使用广泛使用和流行的 3rd 方库,如 Trove、Guava 等。

我看过 Trove 的TIntSet,但我相信这不会让我定义迭代的顺序。

编辑:

集合的大小约为 800,000 个整数。集合中的值范围将从 0 到Integer.Max_VALUE. 迭代的顺序实际上应该基于我将值添加到集合的顺序,或者我可能只是提供一个有序的 int[] 并且它应该以相同的顺序进行迭代。

4

5 回答 5

5

作为数据结构,我会选择一个long 数组(我在逻辑上将其视为两个 int)。高 int 部分(位 63 - 32)表示您添加到集合中的int 值。低整数部分(位 31 - 0)表示迭代时后继者的索引。如果您有 800.000 个唯一整数,您需要创建一个大小为 800.000 的长数组。

现在您将数组组织为按您的值排序的二叉平衡树。左边是较小的值,右边是较高的值。您还需要两个跟踪值:一个 int 指向开始迭代的第一个索引,一个 int 指向最后插入的值的索引。

每当您添加一个新值时,重新组织您的二叉平衡树并从最后一个添加的值更新指向当前添加的值(作为索引)的指针。

将此值(数组和两个 int 值)包装为您选择的集合。

使用这种数据结构,您可以获得O(log(n))的搜索性能和两倍于值大小的内存使用量。

于 2012-04-27T11:55:35.087 回答
3

由于这个数据库很臭,但您需要更直接的方法,请使用 java.nio 的内存映射文件。尤其是 800_000 个整数的自定义排序不会这样做。包含可以通过内存中的 BitSet 来实现,与文件中的排序平行。

于 2012-04-26T11:42:24.940 回答
1

您可以使用 2Sets个基于散列(例如TIntSet)设置的一组进行快速contains操作。另一个是基于树结构设置的,例如TreeSet以特定顺序迭代。
当您需要添加 int 时,您同时更新两个集合。

于 2012-04-26T11:31:48.123 回答
0

听起来LinkedHashSet可能就是您正在寻找的东西。在内部,它维护两个结构 - aHashSet和 a LinkedList,允许快速“包含()”(来自前者)和定义的迭代顺序(来自后者)。

于 2012-04-26T11:33:42.710 回答
-1

只需使用ArrayList<Integer>.

于 2012-04-26T11:30:07.033 回答