java - 数据结构推荐

标签 java data-structures complexity-theory bitset

用 Java 开发,我需要一个数据结构来选择 0 到 999999 之间的 N 个不同的随机数?

我希望能够快速分配 N 个数字并确保它们不会重复。

主要目标是不使用太多内存并仍然保持合理的性能。

我正在考虑使用 BitSet但我不确定内存是否有影响。 有人可以告诉我这个类的内存需求是否与位数或设置位数有关?设置/测试的复杂性是多少?

更新: 感谢迄今为止所有的回复。

我认为我在这个问题的最初措辞中已经提到了这一点,但当我第一次看到 BitSet 类时将其删除。 无论如何,我想添加以下信息: 目前我正在查看最多几千个中的 N 个(最有可能在 1000-2000 左右),数字范围为 0 到 999999。 但我希望我的选择考虑将范围增加到 8 位数字(即 0 到 99 999 999),同时将 N 保持在大致相同的范围(可能增加到 5K 或 10K)。 所以“使用值”非常稀疏。

最佳答案

这取决于有多大N是。

对于 N 的小值,您可以使用 HashSet<Integer>保存您已经发出的号码。这给你O(1)查找和 O(N)空间使用情况。

一个BitSet对于范围 0-999999 将使用大约 125Kb,无论 N 的值如何。对于足够大的 N 值,这将比 HashSet 更节省空间。 。我不确定 N 的具体值是什么是 BitSet将使用更少的空间,但我的估计是 10,000 到 20,000。

<小时/>

Can someone tell me if the memory requirements of BitSet are related to the number of bits or to the number of set bits?

大小由曾经设置的最大位或nBits决定。参数,如果您使用 BitSet(int nBits)构造函数。

and what is the complexity to setting/testing a bit ?

测试位BO(1) .

设置位BO(1)最好的情况,和O(B)如果您需要扩展位集支持数组。然而,由于后备阵列的大小是 2 的下一个最大幂,因此扩展成本通常可以分摊到多个 BitSet 上。操作。

关于java - 数据结构推荐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299937/

相关文章:

java - 实现比较方法的 Comparable 接口(interface)的 Widget 类

c++ - 查找从未排序的数组中删除的一个和 N 个元素

mysql - 限制 LEFT JOIN 组的数量

algorithm - 以下算法的复杂性

algorithm - 计算 log(n) + Ө( sqrt(n)) 的渐近极限

java - 用于基于类型的查询的最佳数据结构是什么?

java - 将内容附加到 StringBuffer 对象时无法实现换行 usint "\n"

java - 调度线程时的 JVM 公平性

java - 语法 "final String... args"是什么意思/做什么?

c - 我想将数据插入二叉树,但在 3 个输入后显示段错误