Ich muss eine Datei lesen, in der eine Matrix mit Autos gespeichert ist (1 = BlueCar, 2 = RedCar, 0 = Leer).Effiziente (Zeit- und Raumkomplexität) Datenstruktur für dichte und spärliche Matrix
ich benötigen schreiben einen Algorithmus, um die Autos der Matrix auf diese Weise zu bewegen:
- blaue bewegen nach unten;
- rote bewegen nach rechts;
- gibt es eine Umdrehung, in der alle blauen sich bewegen und eine Umdrehung, um alle roten zu bewegen.
Bevor die Datei, die ich weiß nicht, die Größe Matrix gelesen wird, und wenn es dicht oder spärlich, so habe ich zwei Datenstrukturen (eine für dichte und eine für spärliche) und zwei Algorithmen implementieren.
Ich muss die beste Zeit und Raum Komplexität möglich erreichen.
Aufgrund der unbekannten Matrixgröße denke ich, die Daten auf dem Heap zu speichern.
Wenn die Matrix dicht, glaube ich, etwas zu verwenden wie:
short int** M = new short int*[m];
short int* M_data = new short int[m*n];
for(int i=0; i< m; ++i)
{
M[i] = M_data + i * n;
}
diese Struktur mit mir einen zusammenhängenden Raum von Speicher zuordnen kann, und es ist auch einfach mit M[i][j]
zugegriffen werden.
Jetzt ist das Problem die Struktur für den spärlich Fall zu wählen, und ich habe auch überlegen, wie ich die Autos durch den Algorithmus auf einfachste Weise bewegen kann: zum Beispiel, wenn ich ein Auto zu bewerten, muß ich leicht finden, wenn in der nächsten Position (nach unten oder nach rechts) ein anderes Auto ist oder wenn es leer ist.
Zuerst dachte ich, um BlueCar und RedCar Objekte zu definieren, die vom allgemeinen Auto-Objekt erben. In diesen Objekten kann ich die Matrix Koordinaten speichern und sie dann in setzen:
std::vector<BluCar> sparseBlu;
std::vector<RedCar> sparseRed;
Ansonsten ich so etwas tun können:
vector< tuple< row, column, value >> sparseMatrix
Aber das Problem zu finden, was in der nächste Position ist immer noch bleibt.
Wahrscheinlich ist dies nicht der beste Weg, dies zu tun. Wie kann ich den Sparse Case also effizient implementieren? (auch mit einer einzigartigen Struktur für spärliche)
Ich will nur nach vorne std :: map setzen, Wert>. –
user2672165
Diese Frage ist eigentlich ein stark recherchierter Bereich, um Zugriffsgeschwindigkeit (und geringe Cache-Misses) zu halten, aber Speicher zu halten. Siehe die verschiedenen [Sparse Storage Schemas hier] (https://en.wikipedia.org/wiki/Sparse_matrix#Storing_a_sparse_matrix). Es hängt wirklich von deiner Matrix ab. Ist es symmetrisch?Was ist die Bandbreite? Kannst du es neu ordnen? usw. Einer der beliebtesten, weil einfach zu programmieren, aber sehr performant ist das [Yale Speicherschema] (https://en.wikipedia.org/wiki/Sparse_matrix#Yale) aka das "wirklich sparse Speicherschema" – CoryKramer
@ CoryKramer Die Elemente scheinen eine Position eines Autos darzustellen. Autos können sich bewegen. Symmetrie scheint nicht wahrscheinlich .... – user2672165