Frage

kurze version: In einem Baum (nicht binär) mit vielen Kindernniveaus, in denen jeder Knoten mehrere Blätter haben kann, was ist der beste Weg, um Tally zu hinterlässt, um einen bestimmten Zustand mit einem Knoten zu erfüllen?

lange, gewundene Version: Angenommen, Sie haben Ordner, die mehr Ordner enthalten können. In der Produktion hat mein System etwa 15 Lagen von Ordnern am tiefsten. Jeder Ordner kann Dokumente haben.

Wenn ein Benutzer in einen Ordner navigiert, müssen sie wissen, wie viele Dokumente in diesem Ordner sind, insgesamt. Sie müssen auch wissen, wie viele dieser Dokumente "markiert" wurden. Dokumente können markiert werden, wenn sie nach einem bestimmten Zeitraum nicht aktualisiert wurden. Dies wird basierend auf den History-Einträgen ermittelt - nehmen Sie den letzten History-Eintrag für den Ordner, wenn er größer als x ist, dann ist es gekennzeichnet.

Jetzt bin ich iterlich über alle Ordner> Unterordner> usw.> Kinder, um den Historie-Eintrag zu überprüfen und rekursiv anzuteilen. Das wird jetzt ziemlich langsam, also brauche ich einen neuen Ansatz.

Ich bin mit zwei Möglichkeiten gekommen, möchte aber wissen, ob es einen besseren Ansatz gibt, oder welches von ihnen am besten ist.

Option 1 : Wenn Sie ein Dokument hinzufügen oder ein Dokument zum Entfernen eines Dokuments, iterieren Sie das übergeordnete Diagramm und erhöhen / dekrementieren Sie ein "DocumentCount" -Perat, das in der Ordner-Entität gespeichert ist. Dies bedeutet, dass das Hinzufügen / Entfernen von einem minimalen Leistungstreffer angeht. Das Problem ist jedoch hier, dass ich tatsächlich die Gesamtzahl der Dokumente zählen muss, sowie die Gesamtzahl der gekennzeichneten Dokumente, die gekennzeichnet sind (durch Überprüfen der Verlaufseinträge), so dass ich ein anderes Feld brauche, und ein anderer Prozess, um zu rufen Statusänderungen Dies führt in noch komplexerer Weise ein, da etwas geprüft wird, ob etwas gekennzeichnet ist oder nicht, ist ein Methodenaufruf, keine Eigenschaft.

Option 2: Haben Sie einen Timer-Job durchlaufen und aktualisieren Sie die Eigenschaften "DocumentCount" und "UnoperedDocumentCumentcount" jedes Ordners in dem System, wären viele CPU-Zyklen und erscheint verschwenderisch.

Option 3 : Ich dachte nur daran - vielleicht um jedes Dokument zu sehen und zu sehen, ob das Dokument ein direktes oder fernstillendes Kind des Zielknotens ist, bevor das Dokument ein direktes oder fernes Kind des Zielknotens ist, bevor das Dokument ein besseres oder fernes Kind des Zielknotens ist, bevor das Dokument besser ist als itertieren über die Rekursion. Ich fühle mich so, als wäre dies besser für Knoten, der auf dem Baum hoch ist, aber iteratierend über jedes Kind für einen Node mit niedrigem Niveau wäre lächerlich. Hmmm ...

Ich bin versucht, die Option 1 zu implementieren 1 .. Welche anderen Optionen gibt es?

War es hilfreich?

Lösung

Wenn Sie die Bedingung (n) kennen, die Sie anwenden möchten, wenn Sie den Knoten an den Baum hinzufügen möchten, können Sie Ihre Routine hinzufügen, um sich durch den Baum wieder aufzulösen, anstatt nur zu steigern, und entspannen Sie dann die Rekursionen und Aktualisierungdie Talten in den übergeordneten Knoten.

In ähnlicher Weise, wie Sie Knoten aktualisieren, reagieren Sie sich darauf, und entspannen Sie dann die Rekursionen und aktualisieren Sie die Eltern.

Wenn Sie den Zustand (n) vorher nicht kennen, sind Sie geschraubt.Sie haben keine andere Wahl, als den Baum in jeder Ordnung zu durchqueren, ist sinnvoll.Von dem, was Sie gesagt haben, klingt es, als ob Sie in einem Knoten tun, was Sie in einem Knoten tun, eine Funktion des unabhängigen und rechten Teilbahnen, was einen Postorder-Traverse-Look wie die richtige Antwort aussieht.

Hinweis: Wenn das oben Genannte nicht sinnvoll ist, lesen Sie Knuth Vol.1 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
scroll top