Sie letzte Logik ist eigentlich noch richtig. Der Wert (-5,6) sollte bereits aufgenommen worden sein, wenn Sie auf den von Ihnen markierten Knoten treffen (6, -3). Nun, ich bin kein Mathe-Major. Aber die allgemeine Idee ist dies. In der Struktur der Prioritätssuche, die Sie implementiert haben, suchen Sie tatsächlich nach zwei separaten Kriterien. Für x ist es eine einfache binäre Suche nach dem Bereich. Für y, Sie suchen tatsächlich nach ihr als Priorität Baum (gut für die Suche von y: inf oder -inf: y, je nachdem, ob Sie Max oder Min verwenden.)
Beachten Sie, dass am unteren Rand Seite 15 besagt, dass der Baum für einen semi-unendlichen Bereich (einer ist unendlich) gut ist. Lesen Sie weiter, Sie werden sehen, wie der Baum für den semi-unendlichen Bereich für y optimiert ist.
Kurz gesagt, da Ihr Baum mit x als binäre Suche und y als Priorität (mit max Restwert) konstruiert wird, ist die optimale Suche [x1: x2], [y1: inf].
Jeder Knoten im Baum speichert im Wesentlichen 2 Dinge. 1. Der Mittelpunkt von x (oder das Max-x im linken Baum und die Entscheidung, nach links oder rechts zu gehen, basiert auf der Prüfung> x). 2. Der POINT mit dem höchsten y-Wert im Teilbaum, der nicht zum vorherigen hinzugefügt wurde.
Der Suchalgorithmus läuft im Wesentlichen so. Ausgehend von der Wurzel mit einem Kriterium von [x1: x2], [y1: inf] 1. Überprüfen Sie den y-Wert des POINT, der dem Knoten zugewiesen ist. Wenn y> y1, gehe zu 2, ansonsten STOPP (da der dem Knoten zugewiesene POINT den höchsten y-Wert hat, wenn der Check fehlgeschlagen ist, gibt es keinen anderen Knoten darunter, der [y1: inf] erfüllen kann. 2. Überprüfen Sie, ob der x-Wert des Punktes im Bereich von [x1: x2] liegt. Wenn dies der Fall ist, fügen Sie diesen Punkt in den Ausgang ein. Fahren Sie mit Schritt 3 fort, unabhängig davon, ob Sie diesen Punkt eingefügt haben "Wert (lasst uns das mx nennen.) Wenn mx im Bereich von [x1: x2] ist, gehe beide Pfade durch. Wenn mx < [x1: x2] ist, traverse nach links. Ansonsten traverse nach rechts. Gehe zurück zu Schritt 1 für jeden
EDIT für sehr, SEHR langen Text: Lassen Sie uns durch Ihr Beispiel laufen .. Ich habe eine zusätzliche Anmerkung markiert jeden Punkt mit Buchstaben (der "Name" des Punktes. Jeder Knoten haben jetzt das Format des Namens des Punktes, mit seinem y-Wert in der Elternschaft, und dem "mid-range" x darunter. Für die Blattknoten bedeuten solche mit einem '*', dass sie bereits irgendwo im Baum stehen und als NIL behandelt werden, wenn Sie sie jemals erreichen.
7(E)
------ 0 ---------------------
| |
A(6) G(6)
----- -3 ----- ---- 4 --------
| | | |
C(4) D(2) F(1) I(3)
---- -4 - -2 --- 3 --- 5
| | /\ | | /\
B(0) C*(-3,4)D*(-2,2)E*(0,7) NIL H(4,-4) I*(5,3)J(6,-1)
-5 2
/\ /\
A*(-5,6)B*(-4,0) F*(2,1) G*(3,6)
Nehmen wir ein Beispiel Abfrage des Laufes [-2: 4] [1: inf] (oder eine beliebige y> = 1)
- von der Wurzel ausgehend sehen wir Punkt E.
- Ist das y von Punkt E (7)> = 1? Ja.
- Ist das x von Punkt E (0) in [-2: 4]? Ja
- Fügen Sie E zur Ausgabe hinzu.
- Ist der Mittelpunkt (auch 0) in Reichweite? Ja
- Vom Knoten mit E müssen beide Seiten durchlaufen werden.
- Zuerst gehen wir nach links, wir sehen Punkt A.
- Ist das y von Punkt A (6)> = 1? Ja.
- Ist das x von Punkt A (-5) in [-2: 4]?
- Überspringen Sie A, aber fahren Sie weiter (nur die y-Prüfung stoppt die Traversierung).
- Liegt der Mittelpunkt bei A im Bereich von [-2: 4]? Nein, es ist auf der linken Seite.
- Seit -3 < [-2: 4] müssen wir nur noch nach rechts gehen. Jetzt sehen wir Punkt D.
- Ist das y von Punkt D (2)> = 1? Nein! Überspringe den Punkt und höre auf, abwärts zu fahren, da es keinen anderen Punkt unter D gibt, den wir NICHT ausgegeben haben (beachte, dass E bereits ausgegeben wird, wenn wir root am Anfang besucht haben).
- Ich fahre bis zu A, da wir den linken Pfad nicht überqueren müssen, weiter nach oben.
- Jetzt bin ich wieder bei root, die beide durchlaufen haben müssen. Da wir gerade nach links gegangen sind, gehen wir nach rechts. Dort sehen wir Punkt G
- Ist das y von Punkt G (6)> = 1? Ja
- Ist das x von Punkt G (3) in [-2: 4]? Ja
- Fügen Sie G zur Ausgabe hinzu, jetzt haben wir (E, G).
- Ist der Mittelpunkt bei G in Reichweite? Ja, wir müssen beide Seiten durchqueren.
- Lassen Sie uns zuerst links gehen. Wir sehen F.
- Ist das y von Punkt F (1)> = 1? Ja
- Ist das x von Punkt F (2) in [-2: 4]? Ja
- Fügen Sie F zur Ausgabe hinzu, jetzt haben wir (E, F, G)
- Ist der Mittelpunkt bei F in [-2: 4]? Ja, wir müssen beide Seiten durchqueren.
- Lassen Sie uns zuerst wieder links gehen, wir sehen ... NIL. Es müssen keine weiteren Punkte hinzugefügt werden (da wir bereits F, G überprüft/hinzugefügt haben).
- Lassen Sie uns zurück nach F gehen und auf der rechten Seite fahren, wir sehen H.
- Ist das y von Punkt H (-4)> = 1? Nein. Fügen Sie den Punkt nicht hinzu und hören Sie auf zu verfahren.
- Wir gehen zurück nach F, wo bereits beide Wege abgefahren sind.
- Wir gehen zurück zu G, die immer noch ihren richtigen Weg braucht.
- Wir durchlaufen den rechten Pfad und siehe I.
- Ist das y von Punkt I (3)> = 1? Ja
- Ist das x von Punkt I (5) in [-2: 4]? Nr.
- Skip F.
- Liegt der Mittelpunkt bei I im Bereich von [-2,4]? Nein, es ist größer.
- Da es größer ist, müssen wir nur die linke Seite durchlaufen, also machen wir das.
- Traverse auf der linken Seite sehen wir ... Ich wieder. Da wir bereits I gesehen haben und es ein Blattknoten ist, hören wir auf zu verfahren und gehen wieder auf I.
- Ich bin fertig (muss nicht nach rechts verfahren). Geh zurück nach G.
- G ist fertig (beide Seiten durchquert). Geh zurück nach E.
- E ist fertig (beide Seiten durchquert). Da E der Wurzelknoten ist, sind wir jetzt fertig.
Das Ergebnis ist "E, F, G" sind in Reichweite.
Sie haben genug Ruf, um besser zu wissen ... http://stackoverflow.com/help/mcve Die Leute machen Vermutungen über das, was sie tun, die falsch sind, und dann veröffentlichen Sie nicht die Details, die tatsächlich relevant sind weil sie annehmen, dass sie diesen Teil richtig machen. – xaxxon
@xaxxon das hat mit dem Algorithmus zu tun, nicht darauf, wie ich Pseudocode in Code umwandeln kann! – gsamaras
warum ist das dann mit C++ markiert? – xaxxon