Dies ist keine Hausaufgabe.Auf der Suche nach einem sauberen und effizienten Algorithmus zum Ein- und Ausschalten von Elementen eines "Baumes" (eigentlich einer DAG)
Visuell sieht es wie ein Baum aus, aber alle Blätter sind einzigartig (haben einzigartige IDs in der Datenbank). Die Hierarchie über ihnen ist etwas willkürlich. Jedes Kontrollkästchen hat drei Zustände: ein, aus und teilweise. Blätter können nur überprüft oder nicht überprüft werden. Der Zustand der Kinder sollte den Zustand der Eltern bestimmen. Klicken Sie auf ein Kontrollkästchen, um es "umzuschalten" und die notwendigen Änderungen nach oben oder unten zu propagieren. Wenn Sie auf ein übergeordnetes übergeordnetes Element klicken, sollte es vollständig überprüft werden. Jedes Kind hat einen Zeiger auf eine Liste (I könnte dies zu einem Satz ändern, wenn ich muss) der Eltern. Jeder Elternteil hat eine alphabetisch sortierte Liste von Kindern. Gleichzeitig ist diese Struktur zu Anzeigezwecken ein Baum, den ich erweitern und reduzieren kann, wie Sie auf dem Bild sehen können.
Ich bin sicher, dass dieser Algorithmus zuvor erfunden wurde. Da die Anzahl der Blätter bis zu 20.000 beträgt, ist mir die Leistung in der Praxis wichtig. Aber ich würde nicht versuchen, den letzten Tropfen Leistung aus dem Algo herauszuquetschen, auf Kosten von Code, der kurz und lesbar ist.
Ich dachte, dass ich im Prinzip gehen sollte (wenn es irgendwo zu gehen gibt) und alle Blätter identifizieren, die geändert werden sollten. Danach sollte ich hochgehen. Aus der Menge der Blätter sollte ich eine Gruppe von Eltern herausfinden, die betroffen sein könnten. Dann filtern Sie es auf die Menge der Eltern, die geändert werden müssen, und auf welchen Wert. Dann füge diese zu einem Set hinzu. Dann muss ich von diesen Knoten hochgehen und es wiederholen. Nachdem ich eine Reihe von Blättern und anderen Knoten habe, die sich ebenso wie ihre Werte ändern müssen, muss ich es einfach tun ... oder so ähnlich. Eine matrixbasierte Darstellung wäre zu teuer.
Ich hack dieses Ding zusammen in C++
mit MFC
, aber meine Frage ist ziemlich sprachunabhängig. Ich würde jedoch eine konkrete Implementierung einem Algorithmus vorziehen. Einige Sprachen wie Python, Perl, Scala haben vielleicht zu moderne Tricks in den Ärmel. Ich würde versuchen, etwas Konventionelleres beizubehalten, wie Java, C# (minus LINQ).
Code, Links, Referenzen und Fragen sind willkommen.
Hm ... ist die Tatsache, dass Alice, Bob und Cleopatra einzigartig sind kein Problem? Der Teil, der mich verwirrt, ist, dass ich sowohl einen Baum (zur Ausstellung) als auch einen Tag habe, wo die Blätter des Baumes eher Ids als völlig neue Objekte enthalten. –
@Hamish, da es sich um eine DAG handelt, spielt es keine Rolle, ob sie einzigartig sind oder nicht. Wenn sie nicht eindeutig sind, werden sie durch Einfügen in die Menge auf die eindeutigen Knoten gefiltert. – MSN