Frage

Ich möchte eine nehmen map<char, vector<char> > und jede mögliche Erzeugung erzeugen map<char, char> davon.

Ich verstehe, dass dies eine beträchtliche Menge an Speicher verwenden und etwas Zeit in Anspruch nehmen kann.

Jeder map<char, char> muss jeden Buchstaben AZ enthalten und einem einzigartigen AZ -Charakter zugeordnet werden. dh. AK bj cp dy ev fh ga hb ir jq kN li mx nc oo pz qs rl sd te uw vf wg xm yu zt

Hier ist, was ich bisher für mich selbst geschlossen habe:

Um die lächerliche Anzahl möglicher Kombinationen auf einen niedrigeren Betrag zu senken, falls a vector<char> Enthält mehr als 5 Elemente, ich werde es einfach durch a ersetzen vector<char> mit einem einzigen Char von meinem "Master"/"Original" enthält map<char, char>.

Nicht alle Charaktere werden über alle vorhanden sein vector<char>s in der Karte. Diese Charaktere müssen gefunden und in einen "anderen" Vektor eingesetzt werden.

Dies sollte auch Zeichen enthalten, bei denen ein Charakter der einzig mögliche Charakter für mehr als einen Charakterschlüssel ist (dh MW In dem Beispiel, von dem ich arbeite - ich bin mir nicht sicher, wie ich das vorgehen soll).

Dieser "andere" Vektor sollte für die Fälle verwendet werden, in denen es nicht möglich ist, einen einzigartigen AZ -Charakter zu haben, oder in dem mehr als ein Charakter den gleichen einzelnen möglichen Charakter hat.

Hier ist ein Beispiel für das, was ich bisher habe.

Ich werde eine nehmen map<char, vector<char> >, wie zum Beispiel:

A: GJKPQVXZ
B: GJKPQVXZ
C: gjkpqvxyz
D: MW
E: GJKPQVXZ
F: nr
G: at
H: vgl
I: seine
J: GJKPQVXZ
K: r
L: h
M: GJKPQVXZ
N: gjkpquvxyz
O: IS
P: GJKPQVXZ
F: IS
R: dl
S: l
t: e
u: dgkpuvy
V: vgl
W: BCF
X: Dguy
y: f
Z: AT

Dies ist meine Startkarte. Nach dem Ausschneiden der großen Charaktervektoren von über 5 und ersetzt sie durch die beste Vermutung. Wo das ist a vector<char> Von der Größe 1 hat diese Charakterzuordnung nur eine Kombination, und dieses Charakter kann in keiner anderen Zuordnung verwendet werden, da es sie nicht einzigartig machen würde. Ich habe es zugeschnitten, um:

A: k
B: j
C: p
D: MW
E: v
F: n
G: at
H: c
I: ist
J: Q
K: r
L: h
M: x
N: Guy
O: IS
P: Z
F: IS
R: d
S: l
t: e
U: Dguy
V: c
W: BC
X: Dguy
y: f
Z: AT

Der 'andere' Vektor enthält 'o' (ich denke, es ist wichtig zu beachten Brief, der nur einmal verwendet werden soll, kann nur einer von ihnen verwendet werden, sodass der andere irgendwo verloren geht. Ich bin mir nicht sicher, wie ich einen allgemeinen Fall programmieren soll, um diese dem anderen Vektor hinzuzufügen.)

Ich suche Hilfe und Zeiger, um jeden möglichen zu erzeugen map<char, char> aus map<char, vector<char> >s so und in diesem Format. Sie werden in einem Funktionsaufruf als Argument verwendet. Ich bin mir nicht sicher, wo ich anfangen soll, etwas zu schreiben, das im Allgemeinen funktionieren würde. Ich würde es wahrscheinlich mit einer großen Menge an Schleifen nähern, die jedes Element gegen jedes andere Element gegen jedes andere Element durchsehen ... usw., was ich für extrem ineffizient wäre und es wahrscheinlich viel elegantere Möglichkeiten gibt, ein solches Problem zu lösen .

Tut mir leid, wenn dies eine zu Textwand ist oder übermäßig spezifisch oder schlecht geschrieben/gefragt wird.

Ich schätze jede Hilfe.

War es hilfreich?

Lösung

Ich denke, ich hoffe, ich brauche sie nicht alle, um gleichzeitig zu existieren. Dann konnte ich:

1) Erstellen Sie die erste Karte, indem Sie jedem Buchstaben das erste mögliche Element zuweisen:

for (char c = 'a'; c <= 'z'; ++c) {  // yes, I assume ASCII
   new_map[c] = old_map[c][0];
}
int indexes[26] = {0};

2) Erstellen Sie die verbleibenden Karten wiederum, indem Sie die vorhandene Karte wiederholt ändern:

++indexes[0];
if (indexes[0] < old_map['a'].size()) {
    new_map['a'] = old_map['a'][indexes[0]];
} else {
    indexes[0] = 0;
    new_map['a'] = old_map['a'][0];
    // "carry the 1" by applying the same increment process to indexes[1]
}
do_something_with(new_map);

do_something_with Kann den "anderen" -Vektor jedes Mal von der Karte neu konstruieren, oder Sie können ihn jedes Mal aktualisieren, wenn Sie einen Charakter ändern. Ersetzen:

    new_map['a'] = something;

mit:

    char removed = new_map['a'];
    --counts[removed];
    if (counts[removed] == 0) others.add(removed);
    ++counts[something];
    if (counts[something] == 1) others.remove(something);
    new_map['a'] = something;

In Ihrem abgeschnittenen Beispiel gibt es nur etwa 6000 Möglichkeiten, die vorbeifliegen sollten. Wenn Sie sie alle gleichzeitig benötigen, könnten Sie die vorherige Karte bei jedem Schritt kopieren, und es würde erst in der nächsten Eiszeit genau dauern.

Übrigens haben Sie in Betracht gezogen, dass eine Karte für nur 26 mögliche Schlüssel etwas übertrieben ist, von denen jede in jeder Karte vorhanden sein muss? Ein Vektor oder ein Array wäre erheblich billiger zu verwenden und zu kopieren.

Andere Tipps

Ich verstehe, dass dies eine beträchtliche Menge an Speicher verwenden und etwas Zeit in Anspruch nehmen kann.

Ja, die Zahl der Kombinationen beträgt etwa 403.291.461.000.000.000.000.000.000.000.000.000.000.000 :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top