2013-04-15 9 views
10

Ich habe versucht, alle Primzahlen vor 600851475143 zu bekommen. Ich verwendete Sieb von Eratosthenes für diese. Dies erfordert, dass ich ein boolesches Array dieser riesigen Größe erstelle. Schlechte Idee, Sie können nicht genügend Arbeitsspeicher haben. Jeder andere Weg. Ich versuchte, eine Zeichenkette zu verwenden, jeden Index mit Werten 0 & 1 verwendend, um wahr oder falsch darzustellen. aber die Methode indexOf gibt auch int zurück.Wie Array von Größe größer als Integer max zu erstellen

Als nächstes verwende ich 2d-Array für mein Problem. Gibt es noch eine andere Möglichkeit, ein so großes Array zu speichern?

+17

"Ich habe versucht, alle Primzahlen vor 600851475143 zu bekommen." Das ist der falsche Ansatz für dieses Projekt-Euler-Problem. –

+1

können Sie Vektor verwenden. –

+7

Ich würde vorschlagen, dass, wenn Ihre Lösung erfordert, dass Sie 600 MILLIARDEN Array-Einträge machen, dann müssen Sie einen neuen Ansatz zu nehmen. – Patashu

Antwort

0

Verwenden Sie BitSet. Sie können dann ein beliebiges Indexelement Bit setzen. 600851475143 ist 2^39 und nimmt somit nur 39 Bits intern (tatsächlich wird es in Wirklichkeit 64 Bits belegen, da es lange verwendet).

Sie können infact bewegen bis 2^63, die für die meisten Zwecke

+3

Er würde 2^39 Bits brauchen, nicht 39. – assylias

+1

Das OP benötigt 600851475143 Bitflags (oder halb so viele, wenn gerade Zahlen übersprungen werden, ein Drittel, wenn auch Vielfache von 3 übersprungen werden, einige weniger, wenn Vielfache von kleineren Primzahlen übersprungen werden. Das wären immer noch mehr Einträge, als in einem BitSet indiziert werden können. –

+0

@assylias yeah ur right – Stephan

6

I hatte ein ähnliches Problem ist massiv und i verwenden Satz ein Bit (im Allgemeinen 1 oder 0 für eingestellt den Versatz um gewünscht) und i recomend Verwendung es EWAHCompressedBitmap wird auch Ihre Bit

EDIT

gesetzt komprimieren Als Alan die BitSet sagte 70GB Speicherplatz belegen, aber Sie noch etwas anderes tun können: mehrere BitSets (aufeinanderfolgende haben, so dass Sie die absolute Position berechnen kann,) und laden Sie im Speicher nur das BitSet, das Sie in diesem Moment so etwas wie eine Lazy Load benötigen, in diesem Fall haben Sie die Kontrolle über den verwendeten Speicher.

7

Die Speicheranforderung für 600801475143 booleans ist bestenfalls 70 GB. Dies ist nicht möglich. Sie müssen entweder die von Stephan vorgeschlagene Komprimierung verwenden oder einen anderen Algorithmus zum Berechnen der Primzahlen verwenden.

+7

Es ist machbar, aber wahrscheinlich nicht realistisch! – assylias

+0

Nun, ich hätte wahrscheinlich klarstellen müssen, dass es, wenn möglich, nicht möglich ist (aka praktisch) mit etwas weniger als ein ernsthaft High-End-Computer (oder möglicherweise Supercomputer). – Alan

+0

Ich möchte keine Bibliothek verwenden, obwohl EWAHCompressedBitmap sehr vielversprechend ist, werde ich BitSets der Größe 32 MB verwenden. Und füge lazy loading hinzu. Auf der Suche nach einer besseren Option. Der traditionelle Weg für dieses Problem ist zu langsam, aber macht den Job. –

2

Es ist nicht wirklich praktisch, sich für jede Zahl zu merken, wenn es für eine so große Menge eine Primzahl war oder nicht (das Sieb ist ein sehr langsamer Ansatz für große Zahlen im Allgemeinen).

Von dieser link erhalten Sie eine Idee, wie viele Primzahlen kleiner als X erwartet werden. Für Ihre 600 Milliarden Reichweite können Sie erwarten, dass etwa 20 Milliarden Primzahlen in diesem Bereich existieren. Speichern sie so lange [] würde etwa 160 GB Speicher erfordern ... dass deutlich mehr als die vorgeschlagenen 70 GB für die Speicherung eines einzelnen Bits für jede Nummer, die Hälfte, wenn Sie gerade Zahlen ausschließen (2 ist die einzige gerade Primzahl).

Für einen Desktop-Computer 35 GB im Speicher möglicherweise ein bisschen viel, aber eine gute Arbeitsstation kann so viel RAM haben. Ich würde ein zweidimensionales Array mit Bitverschiebung/Maskierung versuchen.

Ich würde immer noch erwarten, dass Ihr Sieb-Code eine erhebliche Menge an Zeit (etwas von Tagen bis Jahren) laufen. Ich schlage vor, Sie untersuchen fortgeschrittenere Prime-Nachweismethoden als Sieb.

Verwandte Themen