Also habe ich gerade bei Cormen rot-schwarze Bäume gelernt und wow! Normalerweise verstehe ich gerne alle Algorithmen und Datenstrukturen bis zu dem Punkt, an dem ich sie von Grund auf neu erstellen kann, ohne den Pseudocode zu betrügen. Ich mag Algorithmen sehr, deshalb lerne ich gerne, wie sie funktionieren. Normalerweise gehe ich Zeile für Zeile und probiere einige Fälle aus, indem ich mir den Code ansehe und überprüfe, ob das, was passiert, das ist, was ich verstanden habe.
Nur zu verstehen, was passiert, hat mir viel Zeit für RB-Bäume gekostet. Trotz der Erklärungen des Buches fiel es mir immer noch schwer, den Code zu verstehen. Ganz zu schweigen davon, dass ich nicht verstehen konnte, wie / warum Rotationen funktionieren. Ich finde es überhaupt nicht intuitiv. Ich meine, die drei (eigentlich sechs) verschiedenen Fälle zum Einfügen und dann die 4 Fälle zum Löschen? Ist es möglich, diese Sache zu verstehen? Es ist unmöglich für mich, diesen Code ohne Schummeln neu zu erstellen. Bis zum Binärbaum konnte ich das Zeug aus meinem Kopf heraus implementieren, mit einigem Optimierungsaufwand würde es immer funktionieren, aber RB-Bäume werde ich nicht einmal versuchen. Ich meine, sogar der Lehrer war manchmal verwirrt, also denke ich, dass es wirklich nicht so einfach ist, aber sollten wir nicht gleichzeitig alles verstehen müssen, was passiert, oder zumindest warum? Das Buch hat nicht t wirklich erklären, wie jemand auf die Idee von Rotationen kam. Wie ist jemand aufgefallen, dass Sie mit 2 Umdrehungen ein Einfügeproblem lösen können? Das ist erstaunlich!
Meine Frage ist, muss ich RB-Bäume wirklich zu 100% verstehen? Ich fühle mich irgendwie schlecht, wenn ich Sachen überspringe, ohne es vollständig zu verstehen. Vielen Dank im Voraus Jungs! (PS: Es gibt kein Tag für RB-Tree, eigentlich nicht einmal für Tree, nur für Binary-Tree, also setze ich nur Algorithmen)
quelle
Antworten:
Sie scheinen die Idee des "Verstehens" mit "den Code schreiben zu können, ohne das Buch anzusehen" gleichzusetzen. Das sind zwei verschiedene Dinge. Wenn Sie sehen, wie durch Drehen der Baumknoten der Baum neu angeordnet wird, um das Gleichgewicht aufrechtzuerhalten, verstehen Sie dies. Es ist nicht der Punkt, alle Fälle, für die Rotationen gelten, sofort abrufen zu können.
Ich selbst könnte wahrscheinlich die Drehungen herausfinden, wenn ich Stift / Papier / mehrere Stunden hätte, um damit zu spielen. Aber ich konnte es bestimmt nicht ohne nachzudenken aufschreiben. Wenn ich tatsächlich einen solchen Algorithmus schreiben müsste, würde ich ihn nachschlagen, um sicherzustellen, dass alle Details stimmen. Natürlich würde ich in fast jeder Situation bereits geschriebenen Code verwenden.
All dies kommt zum Einsatz, wenn Sie auf eine Situation stoßen, die keinem der Algorithmen entspricht. Sie müssen niemals Ihre eigene Baumimplementierung schreiben. Aber Sie könnten beispielsweise feststellen, dass Sie eine Reihe von doppelt verknüpften Listen abflachen müssen. In diesem Fall kann es sehr hilfreich sein, die Grundidee der Rotation zu verstehen.
quelle
Wenn Sie mit funktionaler Programmierung vertraut sind, finden Sie diese Herangehensweise möglicherweise besser (Okasaki 1999):
http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf
Wenn nicht, nimm wenigstens den Anfangssatz zur Kenntnis:
quelle
Sie müssen die Rotationen nicht im Detail verstehen. Sie sollten die Beziehung zwischen RB-Bäumen und 2-3-4 Bäumen verstehen (siehe Sedgewick). All diese verrückten Rotationen sind viel sinnvoller, wenn man sie als 2-3-4 Bäume ansieht. Wenn Ihr Professor RB-Bäume nicht als Implementierungsdetail für 2-3-4 Bäume gelehrt hat, sollten Sie wahrscheinlich etwas über 2-3-4 Bäume lesen. (Sedgewicks Behandlung ist ziemlich gut; Wikipedia hat sie nicht.)
Allgemeiner ist es nur manchmal nützlich, die Implementierungsdetails zu verstehen, warum ein Algorithmus funktioniert. Es ist fast immer nützlich, die Logik der Funktionsweise des Algorithmus zu verstehen. Es ist normalerweise nicht erforderlich, den Algorithmus selbst zu entwickeln. Je mehr Algorithmen Sie jedoch verstehen, desto größer ist Ihre Chance.
quelle
Wenn Sie nächste Woche "RB Trees By Heart" für Ihre Prüfung benötigen, müssen Sie die Kugel beißen und sie lernen. In diesem Fall sollten Sie Ihre Lernmethoden überdenken. Vielleicht hilft Ihnen der Versuch, RB Trees einem Klassenkameraden zu erklären, mehr als eine weitere Nacht einsamen Code-Schreibens.
Wenn RB Trees eine Basis für Ihren nächsten Kurs nach den Ferien sind, überspringen Sie sie jetzt (ohne schlechte Gefühle) und konzentrieren Sie sich auf den Kurs dieses Semesters. Aber halten Sie nach Themen Ausschau, die Sie auf einen zweiten Versuch bei RB Trees vorbereiten könnten.
Wenn Sie ehrlich gesagt das Gefühl haben, dass Sie sie nie wirklich brauchen werden (vgl. Anna Lears Kommentar), küssen Sie sie ohne Reue auf Wiedersehen - niemand weiß mehr, dass ein Tropfen des Wissensmeeres (nur schade, dass Lehrer oft denken, dass ihr Tropfen der größte ist) wichtig).
quelle
Der Schlüssel zum Programmiererfolg ist, niemals aufzugeben :
Heute sind seine RB Bäume morgen wird es etwas anderes sein. Die größere Lektion gibt nicht auf .
Für mich ist das einer der Kernpunkte des Programmierens, nicht aufzugeben ...
Ich würde vorschlagen, dass Sie weiter versuchen , und wenn Sie scheitern, tun Sie es wieder .
Denn sobald Sie die Berge überwunden haben, wird der Himmel klar. Dein Verstand verändert sich im Verständnis, du bist zeitlich erhöht (bis zum nächsten Berg) . Diese zeitliche Erhebung ist mehr wert als alles Geld der Welt.
quelle
Der beste Weg, es zu verstehen, ist, es auszuprobieren :
So haben wir es am College gemacht. Und für die Prüfung mussten wir erklären, wie ein Teil davon funktionierte.
quelle