git-bisect

___ qstnhdr ___ Finde, wo sich f (x) in einer Liste ändert, mit bisection (in Python) ___ answer42119740 ___

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.

    
___ qstntxt ___

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.

    
___ answer42119888 ___

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%     
___ answer42119794 ___

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%     
___ tag123bisection ___ Alles, was sich auf eine Klasse von Algorithmen bezieht, bei der das Ergebnis gefunden wird, indem entweder die obere oder die untere Hälfte einer sortierten Menge von Elementen durchsucht wird und diese Prozedur rekursiv wiederholt wird. Häufig verwendet, um auf die Bisektionsmethode (um eine Wurzel einer Gleichung zu finden) oder auf den Bisektions-Suchalgorithmus (um eine sortierte Liste nach einem passenden Element zu suchen) zu verweisen. ___ tag123gitbissect ___ git-bisect ist Teil der git CM-Software. Es wird verwendet, um herauszufinden, welche Veränderung etwas gebrochen hat. ___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123bisect ___ hilf uns dieses Wiki zu bearbeiten ___
3
Antworten

Finde, wo sich f (x) in einer Liste ändert, mit bisection (in Python)

Begründung: Ich versuche in Python etwas Ähnliches wie git bisect zu implementieren, aber mit einer Liste von Verzeichnissen. Ich habe eine (lange) Liste von Versionsnummern wie folgt: ['1.0', '1.14', '2.3', '3.1', '4'] Ich habe ein...
08.02.2017, 17:23