Dafür steht %code% .
%Vor%Ein schneller Weg, aber ein komplizierter wäre:
%Vor%Was ist eine halbierte Methode? Schneidet die Liste rekursiv um die Hälfte, prüft das Element in der Mitte und verschiebt das Segment links, wenn es 1 ist oder rechts, wenn es eine 0 ist.% Co_de% verfolgt den Index. Ich würde gerne eine %code% von jemandem haben, wenn er die Zeit hat.
Begründung: Ich versuche in Python etwas Ähnliches wie %code% zu implementieren, aber mit einer Liste von Verzeichnissen.
Ich habe eine (lange) Liste von Versionsnummern wie folgt: %code%
Ich habe eine Funktion %code% , die eine Versionsnummer annimmt und einen Wert zurückgibt.
%code% würde folgendermaßen aussehen: %Code% ... aber das Ausführen von %code% ist sehr teuer.
Ich möchte eine Art Halbierung durchführen, bei der die Änderungsgrenze gefunden wird.
Sie wollen also im Grunde binären Suchalgorithmus implementieren ... das ist ziemlich einfach, der grobe Entwurf des Algorithmus ist unten. Ich habe es nicht getestet, aber Sie sollten die Idee bekommen und auf Kantenfälle achten, wenn Ihre Versionsliste der Länge 1 oder 2:
%Vor%Sie können einfach binäre Suche :
verwenden %Vor%Es wird der erste Index %code% zurückgegeben, für den %code% ist %code% .
Natürlich geht die Funktion davon aus, dass die Karte von %code% auf der %code% die folgende Form hat:
%Vor%Wenn dies nicht der Fall ist, findet es normalerweise einen swap , aber welcher ist eher undefiniert.
Sagen Sie %code% ist einfach " die Version ist 2 oder höher " also %code% , dann wird es zurückgeben:
%Vor%Also index %code% . Falls die gesamte Liste mit %code% Objekten zurückkehren würde, wird ** %code% zurückgegeben. Da es "annimmt", wird das Element außerhalb der Liste nach %code% ausgewertet:
%Vor%In Ihrem Beispiel ist %code% natürlich %code% .
Experimente:
%Vor%(Ich habe hier natürlich eine sehr billige Versionsprüfung gemacht, aber es funktioniert natürlich auch für anspruchsvollere Prädikate).
Da dies eine binäre Suche ist, wird es in O (log n) mit n die Anzahl der Elemente in der Liste ausgeführt, während lineare Suche kann Ergebnis in O (n) checks (was normalerweise teurer ist).
Bearbeiten : Falls die Liste zwei Werte enthält und Sie finden die Swap , können Sie einfach zuerst den Wert für den Index berechnen %code% :
%Vor%und dann %code% :
bereitstellen %Vor%Oder setzen Sie es in eine nette Funktion:
%Vor%