Piramidali Tartiblash
BUXORO DAVLAT UNIVERSITETI
FIZIKA-MATEMATIKA FAKULTETI
AMALIY MATEMATIKA YONALISHI
ALGORITMLAR NAZARIYASI FANIDAN
MAVZU: Piramidali Tartiblash
Bajardi: Suvonov Nurbek
Rahbar: Shafiyev T.
MUNDARIJA:
Mavzuning dolzarbligi
Bu ishda ikki vazifa algoritmlarning dastur effektivligiga qanday tasir etishi va turli xil algoritmlarning analizini organishdir. Bazi bir zamonaviy dasturiy taminotlarga etibor qilsak, ularning ayrim tuzuvchilari na dasturning ishlash effektivligiga va na xotiraning aql bilan ishlatilishiga etibor qilishadi. Ularning fikricha, dastur kop joy olsa, foydalanuvchi qoshimcha xotira sotib olishga majbur boladi yoki yangi tezroq ishlaydigan komyuter sotib oladi.
Lekin kompyuterlarning tezligi cheksiz kattalashmaydi. U simli kabelda elektronlarning harakat tezligi bilan, optik kabellarda yoruglikning tarqalish tezligi bilan va hisoblashda qatnashadigan kompyuterlar orasidagi aloqa kanallarining komutativlik tezligi bilan chegaralanadi. Boshqa cheklovlar kompyuter imkoniyatlari bilan bogliq emas, balki qoyilgan masalaning murakkablik darajasiga bogliq. Shunday masalalar mavjudki, ularni yechish uchun eng tez ishlaydigan algoritmlar qollanilganda ham odam umri yetmaydi. Bu masalalar orasida yaqinroq javob olish uchun algoritmlar kerak boladigan, juda zarurlari ham mavjud.
Piramidali tartiblashga kirish
Piramidali tartiblashning asosiga piramida deb nomlangan Binarli daraxtning maxsus tipi kiradi. Bunday daraxtning har qanday daraxtchasiga ildizning ahamiyati uning avlodlariddan har birining ahamiyatidan kora kattaroq. Har bir tugunning bevosita avlodlari tartiblashtirilmagan, shuning uchun bazida chap bevosita avlod ongidan kora koproq ahamiyatga ega bazida esa aksincha. Piramida ozicha toliq daraxtni tasvirlaydi, unga yangi darajaning toldirilishi faqat oldindagi darajaning toliq toldirilganidan keyin boshlanadi. Hamma tushunchalar esa bitta darajada chapdan ongga toldiriladi.
Tartiblash piramidaning qurilishidan boshlanadi. Shunda royxatning maksimal elementi daraxtning tepasida malum boladi. Chunki tepa ildizlari albatta kamroq bolishi kerak. Keyin esa ildiz royxatning oxirgi elementi bolib yoziladi, piramida esa olib tashlangan maksimalli element bilan qayta shakllanadi, natijada, ildizda miqdori boyicha ikkinchi element malum boladi. U royxatcha nusxalanadi protsedura hamma elementlar royxatga qaytmaguncha takrorlanadi. Tegishli algoritmning korinishi shunday
Piramidani tuzish:
for i=1 to N do
piramida ildizini royxatga nusxalash
piramidani qayta shakllantirish
end for
Bu algoritmda bazi bir detallarni aniqlash lozim. Biz piramidaning tuzilishi va qayta shakllanishining protsedurasi nimadan iborat ekanligini aniqlashimiz mumkin: bu esa algoritmni natijalashga tasir qiladi.
Bizni algoritmni amalga oshirish qiziqtiradi. Binarli daraxtni yaratishda nakladli satrlar royxatining oshishi bilan osadi, lekin royxat bilan band bolgan orindan foydalanish mumkin. Oxirgidan oldingi darajadagi bitta tugundan tashqari har bir ichki tugunda ikkita bevosita avlod borligini hisobga olsak, royxatni piramidaga “qayta qurish” mumkin. Keying aks ettirish talab qilingan piramidani shakllantirishga imkon beradi. g raqami bilan royxat elementining bevosita avlodlarini 2i va 2i+1 vaziyatga yozamiz. Shuni koramizki, hamma avlodlar vaziyatlari natijasida har xil boladilar, biz bilamizki, agar 2i>N bolsa, unda g tuguni barg bolib qoladi, agar 2i=N bolsa, unda g tugunda baravar bitta avlod boladi. 1-rasmda piramida va uning royxatli taqdimi kosatilgan.
1-rasm. Piramida va uning royxatli korinishi
Piramidani qayta shakllantirish.
Ildizdan koproq elementning nusxalashida ildizli tugun ozod bolib qoladi. Biz bilamizki, unga ikkita bevosita avlodlardan kattasi tushishi kerak va biz uning orniga kim turishini korib chiqishimiz kerak. Shunda piramida toliq daraxtga iloji borich yaqin qolipga keladi. Piramidaning qayta shakllanishini biz eng kop elementdan uning pastki darajasida boshlaymiz. Natijada daraxtning pastki qismidan tugunlar bab-baravar yigishtiriladi. Agar buni kuzatmasak, hamma katta ahamiyat piramidaning bir qismida bolsa, unda piramida, balanslashadi va algoritm natijaviyligi tushadi. Natijada mana nimani olamiz:
FixHeap (list, root, bound)
List tartiblanadigan royxat/piramida
Root piramida ildizining raqami
Key piramidaga qoyiladigan kalit qiymati
Bound piramidaning ong chegarasi(nomer)
Vacant=root
While 2*vacant<=bound do
LargerChild = 2*vacant
// bevosita avlodlarning ikkitasidan eng kattasini qidirish
If (largerChild < bound) and (list [largerChild + 1])>
List [largerChild + 1]) then
largerChild = largerChild + 1
end if
// bugungi avloddan yuqoriroq kalit topiladimi?
If key > list [largerChild] then
//ha, sikl tugaydi
Break
Else
// yoq, bevosita katta avlod
// kotarish lozim
List [vacant] = list [largerChild]
Vacant = largerChild
End if
End while
List [vacant] = key
Bu algoritm parametrlariga qaraganda shunday savol paydo bolishi mumkin. Nima uchun ozgaruvchi root kerak? Haqiqatan ham protsedura rekursiv emas ekan. Piramida ildizi doima birinchi element bolishi kerak, lekin biz koramizki bu qoshimcha parametr piramidani pastdan yuqoriga qurishga imkon beradi. Ong chegaraning ahamiyati piramidadan royxatga elementlarni kochirishda piramidaning qisilishi uchun kiritiladi.
Piramidani qurish
FixHeap funksiyasiga bizning yondoshishimiz piramidaning boshlangich holatini shakllantirishga imkon beradi. har qanday ikkita qiymatlarni ozod tugunning barglari deb tushunishimiz mumkin. Chunonchi hamma elementlar barglar bolib hisoblanadilar, royxatning ikkinchi yarmi bilan nimadir qilish zaruriyati yoq. biz barglardan oddiy kichik piramidalar qurishimiz mumkin, keyin esa royxatga hamma qiymatlar tushmaguncha ularni sekin asta birga terish kerak. Keyingi davr bu protsudurani amalga oshirishga imkon beradi.
For i = N/2 down to 1 do
FixHeap(list, i, list[i], N)
End for
Natijaviy algoritmi
Yozilgan hamma bolaklarni birga qoshib, piramida royxati elementlarini kochirish boyicha kerakli operatsiyalarni amalga oshirib, natijaviy algoritmni olamiz.
for i=N/2 down to 1 do
FixHeap(list,i,list[i],N)
end for
for i=N down to 2 do
max=list[1]
FixHeap(list,l,list[i] ,i-l)
list [i]=max
end for
Eng yomon holat tahlili
FixHeap protsedurasining tahlilidan boshlaymiz. Chunonchi algoritmning qolgan qismi asosida quriladi. Piramidaning har bir darajasida algoritm ikkita bevosita avlodlarni, shuningdek bevosita avlodlar va kalitdan kattasini taqqoslaydi. Bu degani D chuqurlikdagi piramida uchun taqqoslash soni 2D2 oshmaydi. Piramidaning tuzilishi bosqichida biz avval oxirdan ikkinchi darajaning har bir tuguni uchun FixHeap protsedurani chaqirtiramiz. Yani qurilgan piramidalar 1 chuqurlikka egalar. Keyin u pastdan uchinchi darajaning har bir tuguni uchun chaqirtiriladi. Yani piramidalar 2 chuqurlikda quriladi. Oxirgi qadamda ildiz darajasida [log2N] chuqurlikda piramida shakllangan boladi. Bizga faqat har bir otishda FixHeap protsedurasi tugunlarining ham 1 soni uchun chaqirtirish kerakligini sanash qoldi. Tugunning ildizi darajasida uzel bitta, ikkinchi darajasida esa unda ikkita ogli boladi. Keyingi darajaning tugunlari soni torttadan oshmaydi. Keyingisida esa sakkizdan. Bu natijalarni birga chiqarib quyidagilarni olamiz:
Bu esa quyidagini beradi:
D log2N ni qoyib quyidagilarni olamiz:
Shu uchun piramidani qurish bosqichi royxat elementlarining soni boyicha chiziqli murakkablikka egadir.
Endi algoritmning asosiy davrini korib chiqamiz. Bu siklda biz piramidadan bitta elementni yoq qilamiz, keyin esa FixHeap protsedurasini chaqiramiz. Davr piramidada bitta element qolguncha bajariladi. Elementlarning soni har bir otishda bittaga kamayadi, piramidaning chuqurligi qanday ozgaradi? Biz aytib otganimizdek hamma piramidaning chuqurligi [log2N] ga teng. Shu uchun agar piramidada K tugunlari qolgan bolsa, unda uning chuqurligi [log2K] ga teng. Taqqoslash sonlari esa 2 marta kop. bu degani eng yomon vaziyatda siklda quyidagi operatsiyalar bajariladi:
Lekin bu yigindi uchun bitta standart ifoda yoq.
Bu tosiqni qanday otish mumkinligini koramiz. k=1 da [log2k] ga egamiz. K 2 yoki 3 ga teng bolganda [log2k]=1 boladi. Keyinchalik 4 dan 7 gacha k da [log2k]=2 va 8 dan 15 gacha k da [log2k]=3 boladi. Shuni sezamizki, har bir vaziyatda j natijasi argumentning Y qiymatga ega boladi. Bu qoida piramidaning hamma darajalari uchun rioya qilinadi. Undan agar utoliq bolmasa, oxirgisi istisno qilinadi. Bu bosqichda N-2(log2N) ta element boladi.
Shu uchun oxirgi tenglikni shu shaklda kochirish mumkin:
Bu esa quyidagini beradi:
D log2N ni qoyib quyidagilarni olamiz:
Yakunlovchi natijani olish uchun sikl va qurish protseduralarining murakkabliklarini qoshish kerak. Natijada quyidagilarga ega bolamiz:
Orta holat tahlili
Orta vaziyatning tahlili uchun piramidali tartiblashga biz noodatiy usulni qollaymiz. Eng yaxshi vaziyatdan boshlaymiz. Unda oxirgi massivda qiymatlar teskari tartibda joylashgan. Bunday joylashish togri piramidani avtomatik ravishda berishini tekshirish murakkab emas. Shuning uchun FixHeap protsedurasining har birini chaqirtirilishida elementlar togri joylashganligini tasdiqlovchi baravar 2 ta taqqoslash bajariladi. Chunonchi FixHeap protsedurasi taxminan elementlarining yarmisi uchun chaqirtiriladi. Shunda ham bir chaqirish ikkita taqqoslashni talab qiladi. Piramidani qurish bosqichida N ga yaqin, eng yomon holatda qancha bolsa, shuncha. taqqoslash bajariladi.
Shuni aytib otamizki elementlarning boshlangich joylashishiga bogliq bolmagan boshlangich bosqichining natijalari doim piramida boladi. Shu uchun for siklining har bir vaziyatida eng yomon holatdagi kabi unda ham shuncha marta bajariladi: tartiblash royxatini olish uchun bizga piramidadan har vaqtda uni qayta shakllantirib, hamma elementlarini olish kerak. Eng yaxshi holatda piramidali tartiblash N+N logN ta taqqoslash talab qiladi. Uning murakkabligi O(NlogN) boladi.
Shunday qilib, piramidali tartiblash uchun eng yaxshi va eng yomon holatlar murakkabliklari O(NlogN)ga teng. Bu shuni anglatadiki, orta holat murakkabligi ham O(NlogN) ga teng bolishi shart.
Piramidali tartiblashning abstrakt shakli
Bu bolimda biz piramidalli deb nomlangan tartiblash algoritmini korib chiqamiz uning bajarish vaqti yomon holatda ortadagi kabi O(NlogN) tartibga ega. Bu algoritmni kopgina INSERT, DELETE, EMPTY va MIN operatorlaridan foydalanib, abstrakt (umumlashtirilgan) shaklda yozish mumkin. Tartiblangan elementlarni saqlash uchun foydalanadigan rekursiv (yozuv tipi) kopgina elementlari tartiblashga tegishli bolgan elementlar royxatini L orqali belgilaymiz. MIN operatori yozuvlarining kalitli maydonida qollaniladi, yani MIN(S) kalitning minimali ahamiyati bilan kopgina S dan yozuvni qaytaradi. Quyida biz piramidali tartiblash algoritmida qayta tuzadigan tartiblashning abstrakt algoritmi korsatilgan.
1.1-listing. Tartiblashning abstrakt algoritmi
O(logN) bajarish vaqti bilan koplab operatorlarni amalga oshirishga yordam beruvchi ikki-uch daraxt kabi shunday malumotlarning har xil tuzilishlarini korsatadilar. Agar L royxati N elementlarga ega bolsa, unda bizning abstraktli algoritm INSERT operatorlarining n bajarilishini, MIN operatorlarining n bajarilishini, EMPTY operatorlarining n+1 bajarilishini talab qiladi. Shunday qilib, agar malumotlarning togri keladigan tuzilishidan foydalansak, algoritm bajarilishining umumiy vaqti O(NlogN) tartibga egadir. Qisman tartiblangan daraxtning berilgan tuzilishi berilgan algoritm uchun togri keladi. Qisman tartiblangan daraxtni biz toda korinishida A massivga taqdim etish mumkin, ularning elementlari
tengsizlikka boysunadilar. Agar i indeksi bilan “ogillarni” quyidagi kabi 2i va 2i+1 indekslari bilan elementlar intepritatsiya qilinsa, unda A massivi balanslangan ikki karrali daraxtni shakllantiradi. Unda ota-onalar kalitlarning qiymati hech qachon ogillari kalitlari qiymatidan ustun kelmaydi.
Tartiblangan daraxt O(logN) bajarishi vaqti bilan INSERT va DELETE, MIN operatorlarini qollaydi. Lekin qisman tartiblashtirilgan daraxt bilan DELETE umumiy operatorini bajarish mumkin emas. Doimo yomon holatda yoq qilishning chiziqli vaqtini talab qiluvchi alohida element topiladi. Shu sababli kalitlarning minimal qiymatlariga ega bolgan elementlar faqat yoq qilinadi. Shu uchun (4) va (6) satrlarning elementini qaytaradigan bitta DELETEMIN operatori bilan birlashtirish mumkin. Shunday qilib, qisman tartiblangan daraxtning berilgan tuzilishidan foydalanib O(NlogN) vaqtda tartiblashni abstrakt algoritmni bajarish mumkin. Yoq qilinadigan elemenlardan qochish uchun algoritmda yana bitta ozgarishni qilish lozim. Xato (i<n) elementlariga faqat i ga ega bolganda ham kopgina S doimo A massivining yuqori qismida toda shaklida qisman tartiblangan daraxt uchun eng kichik element doimo A[1] uyasida saqlanadi. Kopgina S dan yoq qilingan elimentlarni tezkor tartibda tartiblangan Ai [i+1],…., A[n] uyachalarda saqlash mumkun edi ,yani A[i+1]>=]A[i+2]>=,…>=A[n] tengsizliklar bajarilishi uchun chunonchi A[1] vaA[i] elimentlar ichida kichik bolibxisoblansa unda DELETEMIN operatorining natijaviyligini oshirish uchun A[1] va A[i] odiy joylashtirishmumkun A[i+1](eliment A[i+1]dan kura kichik emas u kopgina Sdan oldingi qadamda kabi yoq qilingan edi ) unda kamayib ketish tartibida xilga ajratib A[i], ..,A[n] ketma ketligini olamiz . Endi A[i]…A[i-1] elimentlarning joylashishi bilan shugilanshi kerak .
Chunonchi A[1] yangi eliment qisman tariblashtirilgan daraxtning tuzilishini bozishi sababli uni DELETEMIN muolajasida qiladioganday daraxt shohlari shohlari boyicha pastga “yetalash” kerak Bu yerda maqsad bu mualajadan tashqari aniqlangan A massivdan operatsiya qilinadigan pushdowndan (pastga italash)dan biz foydalanamiz . Joyini almmashtirishning ketma-ketligi yordamini berilgan muolaja A[first] elimentni kerakli vaziyatgacha daraxt boyicha pastga “yitalaydi”. Tartiblashda bizning algoritmimizning vazyatini qisman tartiblashtirilgan daraxtni tiklash uchun first=1 uchun pushdown muolajasini chaqirtirish kerak .
1.2 listing. Pushdown protsedurasi
{A(first) …,..A(last) elimentlari qisman tartiblashtirgan daraxtdan iborat A(first) va uning ogillaridan tashqari pushdown muolajasi var qismi tartiblangan daraxtni tiklaydi}
{ A[first] ning vaziyatini korsatadi}
{ r vaziyatida element 2*r vaziyatida birta ogilga ega}
r:= last { (while) siklidan muddatdan oldingi chiqish.}
End
Else {r vaziyatida eliment 2*r va 2*r+1 vaziyatlarida ikkita oglilga ega}.
{joyini r-vaziyatda chap ogli bilan elimentning almashtirish.}
{ r-vaziyatda ong ogli bilan elementning almashtirish}
else {r-vaziyatida eliment qisman tartiblashtirilgan daraxtni bozmaydi}
r:=last {(while) siklidan chiqish.}
(4) va (6) satirlar bilan shugulanamiz satirning minimally elimentning tanlovi oddiy- bu faqat A[1] elimentidir.
(5)satrda pechat operatorini chiqarish uchun biz hozirgi todada A[1] va A[i] elementlarining orinlarini almashtirdik.Hozirgi todadan minamalli elementni yoq qilish shuningdek oson. Hozirgi todaning uchini korsatuvchi i kursorni birga kamaytirish kerak. Keyin esa A[1]…..,A[i-1]todaning qisman tartiblashtirgan daraxtda tartibni tiklash uchun pushdown muolajasini chaqirtirish kerak.
(3) satrida tekshirish orniga s bosh bolib hisoblanmaydimi,yoqmi hozirgi todaning oxiriga korsatuvchi i kursor ahamiyatini tekshirish mumkin. Endi esa satr(1)(2) satrlarda operatorlar bajarilishining usulini korib chiqish qoldi.Boshdan boshlab L royxati elemantlarini A massivga ixtiyoriy tartibda joylashtirish mumkin.
Birinchi qiqisman tartiblashtirilgan daraxtni yaratish uchun hamma j=n/2,n/2-1,… uchun pushdown (j,n) muomalajasini ketma-ket chaqirtirish kerak.Pushdown (j,n) muolajani chaqishdan keyin quriladigan daraxtning avval tartiblashtirgan qismida tartib buzilmaydi,chunki daraxtga qoyiladigan yangi element tartibga yangi buzulishlarni kiritmaydi, chunonchi u faqat ozining “kichik” ogli bilan joyini almashtiradi.heapsort muolajasining toliq kodi(piramidali xilga ajratish) korsatilgan.
1.3 listing. Piramidali tartiblash protsedurasi.
{A[1] …A[n] massiv elementlarini kamayish tartibida xilga ajratadi }
var i ;integer
{A massivida kursor}
begin
{qisman tartiblashtirilgan daraxtni yaratish}
{todadan minimal elementni yoq qilish}
{Qisman tartiblashtirilgan daraxtni tikash}
end
end; (heapsort)
Piramidali tartiblash abstrakt shaklining tahlili
Avvalo pushdovn pratsedurasining bajarish vaqtini baholaymiz While davrining qismi(yani bu davirning alohida interatsiyasi)
Hisobga olingan vaqtda bajariladi har bir interatsiyadan kiyin uzgaruvchi r hech bolmaganda oz ahamiyatini ikki baravar kupaytiradi .shuning uchun r ning boshlangch ahamiyati first gat eng, I interatsiyadan kiyin r>=firs*2i.lost/2 tengsizligi bajarilsa bu shart bajariladi
(1)
Oxirgi tengsizlikni shunday kuchirish mumkun:
Binobarin ,pushdown protsedurasida while davri iteratsiyalar soni log(last/first) dan oshmaydi.
Chunonchi, first 1 va last n, unda (1) dan O(log n) dan kora katta bolmagan tartib boyicha 1.3 listingning (2) va (5) satrlarda pushdown protsedurasining har bir chaqiruviga vaqt sarf qilinardi. Aftidan, (1), (2) satrlarning for sikli n/2 marta bajariladi. Shuning uchun bu sikl bajarilishining umumiy vaqti O(n log n) tartibga egadir. (3) va (5) satrlarda davr n-1 marta bajariladi. Binobarin, hamma joyda almashtirishni bajarishga (4) satrda O(n) tartibining vaqti sarf qilinadi, qisman tartiblangan daraxtning tiklashiga (5) satrda O(n log n). Shu yerdan kelib chiqadiki, (3)-(5) satirlarda davrini bajarishning umumiy vaqti O(nlogn) tartibga ega va shunday .
Xulosa
Heapsort mualajasi eng yomon vaziyatda O(nlogn) tartibning bajarish vaqtiga ega, ortacha uning tez xilga ajratishdan kora vaqti ancha yomonroq ush tartibga ega bolsa ham Piramidali tartiblash nazariy rejada qiziqdir chunonchi bu O(nlogn) bajarish vaqti eng yomon vaziyatda ega bolgan biz tomondan birinchi korib chiqilgan algoritimdir. Amaliy vaziyatlarda bu algoritim ruyxatining ajralishi emas balki faqat eng kichik k elimentlarni tanlab olish kerak bolganda foydalidir , shunda k da esa n ancha kam . oxirgi xulosada (1),(2) satirlarda haqiqatda davirning bajarish vaqti O(n) tartibga egadir. Agar (3)-(5) davirning faqat k itiratsiyasiyalarini qilish kerak bolsa , undaO(klogn) tartibning vaqti shunga sarf qilinadi .Shu uchun minimal elimentlarning k tanlovi heapsort pratsedura O(n+klogn) tartibida bajaradi. Shu erdan kelib chiqadiki, k<=n/logn dab u operatsiya bajariladi O(n) tartibda vaqt talab qilinadi.
Foydalanilgan adabiyotlar:
- Дж. Макконел
Основы современных алгоритмов
М: Москва. 2001
- А. Ахо, Дж. Хопкрофт, Дж. Ульман
Построение и анализ вычислительных алгоритмов
М.: Мир, 1979 - А. Ахо, Дж. Хопкрофт, Дж. Ульман
Структуры данных и алгоритмы
М.: Вильямс, 2000 - М. Гэри, Д. Джонсон
Вычислительные машины и труднорешаемые задачи
М.: Мир, 1982 - Емеличев В.А
Лекции по теории графов
М.: Наука, 1990 - Т. Кормен, Ч. Лейзер, Р. Ривест
Алгоритмы. Построение и анализ
МЦНМО, Москва, 1999 - Кристофидес Н
Теория графов. Алгоритмический подход
М.: Мир, 1978 - Л. Ловас, М. Пламмер
Прикладные задачи теории графов
М.: Мир, 1998 - Липский В
Комбинаторика для программистов
М.: Мир, 1988 - Новиков Ф.А
Дискретная математика для программистов
СПб.: Питер, 2001 - Э. Рейнгольд, Ю. Нивергельт, Н. Део
Комбинаторные алгоритмы
М.: Мир, 1980
PAGE \* MERGEFORMAT 1
Piramidali Tartiblash