Navbat - Queap

$ K = 6 $ va $ n = 9 $ bo'lgan Queap Q

Yilda Kompyuter fanlari, a pog'ona a ustuvor navbat ma'lumotlar tuzilishi. Ma'lumotlar tarkibi o'zboshimchalik bilan elementlarni qo'shish va o'chirishga, shuningdek, eng ustuvor elementni olishga imkon beradi. Har bir o'chirish kerak amortizatsiya qilingan vaqt olib tashlangan narsaga qaraganda tuzilishda uzoq vaqt bo'lgan narsalar sonidagi logaritmik. Qo'shimchalar doimiy amortizatsiya qilingan vaqtni oladi.

Ma'lumotlar tarkibi a dan iborat ikki marta bog'langan ro'yxat va a 2-4 daraxt ma'lumotlar tuzilishi, ularning har biri minimal ustuvor elementni kuzatib borish uchun o'zgartirilgan. Tuzilmaning asosiy ishi - yangi kiritilgan elementlarni ikki baravar bog'langan ro'yxatda saqlash, bu o'chirilgandan so'ng ro'yxat elementlaridan birini olib tashlamaguncha, ularning barchasi 2-4 daraxtga ko'chiriladi. 2-4 daraxt o'z elementlarini odatiy ustuvorlik tartibida emas, qo'shilish tartibida saqlaydi.

Ma'lumotlarning tuzilishi ham, uning nomi ham o'ylab topilgan Jon Iakono va Stefan Langerman.[1]

Tavsif

Navbat - bu O (1) amortizatsiya qilingan vaqtga elementlarni qo'shadigan va O (log (k + 2)) agar mavjud bo'lsa k qazib olinadigan elementdan ko'ra ko'proq vaqt davomida uyumda bo'lgan narsalar. Kuyruğda navbat xususiyati deb nomlangan xususiyat mavjud: elementni qidirish vaqti x O (lg.) q(x)) qaerda q(x) ga teng n − 1 − w(x) va w(x) - qidirish, qo'shish yoki yo'q qilish kabi operatsiyalar orqali erishilgan aniq elementlarning soni. q(x) shu vaqtdan beri qancha elementga kirilmaganligi bilan belgilanadi xoxirgi kirish. Darhaqiqat, navbatdagi xususiyat splay daraxtining ishlaydigan to'plam xususiyatining to'ldiruvchisi: elementni qidirish vaqti x O (lg.) w(x)).

Kuyrukni ikkita ma'lumotlar tuzilishi bilan ifodalash mumkin: ikki barobar bog'langan ro'yxat va 2-4 daraxtning o'zgartirilgan versiyasi. Ikki marta bog'langan ro'yxat, L, insert va find-min amallari ketma-ketligi uchun ishlatiladi. Ro'yxat ko'rsatkichni ro'yxatdagi minimal elementga saqlaydi. Element qo'shish uchun x ro'yxatlash l, element x ro'yxatning oxiriga qo'shiladi va elementda bir oz o'zgaruvchan x biriga o'rnatildi. Ushbu operatsiya element ro'yxatda yoki 2-4 daraxtda ekanligini aniqlash uchun amalga oshiriladi.

O'chirish jarayoni sodir bo'lganda 2-4 daraxt ishlatiladi. Agar buyum bo'lsa x allaqachon daraxtda T, element 2-4 daraxtni o'chirish operatsiyasi yordamida o'chiriladi. Aks holda, element x ro'yxatda L (bit o'zgaruvchisi o'rnatilganligini tekshirish orqali amalga oshiriladi). Ro'yxatda saqlangan barcha elementlar L keyin har bir elementning bit o'zgaruvchisini nolga o'rnatib, 2-4 daraxtga qo'shiladi. x keyin olib tashlanadi T.

