Wie man ein großes Array in Java erstellt

7

Ich möchte ein boolesches Array mit einer Größe erstellen, die der Benutzer als Eingabe verwenden wird. Zum Beispiel - Der Benutzer könnte eine große Zahl wie 1000000000000 setzen; Also muss ich ein Boolesches Array der Größe 1000000000000 erstellen. Das Problem, dem ich gegenüberstehe, ist, dass ich die Eingabe nicht als int speichern kann, da sie eine so große Zahl nicht halten kann - also kann ich das Array nicht erstellen Option. Ich kann die Eingangsnummer als doppelt speichern, aber ich weiß nicht, wie man das Array der Größe der doppelten Zahl erstellt. Das war die Idee -

%Vor%

was nicht funktioniert, wenn das Ziel den int-Bereich überschreitet. Jede Hilfe wird geschätzt.

Update: Danke Jungs. Sie können also nur ein Array mit der maximalen Größe von int erstellen (2147483648), oder? Der Speicheraspekt hat mich früher nicht getroffen. Gehen wir einen anderen Weg.

    
Tahniat Ashraf 26.03.2013, 06:48
quelle

5 Antworten

7
  

muss ein boolesches Array der Größe 1000000000000 erstellen. Das Problem, dem ich gegenüberstehe, ist, dass ich die Eingabe nicht als int

speichern kann

Dein Problem ist nicht das. Ihr Hauptproblem besteht darin, dass Sie nicht genügend Arbeitsspeicher haben, um eine Datenstruktur mit 1.000.000.000.000 Elementen zu belegen (selbst wenn Sie die Einschränkungen von int indexing überwunden haben).

Sie müssen den Algorithmus überdenken.

    
NPE 26.03.2013, 06:50
quelle
11

Sie können in Java kein Array erstellen, dessen Größe größer als die maximale positive int ist, weil array-Indizes sind int . (Dasselbe gilt für die verschiedenen List Implementierungen . Sie < em> kann in der Lage sein, einen mit mehr Einträgen zu erstellen [a LinkedList , zum Beispiel], aber Dinge wie get und size starten nicht ganz richtig, man konnte nur bei späteren Einträgen über einen iterator [unter der Annahme, dass die Dinge nicht einfach kaputt gingen], was eine Weile dauern würde.)

Es scheint unwahrscheinlich, dass Sie wirklich ein Array von boolean mit Platz für mehr als 2.147.483.647 Einträge erstellen müssen, aber wenn Sie das wirklich tun, müssen Sie mehrere Arrays erstellen und das richtige auswählen, indem Sie den Modulo von Ihr Index (der ein long sein muss). (Oder verwenden Sie eine Nicht-JDK-Bibliothek, falls eine vorhanden ist, um das zu tun.) Das würde etwas wie 4 G RAM benötigen. Machbar, aber die Chancen sind ziemlich hoch, dass ein anderer Ansatz besser wäre.

Aber 1.000.000.000.000 Elemente? Das würde in der Größenordnung von 1-2 TB RAM erfordern. Wie NPE sagt, wenn Sie nicht auf einem Supercomputer laufen, werden Sie das nicht haben.

    
T.J. Crowder 26.03.2013 06:50
quelle
1

Wie wäre es mit einer HashMap und langen Schlüsseln und booleschen Werten?

Da haben Sie mehrere Vorteile.
1. Sie können Indizes innerhalb des Bereichs von long verwenden 2. Sie müssen sich keine Gedanken über die maximale Größe des verwendeten Item-Index machen. Solange es lang ist, wird es funktionieren 3. Sie reservieren keinen Speicher für die gesamte Sammlung im Voraus. Stattdessen verwenden Sie nur den Speicher, den Sie benötigen.

    
Rakhitha 26.03.2013 06:52
quelle
1

Sie könnten eine Abstraktion erstellen, zum Beispiel ein Array von Arrays (Sie können dies sogar ändern).

Objekt [] [] kann boolesch sein oder was auch immer.

%Vor%

Sie könnten auch die erste Dimension ändern, sagen wir 3. In diesem Fall Objekt [3] [Integer.MAX_VALUE], Sie können (2 ^ 31 -1) * 3 = 2.147.483.647 * 3 = 6442450941 Elemente erstellen und Sie benötigen (2 ^ 31 - 1) * 3 * 4 = ~ 23 GB RAM, was eigentlich möglich ist !!! :)

    
Yan Khonski 25.03.2016 10:52
quelle
0

Zuallererst: Du brauchst wirklich einen guten Grund, soviel Speicher zuzuweisen. Wie andere bereits gesagt haben, möchten Sie vielleicht den Ansatz überdenken.

Einige Vorschläge: Beschränken Sie entweder den zuzuteilenden Betrag auf ein Maximum oder speichern Sie ihn in einer Datei und suchen Sie nach den Daten oder ordnen Sie sie nach Bedarf zu (faule Zuweisung). Wenn die Daten spärlich sind (wenige tatsächliche Boolesche Werte, aber bei sehr weit verbreiteten Indizes), ist eine Karte besser geeignet. Wenn es hauptsächlich Nullen sind, sollten Sie nur die Folgenden speichern:)

Zweitens: Es ist theoretisch möglich, 8 * die maximale Boolesche Array-Größe zuzuweisen, wenn Sie die Bits packen. Siehe diese Diskussion zur Inspiration: Implementieren eines C-Stil-Bitfeldes in Java

>     
Anders Johansen 26.03.2013 06:54
quelle

Tags und Links