G
Gast2
Gast
Hi,
ich habe ein kleines Problem und hoffe ihr könnt mir da ein wenig helfen.
Folgende Situation:
Ich habe ein 2D-Feld bei dem jedes Feld 2 Zustände (tod oder lebendig) annehmen kann. Ich habe es daher zuerst mit einem 2d-boolean Array versucht. Damit bekomme ich auch eigentlich alle Berechnungen hin wenn es um einen kleinen Maßstab geht.
Der Programmablauf sieht in etwa so aus: Für jede Zelle des Arrays wird überprüft wieviele Nachbarn dieser Zelle leben. Je nachdem wieviele das sind ändert sich dann der Zustand dieser Zelle oder er bleibt gleich.
(Dazu sei gesagt, dass am Anfang vllt 50% der Zellen lebendig sind, das nimmt im Laufe der Zeit aber stetig ab).
Wie gesagt, im kleinen Maßstab ist das überhaupt kein Problem. Nehme ich dann aber z.b. eine Feldgröße von 1.000.000 * 1.000.000 komme ich damit nichtmehr klar Ich habe schon Implementierungen gesehen in denen solche Zahlen verwendet wurden, es muss also irgendwie möglich sein.
Jetzt suche ich ne Datenstruktur um das ganze auf die oben genannte Größe zu bringen. Da habe ich mir folgendes überlegt:
1. 2d-boolean Array: bei 1m*1m komme ich schon auf mehrere GB an Datenvolumen.
2. ne Art Liste in der ich alle Koordinaten abspeichere auf der eine Zelle "lebt". Nachteil den ich darin sehe, ist dass diese Liste seeeehr oft durchlaufen werden muss für jeden Berechnungsschritt
Habt ihr da irgendwelche Vorschläge wie ich sowas realisieren kann?
Gruß,
Eike
Programmcode:
ich habe ein kleines Problem und hoffe ihr könnt mir da ein wenig helfen.
Folgende Situation:
Ich habe ein 2D-Feld bei dem jedes Feld 2 Zustände (tod oder lebendig) annehmen kann. Ich habe es daher zuerst mit einem 2d-boolean Array versucht. Damit bekomme ich auch eigentlich alle Berechnungen hin wenn es um einen kleinen Maßstab geht.
Der Programmablauf sieht in etwa so aus: Für jede Zelle des Arrays wird überprüft wieviele Nachbarn dieser Zelle leben. Je nachdem wieviele das sind ändert sich dann der Zustand dieser Zelle oder er bleibt gleich.
(Dazu sei gesagt, dass am Anfang vllt 50% der Zellen lebendig sind, das nimmt im Laufe der Zeit aber stetig ab).
Wie gesagt, im kleinen Maßstab ist das überhaupt kein Problem. Nehme ich dann aber z.b. eine Feldgröße von 1.000.000 * 1.000.000 komme ich damit nichtmehr klar Ich habe schon Implementierungen gesehen in denen solche Zahlen verwendet wurden, es muss also irgendwie möglich sein.
Jetzt suche ich ne Datenstruktur um das ganze auf die oben genannte Größe zu bringen. Da habe ich mir folgendes überlegt:
1. 2d-boolean Array: bei 1m*1m komme ich schon auf mehrere GB an Datenvolumen.
2. ne Art Liste in der ich alle Koordinaten abspeichere auf der eine Zelle "lebt". Nachteil den ich darin sehe, ist dass diese Liste seeeehr oft durchlaufen werden muss für jeden Berechnungsschritt
Habt ihr da irgendwelche Vorschläge wie ich sowas realisieren kann?
Gruß,
Eike
Programmcode:
Java:
public void calculateNextGeneration() {
boolean[][] nextGen = new boolean[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (currentGeneration[i][j]) {
// Lebende Zelle
if (getLivingNeighboursCount(i, j) < 2) {
nextGen[i][j] = false;
} else if (getLivingNeighboursCount(i, j) == 2 || getLivingNeighboursCount(i, j) == 3) {
nextGen[i][j] = true;
} else if (getLivingNeighboursCount(i, j) > 3) {
nextGen[i][j] = false;
}
} else {
// Tote Zelle
if (getLivingNeighboursCount(i, j) == 3) {
nextGen[i][j] = true;
} else {
nextGen[i][j] = false;
}
}
}
}
// Neue Generation übernehmen
currentGeneration = nextGen;
generationCounter++;
}