Kuyruk qidiruv daraxtidan emas, balki faqat 2-4 daraxt tuzilishi xususiyatlaridan foydalanadi. O'zgartirilgan 2-4 daraxt tuzilishi quyidagicha. Ro'yxat deylik L quyidagi elementlar to'plamiga ega: . Yo'q qilish operatsiyasi chaqirilganda, elementlarning to'plami L keyin 2-4 daraxtning barglariga shu tartibda qo'shiladi, cheksiz kalitni o'z ichiga olgan qo'g'irchoq barg davom etadi. Ning har bir ichki tuguni T ko'rsatgichga ega , bu pastki daraxtning eng kichik elementiga ishora qiladi v. Yo'lda har bir ichki tugun P ildizdan to ko'rsatgichga ega , bu eng kichik kalitga ishora qiladi . The yo'lda har bir ichki tugunning ko'rsatgichlari P e'tiborga olinmaydi. Kuyrukda ko'rsatgich mavjud , bu eng kichik elementga ishora qiladi T.

Quaplarni qo'llash noyob ustuvor voqealar to'plamini va qayta ishlash uchun eng yuqori darajadagi hodisalarni ajratib olishni o'z ichiga oladi.

Amaliyotlar

Ruxsat bering minL ikki marta bog'langan ro'yxatdagi minimal elementga ishora qiluvchi ko'rsatkich bo'ling L, 2-4 daraxtda saqlanadigan minimal element bo'ling, T, k saqlangan elementlarning soni bo'lishi Tva n queapda saqlanadigan elementlarning umumiy soni Q. Amaliyotlar quyidagicha:

Yangi (Q): Yangi bo'sh navbatni boshlaydi.

Ikki marta bog'langan bo'sh ro'yxatni boshlang L va 2-4 daraxt T. O'rnatish k va n nolga.

Qo'shish (Q, x): Elementni qo'shing x saralash Q.

Elementni joylashtiring x ro'yxatda L. Bitni elementga o'rnating x elementning ro'yxatda ekanligini ko'rsatish uchun biriga L. Ni yangilang minL agar ko'rsatgich bo'lsa x ro'yxatdagi eng kichik element. O'sish n 1 tomonidan.

Minimal (Q): Queap-dan eng kichik elementga ko'rsatkichni oling Q.

Agar kalit (minL) < kalit(), qaytish minL. Aks holda qaytib keling .

O'chirish (Q, x): X elementini navbatdan olib tashlang Q.

Agar element bit bo'lsa x biriga o'rnatiladi, element ro'yxatda saqlanadi L. Barcha elementlarni qo'shing L ga T, har bir elementning bitini nolga o'rnatish. Har bir element eng to'g'ri farzandning ota-onasiga qo'shiladi T 2-4 daraxtni kiritish operatsiyasidan foydalangan holda. L bo'sh bo'ladi. Yangilash barcha tugunlar uchun ko'rsatgichlar v ularning farzandlari yangi / o'zgartirilgan va ota-ona ildiziga teng bo'lgunga qadar keyingi ota-onasi bilan jarayonni takrorlang. Ildizdan tugunga qadar yurish va yangilang qiymatlar. O'rnatish k ga teng n.
Agar element bit bo'lsa x nolga o'rnatilgan, x ning bargidir T. 2-4 daraxtni o'chirish operatsiyasi yordamida x-ni o'chirib tashlang. Tugundan boshlab x, yurish T tugun , yangilanmoqda va ko'rsatgichlar. N va k ni 1 ga kamaytirish.

DeleteMin (Q): Queap-dan eng kichik elementni o'chiring va qaytaring Q.

Ga murojaat qiling Minimal (Q) operatsiya. Amaliyot qaytadi min. Ga murojaat qiling O'chirish (Q, min) operatsiya. Qaytish min.

CleanUp (Q): Ro'yxatdagi barcha elementlarni o'chirib tashlang L va daraxt T.

Ro'yxatdagi birinchi elementdan boshlab L, har bir tugunni o'chirib, ro'yxatni kesib o'ting.
Daraxtning ildizidan boshlab T, yordamida daraxtdan o'ting buyurtmadan keyingi o'tish algoritm, daraxtdagi har bir tugunni o'chirish.

