CHontak saralash. Kop hollarda O(n log n) dan kam bolgan tartiblash vaqtini olish mumkin, lekin tartiblanayotgan kalitlar haqida qoshimcha malumot kerak boladi.
4-misol. Faraz qilamiz, kalit qiymatlar 1 dan to n gacha bolgan butun sonlar bolib hisoblansin, ular takrorlanmaydi va tartiblanayotgan elementlar soni ham n ga teng. Agar A va V orqali aggau[1..n] of recordtype massivni ifodalansa, tartiblanishi kerak bolgan n ta element birinchi A massivda joylashadi, u holda V massivga kalitlarni quyidagi qiymatlarda navbatma-navbat joylashtirib borishni tashkillashtirish mumkin:
for i:= 1 to n do
V[A[i].key]:= A[i]; (4)
Bu kod A[i] element V massivning qaerida joylashishini hisoblab beradi. Butun bir sikl O(n) vaqt tartibiga ega va barcha kalitlar qiymatlari turli xil bolganda va 1 dan to n intervaldagi butun sonlar bolganda yaxshi ishlaydi.
O(n) vaqtda A massiv elementlarini, lekin ikkinchi V massivni ishlatmasdan tartiblaydigan boshqa usullar ham mavjud. Navbatma-navbat A[1], ..., A[n] elementlarga murojaat qilamiz. Agar A[i] yacheyka j kalitga ega bo‘lsa va j≠i bo‘lsa, u holda A[i] va A[j] yacheykalardagi yozuvlar o‘rnini almashtiradi. Agar bu almashtirishdan keyin A[i] yacheyka k kalitga ega bo‘lsa va k≠i bo‘lsa, u holda A[i] va A[k] orasida orin almashtirishlar boladi va h.k. Har bir orin almashtirish hech bolmaganda bitta yozuvni kerakli tartibda joylashtiradi. SHuning uchun A massiv elementlarini tartiblaydigan ushbu algoritm O(n) bajarilish vaqtiga ega boladi.
for i:= 1 to n do while A[i].key <> i do swap(A[i], A[A[i].key]); (4) dastur bu «chontak» saralashga oddiy misol, bu erda aniqlangan qiymatli kalitlarni saqlash uchun «chontak» lar ishlatadi. Berilgan yozuv r qiymatli kalitga ega bolsa, u holda bu yozuvni yozuvlar uchun «chontak»ga joylashtiramiz. Dasturda (4) «chontak» bolib V massivning elementlari hisoblanadi, bu erda B[i]
i qiymatli kalitga ega bolgan yozuvlar uchun «chontak». «Chontak» sifatidagi massivlarin faqat oddiy hollarda ishlatish mumkin (bitta «chontak»da bittadan ortiq yozuv bolmagan taqdirda). Bundan tashqari, massivlarni «chontak» lar sifatida ishlatishda «chontak» ichida elementlarni tartiblash zaruriyati paydo bolmaydi, chunki bitta «chontak» bittadan kop bolmagan yozuvdan iborat, algoritm shunday yaratilganki, massivdagi elementlar togri tartibda joylashadi.
Lekin umumiy holda bitta «chontak» da bir nechta yozuvlarni saqlash, shuningdek bir nechta «chontak»larni bittaga birlashtirish mumkinligini etiborga olish kerak. Aniqlik uchun A massiv elementlari recordtype malumotlar turiga, yozuv kalitlari esa keytype turiga ega deb hisoblaymiz. recordtype turidagi royxat elementlarini listtype (royxat turi) malumotlar turi orqali ifodalab olamiz. Listtype turi royxatning ixtiyoriy turi bolishi mumkin, lekin hozirgi holatda bizga koproq boglangan royxatlar togri keladi. Royxatning umumiy uzunligi fiksirlangan va n ga teng deb faraq qilishimiz mumkin.
Shuningdek array[keytype] of listtype turidagi V massiv ham kerak. Bu royxatlarni saqlovchi massiv «chontak»i bolib hisoblanadi. V massivning indeksi keytype malumotlar turiga ega, chunki bu massivning har bir elementi kalitning bitta qiymatiga mos keladi. SHunday qilib, 9-dasturni umumlashtirish mumkin, chunki endi «chontak»lar keraklicha hajmga ega. «Chontak»larni qanday birlashtirish mumkinligini korib chiqamiz. a1, a2, .... ai va b1, b2,
bj royxatlar ustida royxatlar konkatenatsiyasi operatsiyasini bajarish kerak, natijada a1, a2, .... ai i b1, b2,
bj royxatga ega bolamiz. L1L2, royxatlarning birlashmasidan hosil bolgan L1 royxatni egallovchi konkatenatsiya CONCATENATED(L1, L2) operatsiyasini tadbiq etish uchun royxatlarning ixtiyoriy ifodalanishidan foydalanish mumkin.
Royxat sarlavhalariga qoshishda konkatenatsiya operatori yanada samarali bajarilishi uchun royxatning oxirgi elementlariga korsatkichlarni ishlatish mumkin.
2.2 2-rasmda Punktir chiziqlar bilan L1 i L2 royxatlarni bitta L1 royxatga konkatenatsiyasida ozgargan korsatkichlar korsatilgan.
Endi yozuvlarning «chontak» saralashining dasturin tuzsak boladi. Bu dastur
5-dasturda korsatilgan, dastur royxatlar ustida bajariladigan bazaviy operatorlarni ishlatib tuzilgan.
5-dastur. binsort dasturi (chontak saralash) procedure binsort;
{A massiv elementlarini tartiblaydi, tartiblangan royxatni V[lowkey]
«chontak»ga yozadi} var i: integer; v: keytype; begin
{"chontak"ka yozuvlarni kiritish boshlanadi}
for i:= 1 to n do
{ A[i] elementni «chontak» boshiga joylashtirish}
INSERT(A[i], FIRST(B[A[i].key]), B[A[i].key]);
for v:= succ(lowkey) to highkey do (4) CONCATENATE(B[lowkey] , B[v]) end; { binsort }
2.2 2-rasm. Boglangan royxatlar konkatenatsiyasi
Do'stlaringiz bilan baham: |