【问题标题】:How to can I create an array of 10^15 positions?如何创建一个包含 10^15 个位置的数组?
【发布时间】:2014-11-24 13:32:27
【问题描述】:

我需要创建一个 10^15 个位置的数组,根据位置的数量,我认为有必要创建一个长数组,但是数组的索引需要是 Int,我尝试使用 BigInteger但是它需要将 BigInteger 转换为 Int 并且这样做时它会变为负数,因此无法创建数组。

代码如下:

BigInteger num = new  BigInteger("1000000000000000");
    long[] array = new long[num.intValue()];

如果我打印 num.intValue() 它表明数字是 -1530494976

【问题讨论】:

  • 那是位旋转。 num 已超过 int 的大小限制。您必须只使用 BigInt
  • 我觉得你需要重新设计你正在制作的任何东西,如果你需要一个那么大的数组。如果你告诉我们更多关于你想要做什么的信息,也许我们可以建议一种不需要如此庞大的数组的方法。
  • 你最好打电话给谷歌。我不确定其他人有这么多存储空间。
  • 另外,请记住,将数组声明为long[] 仅意味着您将在其中存储长整数,而不是整数、字符串或任何其他类型/类。它不影响数组大小。
  • A long 是 64 位。 64*10^15 位是 7,11 PB,或 7275,96 TB。您拥有如此大量内存的可能性绝对为0。仅将数组设置为 0 就需要数年时间。

标签: java arrays biginteger


【解决方案1】:

Java 中的数组仅限于 Integer.MAX_VALUE 条目。 如果您需要更多元素,则需要有多个数组,每个数组都存储一些部分。 它可能看起来像这样:

long[][] array = new long[1_000_000][1_000_000_000];

BigInteger num = your-actual-array-index-you-want-access;
int majorIndex = num.longValue() / 1_000_000;
int minorIndex = num.longValue() % 1_000_000;
array[majorIndex][minorIndex] = value;

但是:你知道这会占用多少内存吗?我怀疑你的机器有那么多内存......

【讨论】:

  • 64 位长 * 10^15 = 6.4*10^16 位 / 8 / 1024 / 1024 / 1024/ 1024 / 1024 = ~7 PB...是的,我也怀疑
【解决方案2】:

Java 的库存数组的大小限制为最大Integer.MAX_VALUE。有第三方库试图克服这个限制(例如 JLargeArrays),但是......如果你真的想要那么多字段,你应该仔细检查。也许您的算法设计不佳。但我当然不能从你的帖子中看出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2017-09-19
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多