Tahlil

Ishlash vaqti. Yordamida tahlil qilinadi amortizatsiya qilingan tahlil. Q queap uchun potentsial funktsiya bo'ladi qayerda .

Qo'shish (Q, x): Amaliyot narxi O (1). Ro'yxat hajmi L bittaga o'sadi, potentsial bir oz doimiy ortadi v.

Minimal (Q): Amaliyot ma'lumotlar tuzilishini o'zgartirmaydi, shuning uchun amortizatsiya qilingan xarajatlar uning haqiqiy narxiga teng (O (1)).

O'chirish (Q, x): Ikkita holat mavjud.

1-holat

Agar x daraxtda T, keyin amortizatsiya qilingan qiymat o'zgartirilmaydi. O'chirish jarayoni O (1) amortizatsiya qilingan 2-4 daraxt. Beri x daraxtdan olib tashlandi, va ko'rsatkichlar yangilanishi kerak bo'lishi mumkin. Eng ko'p bo'ladi yangilanishlar.

2-holat

Agar x ro'yxatda L, keyin barcha elementlar L kiritilgan T. Buning qiymati bor ba'zi bir doimiy a, 2-4 daraxt ustida amortizatsiya qilingan. Qo'shib va ​​yangilab bo'lgandan keyin va ko'rsatkichlar, sarflangan umumiy vaqt chegaralangan . Ikkinchi operatsiya - o'chirish x dan Tva x dan to yo'lda yurish uchun , tuzatish va qiymatlar. Vaqt ko'pi bilan sarflanadi . Agar , keyin amortizatsiya qilingan qiymat bo'ladi .O'chirish (Q, x): ning amortizatsiya qilingan qiymatining qo'shilishi hisoblanadi Minimal (Q) va O'chirish (Q, x), bu .

Kod misoli

Kichkina Java quyruqni amalga oshirish:

jamoat sinf Navbat{    jamoat int n, k;    jamoat Ro'yxat<Element> l; // Element - umumiy ma'lumot turi.    jamoat QueapTree t;     // Queap maqsadida o'zgartirilgan 2-4 daraxt    jamoat Element minL;    xususiy Navbat() {        n = 0;        k = 0;        l = yangi LinkedList<Element>();        t = yangi QueapTree();    }    jamoat statik Navbat Yangi() {        qaytish yangi Navbat();    }    jamoat statik bekor Kiritmoq(Navbat Q, Element x) {        agar (Q.n == 0)            Q.minL = x;        Q.l.qo'shish(x);        x.ro'yxat = to'g'ri;        agar (x.taqqoslash(Q.minL) < 0)            Q.minL = x;    }    jamoat statik Element Eng kam(Navbat Q) {        // t - 2-4 daraxt va x0, cv - daraxt tugunlari.        agar (Q.minL.taqqoslash(Q.t.x0.Rezyume.kalit) < 0)            qaytish Q.minL;        qaytish Q.t.x0.Rezyume.kalit;    }    jamoat statik bekor O'chirish(Navbat Q, QueapNode x) {        Q.t.o'chirish(x);        --Q.n;        --Q.k;    }    jamoat statik bekor O'chirish(Navbat Q, Element x) {        QueapNode n;        agar (x.ro'yxat) {            // ro'yxatdagi barcha elementlarning inList-ni "false" ga o'rnating            n = Q.t.insertList(Q.l, x);            Q.k = Q.n;            O'chirish(Q, n);        }        boshqa agar ((n = Q.t.x0.Rezyume).kalit == x)            O'chirish(Q, n);    }    jamoat statik Element DeleteMin(Navbat Q) {        Element min = Eng kam(Q);        O'chirish(Q, min);        qaytish min;    }}

Shuningdek qarang

Adabiyotlar

  1. ^ Iakono, Jon; Langerman, Stefan (2005). "Quaps". Algoritmika. Springer. 42 (1): 49–56. doi:10.1007 / s00453-004-1139-5.