Timsort saralash algoritmi
Mavzu: “Timsort saralash algoritmi” MUNDARIJA KIRISH .................................................................................................. 2 I Bob.Timsort saralash algoritmining asosiy g’oyasi. ........................... 3 1.1. Pastga tushadigan yugurishlar va minimal yugurish hajmi. ............... 4 1.2. Birlashtirish mezonlari ....................................................................... 6 1.3. Yuqori bo’shliqni birlashtirish. .......................................................... 7 1.4. Birlashtirish paytida yugurish rejimi. ................................................. 9 II Bob.Tahlil. ....................................................................................... 11 2.1.Rasmiy tekshirish. ............................................................................. 11 XULOSA ............................................................................................. 13 ADABIYOTLAR RO’YXATI ........................................................... 14 ILOVALAR ........................................................................................ 15 ILOVA. TimSort saralash algoritmining c++ tilidagi kodi . ................... 15 1
KIRISH Timsort gibrid , barqaror tartiblash algoritmi bo ’ lib , birlashtirish va qo ’ shish tartibidan olingan bo ’ lib , real ma ʼ lumotlarning ko ’ p turlarida yaxshi ishlashga mo ’ ljallangan . U Tim Peters tomonidan 2002 - yilda Python dasturlash tilida foydalanish uchun amalga oshirilgan . Algoritm allaqachon buyurtma qilingan ( ishlaydi ) ma ’ lumotlarning pastki ketma - ketligini topadi va qolganlarini yanada samaraliroq saralash uchun ulardan foydalanadi . U bu tartiblangan elementlarni " tabiiy yugurishlar " deb ataydi . Ular ma ' lumotlar bo ' ylab takrorlanadi , elementlarni ketma - ket to ' playdi va bir vaqtning o ’ zida bir nechtasini bittaga birlashtiradi . Bu muayyan mezonlar bajarilgunga qadar yugurishlarni birlashtirish orqali amalga oshiriladi . Timsort: juda tez, O(n*log n), barqaror tartiblash algoritmi akademik maqsadlar uchun emas, balki real dunyo uchun mo’ljallangan. Timsort - bu haqiqiy ma'lumotlarda samarali bo’lgan va akademik laboratoriyada yaratilmagan saralash algoritmi.Timsort 2.3 versiyasidan beri Pythonning standart tartiblash algoritmi hisoblanadi.U Android platformasida Java SE 7 da ibtidoiy bo’lmagan massivlarni saralash uchun ham qo’llaniladi. Timsort Sinf-saralash algoritmi; Ma’lumotlar tuzilishi-massiv; Eng yomon holatda ishlash murakkabligi-O(n*log n); Eng yaxshi samaradorlik-O(n); O’rtacha ishlash murakkabligi-O(n*log n); U Piter Makilroyning 1993-yilda chop etilgan “Optimistik saralash va axborot nazariy murakkabligi” nomli maqolasidan foydalanadi. 2
I Bob.Timsort saralash algoritmining asosiy g’oyasi. Timsort ko’pgina real dunyo ma’lumotlarida mavjud bo’lgan ketma- ket tartiblangan elementlarning ishlashidan foydalanish uchun mo’ljallangan.Ushbu algoritm Insertion Sort va Merge Sort ga asoslangan tartiblash algoritmi hisoblanadi. U ma’lumotlarni to’playdigan elementlarni ishga tushiradi va bir vaqtning o’zida stackga joylashtiradi. Qachonki stackning yuqori qismidagi yugurishlar birlashma mezoniga mos kelsa,ular birlashtiriladi. Bu barcha ma’lumotlar o’tkazilgunga qadar davom etadi.Keyin, barcha yugurishlar bir vaqtning o’zida ikkitadan birlashtiriladi va faqat bitta tartiblangan yugurish qoladi. Ruxsat etilgan o’lchamdagi kichik ro’yxatlarni birlashtirish o’rniga buyurtma qilingan yugurishlarni birlashtirishning afzalligi (an’anaviy birlashma tomonidan bajarilgani kabi) butun ro’yxatni saralash uchun zarur bo’lgan taqqoslashlarning umumiy sonini kamaytiradi. Har bir ishga tushirish minimal o’lchamga ega,u kirish hajmiga asoslanadi va algoritm boshida aniqlanadi. Agar yugurish ushbu minimal yugurish hajmidan kichikroq bo’lsa, qo’shish tartiblash minimal yugurish hajmiga erishilgunga qadar ishga qo’shimcha elementlar qo’shish uchun ishlatiladi. Algoritm haqiqiy dunyoda tartiblangan ma’lumotlar massivida ko’pincha tartiblangan (o’sish yoki kamayish bo’yicha muhim emas) pastki qatorlarni o’z ichiga oladi degan fikrga asoslanadi. Darhaqiqat, bu ko’pincha shunday bo’ladi. Bunday ma’lumotlarga ko’ra, Timsort boshqa barcha algoritmlarni parchalab tashlaydi. Bu erda ba’zi murakkab matematik kashfiyotlar kutmang. Gap shundaki, aslida Timsort butunlay mustaqil algoritm emas, balki gibrid, o’z g’oyalari bilan tajriba qilingan bir qancha boshqa algoritmlarning samarali kombinatsiyasi. Juda qisqacha, algoritmning mohiyatini quyidagicha tushuntirish mumkin: Algoritmning asosiy g’oyasi: . Maxsus algoritmga ko’ra, kirish massivi pastki massivlarga bo’linadi. . Har bir pastki qator qo’shish tartibi bo’yicha tartiblangan. . Tartiblangan pastki qatorlar o’zgartirilgan birlashma tartiblash yordamida bitta massivga yig’iladi. 3
1.1. Pastga tushadigan yugurishlar va minimal yugurish hajmi. Amaldagi tushunchalar: . N-kirish massivining o’lchami . run-kirish massividagi tartiblangan pastki qator.Bundan tashqari qat’iy ravishda ko’tarilish yoki qat’iy ravishda tushish buyuriladi. . minrun - yuqorida aytib o'tilganidek, algoritmning birinchi bosqichida kirish massivi pastki massivlarga bo'linadi. minrun - bunday pastki qatorning minimal hajmi. Bu raqam N raqamidan ma'lum bir mantiq bo’yicha hisoblanadi. I.1.1-rasm minRUNni hisoblash Minrunni hisoblash tartibi: Minrunlar soni N ga qarab quyidagi printsiplarga asoslanib aniqlanadi : 1.U juda katta bo’lmasligi kerak, chunki qo’shish tartiblash minrun o’lchamli kichik massivga keyinroq qo’llaniladi va u faqat kichik massivlarda samarali bo’ladi. 2.U juda kichik bo'lmasligi kerak, chunki pastki qator qanchalik kichik bo’lsa, algoritmning oxirgi bosqichida pastki qatorlarni birlashtirishning ko’proq takrorlanishi kerak bo'ladi. 3.N\minrun 2 ning (yoki unga yaqin) kuchi bo’lsa yaxshi bo’lardi . Bu talab pastki massivlarni birlashtirish algoritmining taxminan teng o’lchamdagi pastki massivlarda eng samarali ishlashi bilan bog'liq. Shu nuqtada, algoritm muallifi o’z tajribalariga murojaat qiladi, bu 1- band minrun > 256 bilan buzilganligini, 2-band minrun < 8 bilan buzilganligini va diapazondagi qiymatlardan foydalanish eng samarali ekanligini ko’rsatdi ( 32;65). Istisno, agar N < 64 bo’lsa, minrun = N va timsort oddiy kiritish tartibiga aylanadi. Hozirgi vaqtda minrunni hisoblash 4
algoritmini sharmanda qilish oson: biz N dan eng yuqori 6 bitni olamiz va qolgan eng kam ahamiyatli bitlarda kamida bitta nolga teng bo’lmagan bo’lsa, bittasini qo’shamiz. Misol kodi quyidagicha ko’rinadi: int GetMinrun(int n) { int r = 0; /* agar o‘zgartirilgan bitlar orasida1 nolga teng bo‘lmagani bo‘lsa 0 ga aylanadi*/ while (n >= 64) { r |= n & 1; n >>= 1; } return n + r; } Quyi massivlarga ajratish va ularni saralash. Shunday qilib, ushbu bosqichda bizda kirish massivi mavjud, uning o’lchami N va hisoblangan minrun soni . Ushbu bosqich uchun algoritm: 1.Joriy element ko’rsatkichini kirish massivining boshiga qo’yamiz. 2.Joriy elementdan boshlab, ishga tushirish uchun kirish massivini qidiring (tartib qilingan pastki qator). Ta’rifga ko’ra, bu yugurish aniq joriy elementni va keyingi elementni o’z ichiga oladi, ammo bundan keyin - omadli. Agar hosil bo’lgan pastki qator kamayish tartibida tartiblangan bo’lsa, biz elementlarni o’sish tartibida bo’ladigan tarzda qayta joylashtiramiz (bu oddiy chiziqli algoritm, biz elementlarni almashtirib, ikkala uchidan o’rtasiga o’tamiz). 3.Agar joriy yugurish a hajmi minrun dan kichik bo’lsa,topilgan yugurishdan keyingi elementlarni minrun — size(run) miqdorida olamiz.Shunday qilib, chiqishda biz minrun yoki undan ortiq o’lchamdagi pastki qatorni olamiz, uning bir qismi (va ideal holda, hammasi) buyurtma qilinadi. 4.Ushbu pastki qatorga qo’shish tartibini qo’llang. Pastki qatorning o’lchami kichik va uning bir qismi allaqachon buyurtma qilinganligi sababli, saralash tez va samarali bo’ladi. 5.Joriy elementning ko’rsatkichini pastki qatordan keyingi elementga o’rnatamiz. 6.Agar kirish massivining oxiriga yetib borilmasa,2-bosqichga o’ting, aks holda ushbu bosqichni tugating. 5