Ich wurde kürzlich in einem Interview gebeten, einen Algorithmus zu entwickeln, der eine Reihe von Punkten in einem Koordinatensystem so unterteilt, dass die Hälfte der Punkte auf einer Seite der Linie und der Rest auf der anderen Seite liegt.
Die Punkte sind ungleichmäßig platziert und die Linie darf durch keinen der Punkte verlaufen.
Kann jemand einen Ansatz zur Lösung des Problems geben? Die Analyse des Algorithmus wird geschätzt.
Tipps: Zählen Sie die Punkte, verwenden Sie Mediane.
Die Anzahl der Punkte wird als gerade angenommen.
Antworten:
Ein Ansatz besteht darin, eine "generische" Richtung (in der Praxis eine zufällige Richtung) zu wählen, alle Punkte entlang dieser Richtung zu projizieren und dann einen Medianalgorithmus zu verwenden (Ihre Linie sollte jeder Übersetzung entsprechen, die zwischen den beiden Medianen liegt). Wenn Sie eine schlechte Richtung wählen, können Punkte zusammenklumpen, sodass es unmöglich ist, sie entlang dieser Richtung zu trennen. Wenn Sie jedoch eine "generische" Richtung wählen, geschieht dies nicht (vorausgesetzt, die Punkte sind unterschiedlich). Da es lineare Zeitmedianalgorithmen gibt, ist dies einO ( n ) Algorithmus. Mit dem randomisierten Schnellauswahlalgorithmus erhalten Sie einen praktischen linearen Zeitalgorithmus.
quelle