Generische Klassenbibliothek - Bugs, Beschreibung, Fragen, Nutzungsmöglichkeiten und Vorschläge - Seite 6

 
Vasiliy Sokolov:

Es kommt vor, dass verschiedene Wörter mit demselben Buchstaben des Alphabets beginnen. Wenn wir "apple" in unser vorheriges Wörterbuch eingeben und dann versuchen, "application" hineinzuschreiben, wird es nicht funktionieren. Der Index 0 wird mit dem Wort Apfel belegt. In diesem Fall spricht man von einer Hash-Funktionskollision. Unsere Hash-Funktion ist sehr einfach - sie gibt die Nummer des ersten Zeichens des Wortes zurück, so dass es bei dieser Funktion sehr häufig zu Kollisionen kommen wird. Um verschiedene Wörter, die mit demselben Buchstaben beginnen, zu speichern, werden wir eine Addition vornehmen: Wir werden die Elemente nicht in einem Array, sondern in einem Array von Arrays speichern. In diesem Fall enthält der Index 0 ein weiteres Array mit zwei Wörtern: "apple" und "application":

Jetzt speichert unser Wörterbuch auch Wörter, die mit demselben Buchstaben beginnen. Aber die Kosten für den Zugriff auf Wörter mit demselben Anfangsbuchstaben steigen. Denn jetzt brauchen wir eine vollständige Suche in allen Wörtern, die mit "a" beginnen, um herauszufinden, ob das Wort "Anwendung" im Wörterbuch steht oder nicht. Wenn unsere Hash-Funktion selbst dann unterschiedliche Zahlen erzeugen würde, wenn sich die Wörter um ein Zeichen unterscheiden, dann würde die Wahrscheinlichkeit, Wörter mit denselben Indizes auszuprobieren, gegen Null tendieren, und der Zugriff auf ein beliebiges Element würde gegen o(1). Das ist genau das, was in echten Wörterbüchern passiert, und die Funktionen, die dort verwendet werden, sind kollisionssicher, so dass wir definitiv sagen können, dass der Zugriff auf Elemente in diesen Sammlungen sehr schnell ist und fast keine Suche erfordert.

Ich werde versuchen, meine Lösung für dieses Beispiel zu geben. Ohne Zeiger. Ein wenig später.
 

Ich habe kürzlich ein Buch zu diesem Thema gelesen. Es heißt"Rattling Algorithms". Alles ist sehr übersichtlich und mit Beispielen versehen.

 
Vasiliy Sokolov:

Im nächsten Beispiel werden wir es so verbessern, dass es Wörter speichern kann, die mit demselben Buchstaben beginnen.

Bitte schreiben Sie ihn kurz und bündig, ohne Überschriften oder unnötige Einheiten.

Zum Beispiel, dies

bool Contains(string word)
{
   uchar index = (uchar)StringGetCharacter(word, 0)-97;
   return words[index] != NULL;
}

könnte viel klarer formuliert werden.

bool Contains(string word)
{
   return words[word[0]-'a'] != NULL;
}


Und dennoch kann dieser Code für MT4/5 anders funktionieren, weil in MT4 das Array mit NULL-Werten initialisiert wird, und in MT5 kann es Müll sein.

 
fxsaber:

Bitte schreiben Sie kurz und bündig, ohne das Durcheinander von Hüten und überflüssigen Einheiten.

...


Kategorisch GEGEN! Der Code sollte vorzugsweise vollständig geschrieben werden. Schauen Sie sich alle MQ-Codes an - überall gibt es "Caps". Das ist der Standard.


fxsaber:

...

Und doch kann dieser Code für MT4/5 anders funktionieren, weil in MT4 das Array mit NULL-Werten initialisiert wird, und in MT5 kann es Unsinn sein.


Was hat das mit dem alten Terminal zu tun? Wenn Sie zu faul sind und noch die alte Version verwenden, ist das Ihr eigenes Problem. Die Gemeinschaft sollte nicht wegen solcher Faulpelze gebremst werden.

 
Wladimir Karputow:

Schauen Sie sich alle MQ-Codes an - überall gibt es "Caps". Das ist der Standard.

Scheiß auf die Norm, das Wesentliche ist hier wichtig, nicht der Stil, der 50 % des Codes einnimmt.

 
fxsaber:

Scheiß auf die Norm, es geht um das Wesentliche, nicht um den Stil, der 50 % des Codes einnimmt.


Die Hauptaufgabe des Forums ist die BILDUNG. Der Kodex sollte also erweitert und klar sein und sich so weit wie möglich der Norm annähern.

 
Vasiliy Sokolov:

Dies ist genau das, was in echten Wörterbüchern passiert; die dort verwendeten Funktionen sind kollisionsresistent, so dass wir mit Sicherheit sagen können, dass der Zugriff auf Elemente in diesen Sammlungen sehr schnell und fast ohne Überschwingen erfolgt.

D.h. für jede Aufgabe muss ein Mittelweg zwischen der Größe des Wörterbuchs (RAM) und der Rechenkomplexität der Hash-Funktion (CPU) gefunden werden.

 
Wladimir Karputow:

Der Hauptzweck des Forums besteht darin, zu informieren. Daher sollte der Code erweitert und verstanden werden

das ist genug.

so nah wie möglich an der Norm.

Sie können Ihre eigenen Kopfzeilen einfügen. A100 hat Hunderte von Berichten im SD ohne Kappen herausgegeben - das ist der Standard! Denn auf das Wesentliche kommt es an, nicht auf Lametta.

 
Es gibt eine Lösung. Um jedoch vorübergehend das Interesse zu erhalten, möchte ich die ausführbare Datei hier veröffentlichen. Außerdem werden fähige Leute die Leistung meiner Lösung mit der des oben genannten Autors vergleichen. Ich frage mich, was schneller geht.
Dateien:
Dictionary.ex5  10 kb
 
ReTeg Konow:
Es gibt eine Lösung. Aber um die Spannung vorübergehend aufrechtzuerhalten, möchte ich den Auszug hier veröffentlichen. Außerdem werden fähige Leute die Leistung meiner Lösung mit der des oben genannten Autors vergleichen. Ich frage mich, was schneller geht.
Sie müssen die ausführbare Datei ausführen. Es erscheint ein Eingabefeld. Als Nächstes können Sie verschiedene Wörter eintippen. Wenn es eine Übereinstimmung gibt, werden Sie vom Drucker benachrichtigt, dass das Wort im Wörterbuch enthalten ist. Wenn es kein Wort gibt, werden Sie benachrichtigt, dass das Wort in das Wörterbuch aufgenommen worden ist.
Grund der Beschwerde: