簡體   English   中英

如何通過BigIntegers索引BigIntegers數組

[英]How to index an array of BigIntegers by BigIntegers

我正在嘗試構建一個BigIntegers數組,但似乎數組需要由整數自己編制索引(如果是真的,那對我來說似乎非常愚蠢,但我希望我只是誤解了一些東西)。 我正在嘗試的基本上是以下內容:

BigInteger totalChoiceFunctions = BigInteger.valueOf(50031545098999704);
BigInteger[][] choiceFunctions = new BigInteger[totalChoiceFunctions][36];

但這會導致錯誤“類型不匹配:無法從BigInteger轉換為int”。 為了解決這個問題,我嘗試了:

BigInteger[][] choiceFunctions = new BigInteger[totalChoiceFunctions.intValue()][36];

但這似乎沒有幫助。 當我編譯並運行時,我得到運行時錯誤:

exception in thread 'main' java.lang.NegativeArraySizeException

很困惑,我查看了BigInteger的intValue()方法的oracle文檔,發現“如果這個BigInteger太大而不適合int,只返回低位32位。請注意,此轉換可能會丟失有關BigInteger值的總體大小以及返回帶有相反符號的結果“。 我懷疑這是正在發生的事情,考慮到50031545098999704對於int來說肯定太大了(為什么我轉向BigIntegers數組,因為我希望我的數組被1到50031545098999704的數字索引)。

如果我的理解是正確的,那么:

BigInteger[][] chioceFunctions = new BigInteger[totalChoiceFunctions][36];

創建一個存儲 BigIntegers但仍由int 編制索引的數組。 如何創建一個存儲並由BigIntegers索引的數組? 可能嗎? 請注意,我使用此代碼的代碼在這種情況下可能能夠工作,如果我使用long而不是int來索引,但我希望它擴展到我將被迫由BigIntegers索引的大小。 我錯過了一些明顯的東西嗎

java中的數組不稀疏,因此您的數組需要大約200 000 TB(不包括引用的數組/ BigIntegers)。 所以不,目前不可能。 有一些計划支持long作為數組中的索引,可能是java 10(當然不是java9)。

我想你實際上想要一個稀疏的數據結構; 一個Map <BigInteger,BigInteger>或者你有一個嵌套數組Map <Tuple <BigInteger,Integer>,BigInteger>應該適合你。

不,這是不可能的。 在java中,所有數組僅由整數索引。

理論上(但不實用),你可以創建這樣一個類。

一個普通的數組不能動態增加它的大小,對嗎? 但是ArrayList可以! 它怎么能這樣做? 好吧,當容量已滿時,通過重新創建一個更大尺寸的新陣列。

你可以在這里應用相同的邏輯。

普通數組不能容納50031545098999704項。 但是你可以創建多個數組來保存它們!

所以在你的班上,你應該有一個矩陣:

public class BigIntegerArray<T> {
    private T[][] innerMatrix;
}

構造函數將接受一個數字作為數組長度,對吧? 使用數組長度,您可以知道需要多少個數組。 例如,如果數組大小為N,其中Integer.MAX_VALUE < N <= Integer.MAX_VALUE * 2 ,則您知道應該像這樣初始化內部矩陣:

innerMatrix = new T[2][Integer.MAX_VALUE];

只是使用一些數學!

並且您希望實現getset方法。 如果索引大於Integer.MAX_VALUE但小於或等於Integer.MAX_VALUE * 2 ,請按如下方式訪問:

innerArray[1][index - Integer.MAX_VALUE]; // not real code. I'm just illustrating the point.

你理解我的意思? 這基本上是簡單的數學。

編輯:

也許我沒有解釋得這么好。 創建內部矩陣的算法如下:(偽代碼)

if arraySize is smaller than Integer.MAX_VALUE then
    create an array of size arraySize
    return
initialize a variable counter to 0
while arraySize > 0
    subtract Integer.MAX_VALUE from arraySize
    increment counter
create an array with the array size of counter

訪問部分類似:

if index is smaller than Integer.MAX_VALUE then
    access [0][index]
    return
initialize a variable counter to 0
while arraySize > 0
    subtract Integer.MAX_VALUE from arraySize
    increment counter
access [counter][index - Integer.MAX_VALUE * counter]

Java只允許你通過int索引你可以實現的最大索引是Integer.MAX_VALUE ,它是2 GB的1字節,即2147483647.你的數組不能容納大於此值的數字。

您應該使用擴展超過int限制的數據結構,例如maps Maps行為類似於2D Array沒有任何限制,您可以將它們存儲為: -

Map m = new HashMap<BigInteger,BigInteger>();

與簡單的2D array相比,插入和檢索會稍微困難一些,但考慮到僅使用int的索引的局限性,我們必須采用另一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM