Timsort — гібридний стабільний алгоритм сортування, який поєднує в собі сортування злиттям та сортування включенням, призначений для ефективної роботи з багатьма видами реальних даних. Він був втілений в життя Тімом Пітерсом у 2002 році для використання у мові програмування Python. Алгоритм знаходить підпослідовності даних, які вже впорядковані, і використовує їх для більш ефективного сортування залишків. Це робиться шляхом об'єднання впорядкованих частин до виконання певних критеріїв. Timsort був стандартним алгоритмом сортування Python з версії 2.3. Він також використовується для сортування масивів не примітивного типу в Java SE 7, на платформі Android, у GNU Octave, Swift, та Rust.
Клас | Алгоритм сортування |
---|---|
Структура даних | Масив |
Найгірша швидкодія | |
Найкраща швидкодія | |
Середня швидкодія | |
Просторова складність у найгіршому випадку |
Він використовує прийоми з статті Пітера Макілроя 1993 року «Оптимістичне сортування та теоретична складність інформації».
Алгоритм
Timsort був розроблений, щоб скористатися перевагами наборів упорядкованих елементів, які вже існують в більшості реальних даних. Він перебирає елементи, збираючи впорядковані частини і одночасно поміщає ці частини в стек. Щоразу, коли частини зверху стека відповідають критеріям об'єднання, вони об'єднуються. Це триває поки всі дані не будуть пройдені; потім усі впорядковані частини об'єднуються по дві одночасно, і залишається лише один відсортований набір. Перевага об'єднання впорядкованих частин замість об'єднання підмасивів фіксованого розміру (як це робиться традиційним об'єднанням)-це зменшує загальну кількість порівнянь, необхідних для сортування всього масиву.
Кожен набір має мінімальний розмір, який ґрунтується на розмірі вхідних даних і визначається на початку алгоритму. Якщо набір менший за цей мінімальний розмір, використовується сортування включенням для додавання до набору додаткових елементів до досягнення мінімального розміру набору.
Критерії об'єднання
Timsort — це стабільний алгоритм сортування (порядок елементів з однаковими значеннями зберігається) і прагне виконувати збалансоване злиття (таким чином злиття об'єднує набори подібного розміру).
Для досягнення стабільності сортування об'єднуються лише послідовні набори. Між двома послідовними наборами всередині набору може бути елемент з однаковим значенням. Об'єднання цих двох наборів змінило б порядок однакових значень. Приклад цієї ситуації ([]- це впорядковані набори): [1 2 2] 1 4 2 [0 1 2]
У гонитві за збалансованим злиттям, Timsort розглядає три набори на вершині стека, X, Y, Z і підтримує інваріанти: і.
іі.
Якщо будь-який з цих інваріантів порушується, Y зливається з меншим з X або Z, і інваріанти перевіряються знову. Після того, як інваріанти задовільнили умову, можна починати пошук нового впорядкованого набору в даних. Ці інваріанти підтримують злиття як приблизно збалансовані.
Злиття додатково необхідної пам'яті
Початкова реалізація сортування злиттям не виконується без використання додаткового простору, тобто використовує N (розмір даних). Реалізації сортування об'єднаннями без використання додаткової пам'яті існують, але мають великі витрати часу. Timsort натомість виконує сортування з меншими витратами часу, використовуючи невеликий додатковий простір(<N)(щоб досягти середнього значення).
По-перше, Timsort виконує двійковий пошук, щоб знайти місце, куди перший елемент другого набору буде вставлений у першому впорядкованому наборі, зберігаючи його впорядкованим. Потім він виконує той самий алгоритм, щоб знайти місце, куди буде вставлено останній елемент першого набору у другому впорядкованому наборі, зберігаючи його впорядкованим. Елементи до та після цих розташувань уже на своїх правильних місцях і їх не потрібно об'єднувати. Потім менший із решти елементів двох наборів копіюється у тимчасову пам'ять, а елементи об'єднуються з більшим набором, звільняючи простір. Якщо перший набір менший, злиття починається з початку; якщо другий менший, злиття починається в кінці. Ця оптимізація зменшує кількість необхідних переміщень елементів, час роботи та тимчасові накладні витрати пам'яті в загальному випадку.
Приклад: два набори [1, 2, 3, 6, 10] та [4, 5, 7, 9, 12, 14, 17] повинні бути об'єднані. Зауважте, що вони вже відсортовані окремо. Найменший елемент другого набору - 4, і його слід додати на четвертій позиції першого набору, щоб зберегти його порядок (припускаючи, що перша позиція набору дорівнює 1). Найбільший елемент першого набору - 10, і його слід додати на п'ятій позиції другого набору, щоб зберегти його порядок. Тому [1, 2, 3] та [12, 14, 17] вже знаходяться у своїх остаточних положеннях, а набори, в яких потрібні переміщення елементів, - [6, 10] та [4, 5, 7, 9]. Маючи ці знання, нам потрібно лише виділити тимчасовий буфер розміром 2 замість 5.
Напрямок об'єднання
Об'єднання можна здійснювати в обох напрямках: зліва направо, як у традиційному сортуванні, або справа наліво.
Режим галопування під час злиття
Індивідуальне злиття наборів R1 та R2 зберігає кількість послідовних елементів, вибраних із циклу. Коли це число досягає мінімального порогу галопу (min_gallop), Timsort вважає, що ймовірно, що багато послідовних елементів все ще можуть бути вибрані з цього запуску, і перемикається в режим галопу. Припустимо, що R1 відповідає за його запуск. У цьому режимі алгоритм виконує експоненціальний пошук, також відомий як галопуючий пошук, для наступного елемента x циклу R2 у прогоні R1. Це робиться у два етапи: перший знаходить діапазон (2 k — 1, 2 k+1 — 1) де x. Другий етап виконує двійковий пошук елемента x у діапазоні, знайденому на першому етапі. Режим галопу — це спроба адаптувати алгоритм злиття до шаблону інтервалів між елементами в наборів.
Галоп не завжди ефективний. У деяких випадках режим галопу вимагає більше порівнянь, ніж простий лінійний пошук . Відповідно до орієнтирів, розроблених розробником, галоп вигідний лише тоді, коли початковий елемент одного пробігу не є одним із перших семи елементів іншого прогону. Це передбачає початковий поріг 7. Щоб уникнути недоліків режиму галопування, виконуються дві дії: (1) Якщо галопування виявляється менш ефективним, ніж бінарний пошук, режим галопу виходить. (2) Успіх або невдача галопу використовується для коригування min_gallop . Якщо вибраний елемент з того самого масиву, який повертав елемент раніше, min_gallop зменшується на одиницю, таким чином заохочуючи повернення до режиму галопу. В іншому випадку значення збільшується на одиницю, тим самим перешкоджаючи поверненню в режим галопу. У разі випадкових даних значення min_gallop стає настільки великим, що режим галопу ніколи не повторюється.
Низхідні набори
Для того, щоб також скористатися даними, відсортованими в порядку спадання, Timsort обертає строго низхідні набори, коли їх знаходить, і додає до стеку наборів. Оскільки низхідні набори пізніше сліпо змінюються, виключення наборів з рівними елементами підтримує стабільність алгоритму; тобто рівні елементи не буде змінено.
Мінімальний розмір набору
Оскільки злиття є найбільш ефективним, коли кількість наборів дорівнює або трохи менша за потужність двох, і особливо менш ефективним, коли кількість наборів трохи більше, ніж потужність двох, Timsort вибирає minrun, щоб спробувати забезпечити колишній стан.
Minrun вибирається з діапазону від 32 до 64 включно, таким чином, що розмір даних, поділений на minrun, дорівнює або трохи менший за потужність двох. Остаточний алгоритм бере шість найбільш значущих бітів розміру масиву, додає один, якщо будь -який з решти бітів встановлено, і використовує цей результат як minrun. Цей алгоритм працює для всіх масивів, включаючи ті, що менші за 64; для масивів розміром 63 або менше це встановлює minrun рівним розміру масиву, а Timsort зменшує до сортування вставки.
Аналіз
У гіршому випадку, Timsort бере порівняння для сортування масиву з n елементів. У кращому випадку, що відбувається, коли вхідні дані вже відсортовані, він працює за лінійний час, що означає, що це адаптивний алгоритм сортування.
Це переваги перед Quicksort для сортування посилань на об'єкти або покажчиків, оскільки вони вимагають дорогої непрямої пам'яті для доступу до даних та виконання порівнянь, а переваги когерентності кешу Quicksort значно зменшуються.
Офіційна перевірка
У 2015 році нідерландські та німецькі дослідники в рамках проекту FP7 ENVISAGE ЄС виявили помилку у стандартній реалізації Timsort.
Зокрема, інваріанти розмірів набору, що складаються між собою, забезпечують чітку верхню межу максимального розміру необхідного стека. Реалізація заздалегідь виділила стек, достатній для сортування 2 64 байт введення, і уникнула подальших перевірок переповнення.
Однак гарантія вимагає, щоб інваріанти застосовувалися до кожної групи з трьох послідовних наборів, але реалізація перевірила це лише на трійку найкращих. Використовуючи інструмент KeY для офіційної перевірки програмного забезпечення Java, дослідники виявили, що цієї перевірки недостатньо, і їм вдалося знайти довжини виконання (і вхідні дані, які генерували ці довжини виконання), що призведе до порушення інваріантів глибше в стеку після злиття вершини стека.
Як наслідок, для певних входів виділеного розміру недостатньо для утримання всіх об'єднаних наборів. У Java це генерує для цих входів виняток, що виходять за межі масиву. Найменший вхід, який викликає цей виняток у Java та Android v7, має розмір 67108864 (2 26). (Старіші версії Android вже викликали цей виняток для певних вхідних даних розміром 65536 (2 16))
Реалізацію Java було виправлено шляхом збільшення розміру попередньо виділеного стека на основі оновленого аналізу найгіршого випадку. Стаття також формальними методами показала, як встановити передбачуваний інваріант, перевіривши, чи чотири верхніх прогону в стеку відповідають двом вищезазначеним правилам. Цей підхід був прийнятий Python та Android.
Примітки
- Peters, Tim. . Python Developers Mailinglist. Архів оригіналу за 17 липня 2018. Процитовано 24 лютого 2011.
[Timsort] also has good aspects: It's stable (items that compare equal retain their relative order, so, e.g., if you sort first on zip code, and a second time on name, people with the same name still appear in order of increasing zip code; this is important in apps that, e.g., refine the results of queries based on user input). ... It has no bad cases (O(N log N) is worst case; N−1 compares is best).
- . Архів оригіналу за 19 вересня 2019. Процитовано 1 вересня 2018.
TimSort is an intriguing sorting algorithm designed in 2002 for Python, whose worst-case complexity was announced, but not proved until our recent preprint.
- Chandramouli, Badrish; Goldstein, Jonathan (2014). Patience is a Virtue: Revisiting Merge and Sort on Modern Processors. SIGMOD/PODS.
- . JDK Bug System. Архів оригіналу за 11 січня 2020. Процитовано 11 червня 2014.
- . Android Gingerbread Documentation. Архів оригіналу за 16 July 2015. Процитовано 24 February 2011.
- . Mercurial repository of Octave source code. Lines 23-25 of the initial comment block. Архів оригіналу за 6 лютого 2019. Процитовано 18 February 2013.
Code stolen in large part from Python's, listobject.c, which itself had no license header. However, thanks to Tim Peters for the parts of the code I ripped-off.
- . Swift Forums (амер.). 4 липня 2019. Архів оригіналу за 4 липня 2019. Процитовано 4 липня 2019.
- . doc.rust-lang.org. Архів оригіналу за 5 жовтня 2021. Процитовано 17 вересня 2020.
The current algorithm is an adaptive, iterative merge sort inspired by timsort. It is designed to be very fast in cases where the slice is nearly sorted, or consists of two or more sorted sequences concatenated one after another.
- McIlroy, Peter (January 1993). Optimistic Sorting and Information Theoretic Complexity. Proceedings of the Fourth Annual ACM-SIAM Symposium on Discrete Algorithms. с. 467—474. ISBN .
- MacIver, David R. (11 січня 2010). . Архів оригіналу за 28 серпня 2021. Процитовано 5 грудня 2015.
- Peters, Tim. . CPython git repository. Архів оригіналу за 12 листопада 2020. Процитовано 5 грудня 2019.
- de Gouw, Stijn; Rot, Jurriaan; de Boer, Frank S.; Bubel, Richard; Hähnle, Reiner (July 2015). (PDF). Computer Aided Verification: 273—289. doi:10.1007/978-3-319-21690-4_16. Архів оригіналу (PDF) за 30 грудня 2020. Процитовано 4 жовтня 2021.
- de Gouw, Stijn (24 лютого 2015). . Архів оригіналу за 8 травня 2017. Процитовано 6 травня 2017.
- . Архів оригіналу за 27 лютого 2015. Процитовано 4 жовтня 2021.
Рекомендована література
- Auger, Nicolas; Nicaud, Cyril; Pivoteau, Carine (2015). . hal-01212839. Архів оригіналу за 18 серпня 2021. Процитовано 4 жовтня 2021.
- Оже, Жуже, Ніко, Півото (2018). «Про складність TimSort у найгіршому випадку» [ 20 січня 2022 у Wayback Machine.] . ESA 2018.
- Сем Бусс, Олександр Кноп. «Стратегії стабільного сортування об'єднанням». SODA 2019.
Посилання
- timsort.txt [Архівовано 4 вересня 2012 у WebCite] — оригінальне пояснення Тіма Пітерса
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Timsort gibridnij stabilnij algoritm sortuvannya yakij poyednuye v sobi sortuvannya zlittyam ta sortuvannya vklyuchennyam priznachenij dlya efektivnoyi roboti z bagatma vidami realnih danih Vin buv vtilenij v zhittya Timom Pitersom u 2002 roci dlya vikoristannya u movi programuvannya Python Algoritm znahodit pidposlidovnosti danih yaki vzhe vporyadkovani i vikoristovuye yih dlya bilsh efektivnogo sortuvannya zalishkiv Ce robitsya shlyahom ob yednannya vporyadkovanih chastin do vikonannya pevnih kriteriyiv Timsort buv standartnim algoritmom sortuvannya Python z versiyi 2 3 Vin takozh vikoristovuyetsya dlya sortuvannya masiviv ne primitivnogo tipu v Java SE 7 na platformi Android u GNU Octave Swift ta Rust TimsortKlasAlgoritm sortuvannyaStruktura danihMasivNajgirsha shvidkodiyaO n log n displaystyle O n log n Najkrasha shvidkodiyaO n displaystyle O n Serednya shvidkodiyaO n log n displaystyle O n log n Prostorova skladnist u najgirshomu vipadkuO n displaystyle O n Vin vikoristovuye prijomi z statti Pitera Makilroya 1993 roku Optimistichne sortuvannya ta teoretichna skladnist informaciyi AlgoritmTimsort buv rozroblenij shob skoristatisya perevagami naboriv uporyadkovanih elementiv yaki vzhe isnuyut v bilshosti realnih danih Vin perebiraye elementi zbirayuchi vporyadkovani chastini i odnochasno pomishaye ci chastini v stek Shorazu koli chastini zverhu steka vidpovidayut kriteriyam ob yednannya voni ob yednuyutsya Ce trivaye poki vsi dani ne budut projdeni potim usi vporyadkovani chastini ob yednuyutsya po dvi odnochasno i zalishayetsya lishe odin vidsortovanij nabir Perevaga ob yednannya vporyadkovanih chastin zamist ob yednannya pidmasiviv fiksovanogo rozmiru yak ce robitsya tradicijnim ob yednannyam ce zmenshuye zagalnu kilkist porivnyan neobhidnih dlya sortuvannya vsogo masivu Kozhen nabir maye minimalnij rozmir yakij gruntuyetsya na rozmiri vhidnih danih i viznachayetsya na pochatku algoritmu Yaksho nabir menshij za cej minimalnij rozmir vikoristovuyetsya sortuvannya vklyuchennyam dlya dodavannya do naboru dodatkovih elementiv do dosyagnennya minimalnogo rozmiru naboru Kriteriyi ob yednannya Nabori vstavlyayutsya u stek Yaksho Z Y X displaystyle left vert Z right vert leq left vert Y right vert left vert X right vert todi X i Y ob yednuyutsya i zaminyuyutsya u steku Takim chinom zlittya prodovzhuyetsya do tih pir poki vsi nabori ne zadovolnyat i Z gt Y X displaystyle left vert Z right vert gt left vert Y right vert left vert X right vert ta ii Y gt X displaystyle left vert Y right vert gt left vert X right vert Timsort ce stabilnij algoritm sortuvannya poryadok elementiv z odnakovimi znachennyami zberigayetsya i pragne vikonuvati zbalansovane zlittya takim chinom zlittya ob yednuye nabori podibnogo rozmiru Dlya dosyagnennya stabilnosti sortuvannya ob yednuyutsya lishe poslidovni nabori Mizh dvoma poslidovnimi naborami vseredini naboru mozhe buti element z odnakovim znachennyam Ob yednannya cih dvoh naboriv zminilo b poryadok odnakovih znachen Priklad ciyeyi situaciyi ce vporyadkovani nabori 1 2 2 1 4 2 0 1 2 U gonitvi za zbalansovanim zlittyam Timsort rozglyadaye tri nabori na vershini steka X Y Z i pidtrimuye invarianti i Z gt Y X displaystyle left vert Z right vert gt left vert Y right vert left vert X right vert ii Y gt X displaystyle left vert Y right vert gt left vert X right vert Yaksho bud yakij z cih invariantiv porushuyetsya Y zlivayetsya z menshim z X abo Z i invarianti pereviryayutsya znovu Pislya togo yak invarianti zadovilnili umovu mozhna pochinati poshuk novogo vporyadkovanogo naboru v danih Ci invarianti pidtrimuyut zlittya yak priblizno zbalansovani Zlittya dodatkovo neobhidnoyi pam yati Shob ob yednati nabori Timsort kopiyuye elementi menshogo masivu X na cij ilyustraciyi u timchasovu pam yat potim sortuye ta zapovnyuye elementi v ostatochnomu poryadku v ob yednanij prostir X ta Y Pochatkova realizaciya sortuvannya zlittyam ne vikonuyetsya bez vikoristannya dodatkovogo prostoru tobto vikoristovuye N rozmir danih Realizaciyi sortuvannya ob yednannyami bez vikoristannya dodatkovoyi pam yati isnuyut ale mayut veliki vitrati chasu Timsort natomist vikonuye sortuvannya z menshimi vitratami chasu vikoristovuyuchi nevelikij dodatkovij prostir lt N shob dosyagti serednogo znachennya Po pershe Timsort vikonuye dvijkovij poshuk shob znajti misce kudi pershij element drugogo naboru bude vstavlenij u pershomu vporyadkovanomu nabori zberigayuchi jogo vporyadkovanim Potim vin vikonuye toj samij algoritm shob znajti misce kudi bude vstavleno ostannij element pershogo naboru u drugomu vporyadkovanomu nabori zberigayuchi jogo vporyadkovanim Elementi do ta pislya cih roztashuvan uzhe na svoyih pravilnih miscyah i yih ne potribno ob yednuvati Potim menshij iz reshti elementiv dvoh naboriv kopiyuyetsya u timchasovu pam yat a elementi ob yednuyutsya z bilshim naborom zvilnyayuchi prostir Yaksho pershij nabir menshij zlittya pochinayetsya z pochatku yaksho drugij menshij zlittya pochinayetsya v kinci Cya optimizaciya zmenshuye kilkist neobhidnih peremishen elementiv chas roboti ta timchasovi nakladni vitrati pam yati v zagalnomu vipadku Priklad dva nabori 1 2 3 6 10 ta 4 5 7 9 12 14 17 povinni buti ob yednani Zauvazhte sho voni vzhe vidsortovani okremo Najmenshij element drugogo naboru 4 i jogo slid dodati na chetvertij poziciyi pershogo naboru shob zberegti jogo poryadok pripuskayuchi sho persha poziciya naboru dorivnyuye 1 Najbilshij element pershogo naboru 10 i jogo slid dodati na p yatij poziciyi drugogo naboru shob zberegti jogo poryadok Tomu 1 2 3 ta 12 14 17 vzhe znahodyatsya u svoyih ostatochnih polozhennyah a nabori v yakih potribni peremishennya elementiv 6 10 ta 4 5 7 9 Mayuchi ci znannya nam potribno lishe vidiliti timchasovij bufer rozmirom 2 zamist 5 Napryamok ob yednannya Ob yednannya mozhna zdijsnyuvati v oboh napryamkah zliva napravo yak u tradicijnomu sortuvanni abo sprava nalivo Rezhim galopuvannya pid chas zlittya Elementi na yaki vkazuye sinya strilka porivnyuyut a menshij element peremishuyut u kinceve polozhennya na yake vkazuye chervona strilka Individualne zlittya naboriv R1 ta R2 zberigaye kilkist poslidovnih elementiv vibranih iz ciklu Koli ce chislo dosyagaye minimalnogo porogu galopu min gallop Timsort vvazhaye sho jmovirno sho bagato poslidovnih elementiv vse she mozhut buti vibrani z cogo zapusku i peremikayetsya v rezhim galopu Pripustimo sho R1 vidpovidaye za jogo zapusk U comu rezhimi algoritm vikonuye eksponencialnij poshuk takozh vidomij yak galopuyuchij poshuk dlya nastupnogo elementa x ciklu R2 u progoni R1 Ce robitsya u dva etapi pershij znahodit diapazon 2 k 1 2 k 1 1 de x Drugij etap vikonuye dvijkovij poshuk elementa x u diapazoni znajdenomu na pershomu etapi Rezhim galopu ce sproba adaptuvati algoritm zlittya do shablonu intervaliv mizh elementami v naboriv Usi chervoni elementi menshi za sini tut 21 Takim chinom voni mozhut buti peremisheni fragmentom do ostatochnogo masivu Galop ne zavzhdi efektivnij U deyakih vipadkah rezhim galopu vimagaye bilshe porivnyan nizh prostij linijnij poshuk Vidpovidno do oriyentiriv rozroblenih rozrobnikom galop vigidnij lishe todi koli pochatkovij element odnogo probigu ne ye odnim iz pershih semi elementiv inshogo progonu Ce peredbachaye pochatkovij porig 7 Shob uniknuti nedolikiv rezhimu galopuvannya vikonuyutsya dvi diyi 1 Yaksho galopuvannya viyavlyayetsya mensh efektivnim nizh binarnij poshuk rezhim galopu vihodit 2 Uspih abo nevdacha galopu vikoristovuyetsya dlya koriguvannya min gallop Yaksho vibranij element z togo samogo masivu yakij povertav element ranishe min gallop zmenshuyetsya na odinicyu takim chinom zaohochuyuchi povernennya do rezhimu galopu V inshomu vipadku znachennya zbilshuyetsya na odinicyu tim samim pereshkodzhayuchi povernennyu v rezhim galopu U razi vipadkovih danih znachennya min gallop staye nastilki velikim sho rezhim galopu nikoli ne povtoryuyetsya Nizhidni nabori Dlya togo shob takozh skoristatisya danimi vidsortovanimi v poryadku spadannya Timsort obertaye strogo nizhidni nabori koli yih znahodit i dodaye do steku naboriv Oskilki nizhidni nabori piznishe slipo zminyuyutsya viklyuchennya naboriv z rivnimi elementami pidtrimuye stabilnist algoritmu tobto rivni elementi ne bude zmineno Minimalnij rozmir naboru Algoritm Timsort shukaye vporyadkovani poslidovnosti minimalnogo rozmiru minruns dlya vikonannya yih sortuvannya Oskilki zlittya ye najbilsh efektivnim koli kilkist naboriv dorivnyuye abo trohi mensha za potuzhnist dvoh i osoblivo mensh efektivnim koli kilkist naboriv trohi bilshe nizh potuzhnist dvoh Timsort vibiraye minrun shob sprobuvati zabezpechiti kolishnij stan Minrun vibirayetsya z diapazonu vid 32 do 64 vklyuchno takim chinom sho rozmir danih podilenij na minrun dorivnyuye abo trohi menshij za potuzhnist dvoh Ostatochnij algoritm bere shist najbilsh znachushih bitiv rozmiru masivu dodaye odin yaksho bud yakij z reshti bitiv vstanovleno i vikoristovuye cej rezultat yak minrun Cej algoritm pracyuye dlya vsih masiviv vklyuchayuchi ti sho menshi za 64 dlya masiviv rozmirom 63 abo menshe ce vstanovlyuye minrun rivnim rozmiru masivu a Timsort zmenshuye do sortuvannya vstavki AnalizU girshomu vipadku Timsort bere O n log n displaystyle O n log n porivnyannya dlya sortuvannya masivu z n elementiv U krashomu vipadku sho vidbuvayetsya koli vhidni dani vzhe vidsortovani vin pracyuye za linijnij chas sho oznachaye sho ce adaptivnij algoritm sortuvannya Ce perevagi pered Quicksort dlya sortuvannya posilan na ob yekti abo pokazhchikiv oskilki voni vimagayut dorogoyi nepryamoyi pam yati dlya dostupu do danih ta vikonannya porivnyan a perevagi kogerentnosti keshu Quicksort znachno zmenshuyutsya Oficijna perevirkaU 2015 roci niderlandski ta nimecki doslidniki v ramkah proektu FP7 ENVISAGE YeS viyavili pomilku u standartnij realizaciyi Timsort Zokrema invarianti rozmiriv naboru sho skladayutsya mizh soboyu zabezpechuyut chitku verhnyu mezhu maksimalnogo rozmiru neobhidnogo steka Realizaciya zazdalegid vidilila stek dostatnij dlya sortuvannya 2 64 bajt vvedennya i uniknula podalshih perevirok perepovnennya Odnak garantiya vimagaye shob invarianti zastosovuvalisya do kozhnoyi grupi z troh poslidovnih naboriv ale realizaciya perevirila ce lishe na trijku najkrashih Vikoristovuyuchi instrument KeY dlya oficijnoyi perevirki programnogo zabezpechennya Java doslidniki viyavili sho ciyeyi perevirki nedostatno i yim vdalosya znajti dovzhini vikonannya i vhidni dani yaki generuvali ci dovzhini vikonannya sho prizvede do porushennya invariantiv glibshe v steku pislya zlittya vershini steka Yak naslidok dlya pevnih vhodiv vidilenogo rozmiru nedostatno dlya utrimannya vsih ob yednanih naboriv U Java ce generuye dlya cih vhodiv vinyatok sho vihodyat za mezhi masivu Najmenshij vhid yakij viklikaye cej vinyatok u Java ta Android v7 maye rozmir 67108 864 2 26 Starishi versiyi Android vzhe viklikali cej vinyatok dlya pevnih vhidnih danih rozmirom 65536 2 16 Realizaciyu Java bulo vipravleno shlyahom zbilshennya rozmiru poperedno vidilenogo steka na osnovi onovlenogo analizu najgirshogo vipadku Stattya takozh formalnimi metodami pokazala yak vstanoviti peredbachuvanij invariant perevirivshi chi chotiri verhnih progonu v steku vidpovidayut dvom vishezaznachenim pravilam Cej pidhid buv prijnyatij Python ta Android PrimitkiPeters Tim Python Developers Mailinglist Arhiv originalu za 17 lipnya 2018 Procitovano 24 lyutogo 2011 Timsort also has good aspects It s stable items that compare equal retain their relative order so e g if you sort first on zip code and a second time on name people with the same name still appear in order of increasing zip code this is important in apps that e g refine the results of queries based on user input It has no bad cases O N log N is worst case N 1 compares is best Arhiv originalu za 19 veresnya 2019 Procitovano 1 veresnya 2018 TimSort is an intriguing sorting algorithm designed in 2002 for Python whose worst case complexity was announced but not proved until our recent preprint Chandramouli Badrish Goldstein Jonathan 2014 Patience is a Virtue Revisiting Merge and Sort on Modern Processors SIGMOD PODS JDK Bug System Arhiv originalu za 11 sichnya 2020 Procitovano 11 chervnya 2014 Android Gingerbread Documentation Arhiv originalu za 16 July 2015 Procitovano 24 February 2011 Mercurial repository of Octave source code Lines 23 25 of the initial comment block Arhiv originalu za 6 lyutogo 2019 Procitovano 18 February 2013 Code stolen in large part from Python s listobject c which itself had no license header However thanks to Tim Peters for the parts of the code I ripped off Swift Forums amer 4 lipnya 2019 Arhiv originalu za 4 lipnya 2019 Procitovano 4 lipnya 2019 doc rust lang org Arhiv originalu za 5 zhovtnya 2021 Procitovano 17 veresnya 2020 The current algorithm is an adaptive iterative merge sort inspired by timsort It is designed to be very fast in cases where the slice is nearly sorted or consists of two or more sorted sequences concatenated one after another McIlroy Peter January 1993 Optimistic Sorting and Information Theoretic Complexity Proceedings of the Fourth Annual ACM SIAM Symposium on Discrete Algorithms s 467 474 ISBN 0 89871 313 7 MacIver David R 11 sichnya 2010 Arhiv originalu za 28 serpnya 2021 Procitovano 5 grudnya 2015 Peters Tim CPython git repository Arhiv originalu za 12 listopada 2020 Procitovano 5 grudnya 2019 de Gouw Stijn Rot Jurriaan de Boer Frank S Bubel Richard Hahnle Reiner July 2015 PDF Computer Aided Verification 273 289 doi 10 1007 978 3 319 21690 4 16 Arhiv originalu PDF za 30 grudnya 2020 Procitovano 4 zhovtnya 2021 de Gouw Stijn 24 lyutogo 2015 Arhiv originalu za 8 travnya 2017 Procitovano 6 travnya 2017 Arhiv originalu za 27 lyutogo 2015 Procitovano 4 zhovtnya 2021 Rekomendovana literaturaAuger Nicolas Nicaud Cyril Pivoteau Carine 2015 hal 01212839 Arhiv originalu za 18 serpnya 2021 Procitovano 4 zhovtnya 2021 Ozhe Zhuzhe Niko Pivoto 2018 Pro skladnist TimSort u najgirshomu vipadku 20 sichnya 2022 u Wayback Machine ESA 2018 Sem Buss Oleksandr Knop Strategiyi stabilnogo sortuvannya ob yednannyam SODA 2019 Posilannyatimsort txt Arhivovano 4 veresnya 2012 u WebCite originalne poyasnennya Tima Pitersa