Das Problem besteht darin, eine Linie zu finden, die durchgeht p und hat alle anderen Punkte in S.Auf der einen Seite. Dies ist ein zweidimensionales lineares Programmierproblem, das gelöst werden kannO ( n )Zeit mit Lehrbuch geometrischen Algorithmen . Aber lassen Sie mich eine in sich geschlossene Lösung beschreiben.
Um die Notation zu vereinfachen, übersetzen Sie alle Punkte so p ist der Ursprung ( 0 , 0 ), und lass Q = S.∖ { p }. Dann wollen wir feststellen, ob es eine reelle Zahl gibtm so dass entweder (1) y< m x für alle ( x , y)∈Q oder (2) y>mx für alle (x,y)∈Q. Im ersten Fall,p ist ein Scheitelpunkt des oberen Rumpfes von S;; im zweiten Fallp ist ein Scheitelpunkt des unteren Rumpfes von S. Ich werde einen Algorithmus für den ersten Fall beschreiben; Der andere Fall ist symmetrisch.
Wenn irgendein Punkt in Q liegt direkt darüber p (das heißt, wenn irgendein Punkt in Q hat Koordinaten (0,y) für einige y>0), dann pkann nicht auf dem oberen Rumpf liegen. Es ist einfach, diesen Zustand einzucheckenO(n) Zeit.
Nehmen Sie also keine Punkte an Q liegen direkt darüber p. Dasy-Achsen spaltet sich Q in zwei Teilmengen L (links) und R(Recht). Punkte inL negativ haben x-Koordinaten und Punkte in R hat positiv x-Koordinaten. (Punkte direkt darunterpegal; ignoriere sie einfach.) Lass
mL=min(x,y)∈Lyx,MR=max(x,y)∈Ryx,andm=mL+MR2.
Nun sind drei Fälle zu berücksichtigen:
Wenn mL<MR, dann jeder Punkt in Q liegt streng unter der Linie y=mx, damit p ist ein Scheitelpunkt des oberen Rumpfes.
Wenn mL=MR, dann die Linie y=mx geht durch einen Punkt in L und ein Punkt in Rund kein Punkt in Qist streng über dieser Linie. Damitp liegt an einer Kante des oberen Rumpfes, ist aber kein Scheitelpunkt.
Wenn mL>MR, dann mindestens einen Punkt in L und mindestens einen Punkt in R liegen streng über der Linie y=mx. Damitp liegt streng unter dem oberen Rumpf.
Es ist leicht zu berechnen mL und MR im O(n)Zeit. Wir müssen eigentlich nicht rechnenm.