Finde den nächst niedrigeren Punkt in einer sortierten Liste

8

Nehmen wir an, ich habe eine sortierte Liste von Floats. Jetzt möchte ich den Index des nächstniedrigeren Artikels eines gegebenen Wertes erhalten. Der übliche For-Loop-Ansatz hat eine Komplexität von O (n). Da die Liste sortiert ist, muss es einen Weg geben, den Index mit O (log n) zu erhalten.

Mein O (n) Ansatz:

%Vor%

Gibt es einen Datentyp zur Lösung dieses Problems in O (log n)?

Beste Grüße Sebastian

    
Sebastian 07.04.2010, 09:10
quelle

6 Antworten

15

Wie wäre es mit halbiert ?

%Vor%

Sie müssen möglicherweise den Fall eines Suchwerts behandeln, der kleiner oder gleich dem niedrigsten / am weitesten links liegenden Wert in der Liste ist (in diesem Fall index == -1 ).

Je nachdem, welchen Index Sie bei Gleichheit haben möchten, müssen Sie möglicherweise stattdessen bisect_right verwenden.

    
stephan 07.04.2010 09:36
quelle
10

Sie können eine binäre Suche in einem Array / einer Liste durchführen, um den Index des Objekts zu erhalten, nach dem Sie suchen, und den Index darunter erhalten, um den niedrigeren Eintrag zu erhalten (da es tatsächlich einen niedrigeren Eintrag gibt!) / p>

Siehe: Binäre Suche (Bisection) in Python

Seien Sie vorsichtig, wenn Sie Fließkommazahlen auf Gleichheit prüfen!

    
Bart Kiers 07.04.2010 09:14
quelle
2

Verwenden Sie das Modul bisect . Die Funktion

%Vor%

gibt den richtigen Einfügepunkt für das Element in der Liste zurück, um die sortierte Reihenfolge beizubehalten.

    
miles82 07.04.2010 09:38
quelle
2
%Vor%

Da Sie den Index anfordern und nicht den nächstniedrigeren Wert, ändern Sie die Funktion next_lower_value , um index - 1 anstelle von values_list[index - 1] zurückzugeben.

    
tzot 25.04.2010 19:50
quelle
1

Um einen Teil der Frage nach Datentypen zu beantworten: Im Allgemeinen ist der Dateityp der Binärbaum, der am besten geeignet ist, um Dinge in O (log n) -Zeit zu finden (während O (1) bei Einfügungen und Löschungen erhalten bleibt!). Sie können Dinge darin finden, indem Sie eine Reihe von Links-Rechts-Entscheidungen treffen, was sehr analog zu einer binären Suche in einer linearen Liste ist, aber (IMO) etwas konzeptionell intuitiver ist.

Das heißt, von dem, was ich über Python weiß, scheinen Binärbäume nicht in der Standardbibliothek der Sprache zu sein. Für Ihre Anwendung würde es wahrscheinlich keinen Nutzen geben, eine Implementierung nur für diesen Zweck aufzunehmen.

Schließlich können Sie in einer sortierten Liste sowohl die Binärbäume als auch die Binärsuche verwenden, um die Suche um einen Schritt zu verkürzen: Es ist nicht notwendig, nach dem Schlüsselelement zu suchen und dann zu seinem Vorgänger zurückzukehren. Verwenden Sie stattdessen bei jedem Vergleichsschritt so, als ob der Schlüsselwert zu groß wäre. Dies führt dazu, dass Ihre Suche auf dem nächstkleineren Wert endet. Sorgfältig ausgeführt, kann dies auch bei dem von Bart angesprochenen "fast equal floating point value" Problem helfen.

    
Carl Smotricz 07.04.2010 09:28
quelle
1

Wenn ich dieses Recht lese, ist das nächst niedrigere Element das erste Element in der Liste, das kleiner oder gleich x ist. Die halbierende Dokumentation zum Suchen nach sortierten Listen bietet folgende Funktion:

%Vor%     
paul 20.03.2014 21:53
quelle

Tags und Links