Wenn Ihre Daten nicht sortiert sind, haben Sie keine andere Wahl als jeden Punkt zu überprüfen, da Sie nicht wissen können, ob es einen anderen Punkt gibt, für den y größer ist als der aller anderen Punkte und für welchen x > x_min
. Kurz gesagt: Sie können nicht wissen, ob ein anderer Punkt enthalten sein sollte, wenn Sie sie nicht alle überprüfen.
In diesem Fall würde ich annehmen, dass es unmöglich wäre, sub lineare Zeit nachzuschlagen, wie Sie verlangen, da Sie sie alle überprüfen müssen. Der beste Fall für die Suche wäre linear.
Wenn Ihre Daten sortiert werden, dann Ihre beste Fall konstante Zeit sein wird (alle n Punkte sind diejenigen mit dem größten y) und schlimmsten Fall wäre linear (alle n Punkte sind solche mit mindestens y). Der durchschnittliche Fall wäre näher an der Konstante Ich denke, wenn Ihre x und x_min beide in einem bestimmten Bereich grob zufällig sind.
Wenn Sie möchten, dass dies skaliert wird (dh Sie könnten große Werte von n haben), sollten Sie auch den resultierenden Satz sortiert halten, da Sie neue potenzielle Punkte überprüfen und den niedrigsten Wert löschen müssen Wert beim Einfügen (wenn Größe> n). Mit einem Baum kann dies Log-Zeit sein.
Also, um die ganze Sache zu tun, ist der schlimmste Fall für unsortierte Punkte, in welchem Fall Sie auf nlog (n) Zeit suchen. Sortierte Punkte sind besser, in diesem Fall betrachtest du den durchschnittlichen Fall der log (n) -Zeit (wiederum unter der Annahme grob zufällig verteilter Werte für x und x_min), was ja sublinear ist.
Falls es nicht auf den ersten offensichtlich, warum sortierten Punkte haben konstante Zeit zu durchsuchen, werde ich schnell, dass hier gehen.
Wenn die n Punkte mit den größten y Werten alle x > x_min
(der beste Fall) hatten, dann greifen Sie nur was Sie brauchen, von oben, so dass der Fall offensichtlich ist.
Für den durchschnittlichen Fall, angenommen grob zufällig verteilt x und x_min, sind die Chancen, dass x > x_min
im Grunde die Hälfte. Für beliebige zwei Zufallszahlen a und b gilt a > b
ebenso wahrscheinlich wie b > a
. Das Gleiche gilt für x und x_min; x > x_min
ist ebenso wahrscheinlich wahr wie x_min > x
, was 0,5 Wahrscheinlichkeit bedeutet. Dies bedeutet, dass für Ihre Punkte im Durchschnitt jeder zweite geprüfte Punkt Ihrer Anforderung x > x_min
entspricht. Im Durchschnitt werden Sie also 2n Punkte prüfen, um die n höchsten Punkte zu finden, die Ihren Kriterien entsprechen. Also der beste Fall war c Zeit, Durchschnitt ist 2c, die immer noch konstant ist.
Beachten Sie jedoch, dass bei Werten von n, die sich der Größe des Sets annähern, dies die Tatsache verdeckt, dass Sie das gesamte Set durchgehen und es im Wesentlichen wieder in die lineare Zeit bringen.Daher gilt meine Behauptung, dass es sich um eine konstante Zeit handelt, nicht, wenn Sie zufällige Werte von n im Bereich der Größe Ihrer Menge annehmen.
Wenn dies keine rein akademische Frage ist und durch ein konkretes Bedürfnis ausgelöst wird, dann kommt es auf die Situation an.
(bearbeiten) Ich habe gerade festgestellt, dass meine Constant-Time-Assertions eine Datenstruktur angenommen haben, wo Sie direkten Zugriff auf den höchsten Wert haben und sequenziell zu niedrigeren Werten gehen können. Wenn die Datenstruktur, die Ihnen zur Verfügung gestellt wird, nicht zu dieser Beschreibung passt, ist das natürlich nicht der Fall.
Wie können alle n Punkte größte y haben? –
Bedeutet du, dass die Punkte, an denen n Punkte liegen, größer als die übrigen Punkte sind? –
Ich meine, wenn Sie absteigend nach "y" sortieren, die ersten "n" Punkte. –