Ich versuche, eine effiziente Schleife über eine Kartendatenstruktur zu finden.effiziente Schleife einer Karte in einer Karte C++
Die Map-Struktur bildet die folgenden Zahlen:
1 2, 2 3, 3 1, 4 1, 4 5, 5 3, 5 6, 5 7, 5 8, 6 4, 7 6, 8 9, 9 10
Die resultierende Karte sieht wie folgt aus:
1| 2
2| 3
3| 1
4| 1 5
5| 3 6 7 8
6| 4
7| 6
8| 9
9| 10
Start : 4
Result :
1(1) 2(2) 5(1) 3(2) 6(2) 7(2) 8(2)
Kann jemand vorschlagen, wie effizient Schleife (möglicherweise rekursive Methode), so dass ein gegebener Beginn von sagen 4, wäre das Ergebnis
1(1), 2(2), 5(1), 3(2), 6(2), 7(2), 8(2), 9(3), 10(4)
So ist die Idee zu verwenden jeder innere Schlüssel, als äußerer Schlüssel, beginnend mit einem gegebenen äußeren Schlüssel. Mit äußeren 4 zum Beispiel sind die inneren Schlüssel 5 und 1. So verwenden Sie 5 und 1 als äußere Schlüssel, um innere Schlüssel zu erhalten (3 6 7 8) und (2), der Prozess sollte fortfahren, die inneren Schlüssel zu äußeren Schlüsseln zuzuordnen. Eine laufende Summe sollte pro "Sprung" gehalten werden. Es löst also wahrscheinlich eher ein rekursives Problem als eine Schleife.
Der Prozess sollte beendet werden, wenn entweder der Anfangspunkt erreicht wird, 4 im obigen Szenario, oder keine inneren Schlüssel mehr vorhanden sind, z. B. hat 10 keine Zuordnung.
Die Schleife ab Zeile 44, führt nur die oben genannten, bis zu zwei Ebenen, die nicht ausreichend ist.
#include <iostream>
#include <map>
#include <sstream>
int digit_count(int number) {
int digits = 0;
if (number < 0) digits = 1; // remove this line if '-' counts as a digit
while (number) {
number /= 10;
digits++;
}
return digits;
}
int main() {
int v1, v2;
std::map< int, std::map< int, int> > m;
std::istringstream stm {"1 2 2 3 3 1 4 1 4 5 5 3 5 6 5 7 5 8 6 4 7 6 8 9 9 10"};
while (stm >> v1 >> v2) {
m[v1];
m[v1][v2] = 1;
}
std::cout << "Map layout " << "\n";
std::string ss = "";
int dc = digit_count(m.rbegin()->first); // equals max number
for (const auto & p : m) {
std::cout << p.first << ss.append(" ", (dc - digit_count(p.first))) << "| ";
for (const auto & val : p.second)
std::cout << val.first << " ";
ss = "";
std::cout << "\n";
}
int start {4};
std::cout << "\nStart : " << start << "\n";
std::cout << "Result : " << "\n";
// efficient loop
for (const auto & e : m[start]) {
std::cout << e.first << "(" << e.second << ") ";
for (const auto & x : m[e.first])
std::cout << x.first << "(" << (e.second + x.second) << ") ";
}
std::cout << "\n";
return 0;
}
Jede Hilfe würde sehr geschätzt werden.
Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –
Vielleicht bekomme ich Ihre Frage alles falsch, aber ich kann nicht sehen, wie 'std :: map>' kann die beschriebenen Daten halten. Für mich 'std :: map > scheint eine bessere Wahl. –
4386427
Ihre Eingabedaten sind [eine Adjazenzmatrix] (https://en.wikipedia.org/wiki/Adjacency_matrix) Darstellung eines Graphen, und Ihr Problem läuft darauf hinaus, einen [kürzesten Pfadbaum] zu finden (https: // en .wikipedia.org/wiki/Short-path_tree) für dieses Diagramm, z mit [Dijkstras Algorithmus] (https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm). –