Понимание Timsort

Я использовал RCS, CVS, SCCS, SourceSafe, Хранилище, по необходимости, подрывную деятельность и мерзавца.

я оценил BitKeeper, Размеры, дугу, базар, svk, ClearCase, PVCS и Совместные действия.

, Если бы я должен был запустить новый репозиторий сегодня, я выбрал бы мерзавец . Передает.

Это свободно, быстро, и при активной разработке.

И можно использовать его в качестве клиента любого репозитория подрывной деятельности с помощью мерзавца-svn.

Это качается.

25
задан Community 23 May 2017 в 12:18
поделиться

2 ответа

Цитирование соответствующей части из теперь удаленного сообщения в блоге: Визуализация алгоритмов сортировки: Timsort Python

Бизнес-конец timsort - это сортировка слиянием, которая работает на прогонах предварительно отсортированных элементы. Минимальная длина выполнения minrun выбрана, чтобы убедиться, что окончательные слияния максимально сбалансированы - для 64 элементов minrun оказывается равным 32. Перед началом слияния выполняется один проход через данные для обнаружения ранее существовавших запусков отсортированных элементы. Нисходящие пробеги обрабатываются простым реверсированием их на месте. Если результирующая длина выполнения меньше minrun, она увеличивается до minrun с помощью сортировки вставкой. В перетасованном массиве без значительных ранее существовавших запусков этот процесс выглядит точно так же, как мы предположили выше: предварительная сортировка блоков minrun-элементов с использованием сортировки вставкой перед объединением с сортировкой слиянием.

[...]

  • timsort находит нисходящий прогон и меняет его направление на месте. Это делается непосредственно на массиве указателей, поэтому с нашей точки зрения кажется "мгновенным".
  • Теперь прогон увеличен до длины minrun с помощью сортировки вставкой.
  • В начале следующего блока прогон не обнаружен, а сортировка вставкой используется для сортировки всего блока. Обратите внимание, что отсортированные элементы внизу этого блока не обрабатываются особым образом - timsort не обнаруживает прогоны, которые начинаются в середине блоков, повышаемых до minrun.
  • Наконец, mergesort используется для объединения прогонов.
14
ответ дан 28 November 2019 в 21:52
поделиться

This change went through the core-libs mailing list when it went in so there is some discussion and useful links there. Here's the web rev with code review changes and also the original patch.

The comments in the code say:

Implementation note: This implementation is a stable, adaptive,
iterative mergesort that requires far fewer than n lg(n) comparisons
when the input array is partially sorted, while offering the
performance of a traditional mergesort when the input array is
randomly ordered. If the input array is nearly sorted, the
implementation requires approximately n comparisons.
Temporary storage requirements vary from a small constant for nearly sorted
input arrays to n/2 object references for randomly ordered input
arrays.

The implementation takes equal advantage of ascending and
descending order in its input array, and can take advantage of
ascending and descending order in different parts of the the same
input array. It is well-suited to merging two or more sorted arrays:
simply concatenate the arrays and sort the resulting array.
The implementation was adapted from Tim Peters's list sort for Python
TimSort. It uses techiques from Peter McIlroy's "Optimistic
Sorting and Information Theoretic Complexity", in Proceedings of the
Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474,
January 1993.

Buried in there is the very useful link to the Python implementation details, and I think that's a great place to start, followed by the code. To be incredibly high level about it, timsort improves performance by noticing runs of sorted data and taking advantage of that structure during the sort.

8
ответ дан 28 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: