Ist Timsort Allzweck- oder Python-spezifisch?
Frage
Timsort ist ein adaptives, stabil, natürlicher mergesort. Es hat übernatürliche Leistung auf viele Arten von teilweise geordnete Anordnungen (weniger als lg (N!) Vergleiche benötigt, und so wenig wie N-1), doch so schnell wie Pythons vorherige stark getunten Samplesort Hybrid auf Random-Arrays.
Haben Sie gesehen Timsort außerhalb von CPython verwendet? Ist es sinnvoll?
Lösung
Ja, es macht ziemlich viel Sinn in bestimmten Timsort außerhalb von CPython, zu verwenden, oder Python, im Allgemeinen.
Es gibt derzeit eine Anstrengungen im Gange Javas „modifizierte merge zu ersetzen Art“mit Timsort, und die ersten Ergebnisse sind sehr positiv.
Andere Tipps
Der Algorithmus ist ziemlich allgemein, aber die Vorteile sind eher Python-spezifisch. Im Gegensatz zu den meisten Sortierroutinen, was Python List.Sort (das ist, was Timsort verwendet) kümmert sich um sich unnötige Vergleiche zu vermeiden, da in der Regel Vergleiche sind ein Los teurer als Gegenstände tauschen (das ist immer nur eine Reihe von Zeiger Kopien) oder sogar einige zusätzliche Zuweisung von Speicher (weil es immer ist nur ein Array von Zeigern, und der Aufwand ist klein im Vergleich zu dem durchschnittlichen Aufwand in jedem Python-Betrieb.)
Wenn Sie unter ähnlichen Einschränkungen sind, dann kann es geeignet sein. Ich habe noch anderen Fall zu sehen, wo Vergleiche sind wirklich so teuer, aber: -)
Es sieht nicht besonders vertraut, aber „smart“ mergesorts sind ziemlich häufig draußen in der weiten Welt der Software.
Als ob es Sinn macht, das hängt davon ab, was Sie Sortieren und die relativ Kosten von Vergleich vs. Speicherzuweisung. Eine Art, die 2 * N Bytes zusätzlicher Speicher erfordert up ist keine gute Wahl in einem Speicher-eingeschränkte Umgebung sein wird.
Beantwortet jetzt auf Wikipedia : Timsort wird in Java 7 verwendet werden, die es von Android kopiert.
Timsort ist auch in Android jetzt: http://www.kiwidoc.com/java/l/x/android/android/5/p/java.util/c/TimSort
Die Beschreibung, die Sie verknüpft sieht ganz allgemein.