Birlashtirishni saralash-birlashtirish - Sort-merge join

The sort-birlashma qo'shilish (shuningdek, birlashma qo'shilish deb ham ataladi) - bu qo'shilish algoritmi va amalga oshirishda ishlatiladi a aloqador ma'lumotlar bazasini boshqarish tizimi.

Birlashtirish algoritmining asosiy muammosi - qo'shilish atributining har bir aniq qiymati uchun to'plamini topish koreyslar ushbu qiymatni ko'rsatadigan har bir munosabatlarda. Tartib-birlashtirish algoritmining asosiy g'oyasi avvalo birlashtiruvchi atributi bo'yicha munosabatlarni saralashdir, shunda satrli chiziqli skanerlash ushbu to'plamlarga bir vaqtning o'zida duch keladi.

Amalda, saralash-birlashtirishni amalga oshirishning eng qimmat qismi algoritmga kiritilgan har ikkala ma'lumotni tartiblangan tartibda taqdim etishdir. Bunga aniq saralash operatsiyasi orqali erishish mumkin (ko'pincha an tashqi tartib ), yoki qo'shilish munosabatlarining birida yoki ikkalasida oldindan mavjud bo'lgan buyurtmaning afzalliklaridan foydalangan holda. Qiziqarli tartib deb nomlangan oxirgi holat yuzaga kelishi mumkin, chunki qo'shilishga kirish daraxtga asoslangan indeksni indeksni skanerlash, boshqa birlashma qo'shilishi yoki tegishli tugmachada saralangan mahsulot ishlab chiqaradigan boshqa reja operatori tomonidan ishlab chiqarilishi mumkin. Qiziqarli buyurtmalar serdipitiv bo'lishi shart emas: optimallashtiruvchi ushbu imkoniyatni qidirib topishi mumkin va agar u bir yoki bir nechta quyi oqim tugunlaridan foydalanishi mumkin bo'lgan qiziqarli buyurtma beradigan bo'lsa, oldingi oldingi operatsiya uchun maqbul bo'lmagan rejani tanlashi mumkin.

Aytaylik, bizda ikki munosabat mavjud va va . mos keladi sahifalar xotirasi va mos keladi sahifalar xotirasi. Shunday qilib, eng yomon holatda sort-birlashma qo'shilish ichida ishlaydi I / Os. Bunday holda va buyurtma berilmagan bo'lsa, eng yomon ish vaqti saralashning qo'shimcha shartlarini o'z ichiga oladi: , bu teng (kabi chiziqli atamalar chiziqli atamalardan ustunroq, qarang Big O notation - umumiy funktsiyalar buyurtmalari ).

Psevdokod

Oddiylik uchun algoritm an holatida tavsiflanadi ichki qo'shilish bitta atribut bo'yicha ikkita munosabatlarning. Boshqa qo'shilish turlari, ko'proq munosabatlar va boshqa kalitlarga umumlashtirish juda oson.

funktsiya sortMerge (munosabat chap, munosabat to'g'ri, xususiyat a) var munosabati chiqish var ro'yxati chap_sortlangan: = tartiblash (chapda, a) // A xususiyati bo'yicha tartiblangan chap munosabatlar    var ro'yxati o'ng_sortlangan: = sort (o'ng, a) var atributi chap tugma, o'ng tugma var set chap_subset, o'ng_subset // Ushbu to'plamlar bekor qilinadi, faqat qo'shilish predikati qondirilgan joylardan tashqari    oldinga (chap_subset, chap_sortlangan, chap_key, a) avans (o'ng_subset, o'ng_sortlangan, o'ng_key, a) yo'q esa bo'sh (chap_subset) va emas bo'sh (o'ng_subset) agar chap_key = o'ng_key // Predikatga ma'qul qo'shiling            oldinga chiqish uchun chap_subset va o'ng_subset kartezian mahsulotini qo'shing (chap_subset, chap_sortlangan, chap_key, a) avans (o'ng_subset, o'ng_sortlangan, o'ng_key, a) boshqa bo'lsa chap_key boshqa // chap_key> o'ng_key            avans (o'ng_subset, o'ng_sortlangan, o'ng_key, a) qaytish chiqish
// Saralanganlardan [1] .a qiymati o'zgarguncha saralanganlardan pastki to'plamga olib tashlangfunktsiya avans chiqib, tartiblangan inout, kalit chiqib, a yilda) tugmachasi: = tartiblangan [1] .a ichki to'plam: = emptySet    yo'q esa bo'sh (saralangan) va sorted [1] .a = key insert sorted [1] subset ichiga olib tashlash sorted [1]

Oddiy C # dasturi

Shuni esda tutingki, ushbu dastur birlashma atributlarini noyobdir, ya'ni kalitning ma'lum bir qiymati uchun bir nechta katakchalarni chiqarishga hojat yo'q.

jamoat sinf MergeJoin{    // Chap va o'ng allaqachon saralangan deb taxmin qiling    jamoat statik Aloqalar Birlashtirish(Aloqalar chap, Aloqalar to'g'ri)    {        Aloqalar chiqish = yangi Aloqalar();        esa (!chap.IsPastEnd() && !to'g'ri.IsPastEnd())        {            agar (chap.Kalit == to'g'ri.Kalit)            {                chiqish.Qo'shish(chap.Kalit);                chap.Oldindan();                to'g'ri.Oldindan();            }            boshqa agar (chap.Kalit < to'g'ri.Kalit)                chap.Oldindan();            boshqa // agar (chapKey> o'ngKey)                to'g'ri.Oldindan();        }        qaytish chiqish;    }} jamoat sinf Aloqalar{    xususiy Ro'yxat<int> ro'yxat;    jamoat konst int ENDPOS = -1;    jamoat int pozitsiya = 0;    jamoat int Lavozim    {        olish { qaytish pozitsiya; }    }    jamoat int Kalit    {        olish { qaytish ro'yxat[pozitsiya]; }    }    jamoat bool Oldindan()    {        agar (pozitsiya == ro'yxat.Graf - 1 || pozitsiya == ENDPOS)        {            pozitsiya = ENDPOS;            qaytish yolg'on;        }        pozitsiya++;        qaytish to'g'ri;    }    jamoat bekor Qo'shish(int kalit)    {        ro'yxat.Qo'shish(kalit);    }    jamoat bool IsPastEnd()    {        qaytish pozitsiya == ENDPOS;    }    jamoat bekor Chop etish()    {        har biriga (int kalit yilda ro'yxat)            Konsol.WriteLine(kalit);    }    jamoat Aloqalar(Ro'yxat<int> ro'yxat)    {        bu.ro'yxat = ro'yxat;    }    jamoat Aloqalar()    {        bu.ro'yxat = yangi Ro'yxat<int>();    }}

Shuningdek qarang

Tashqi havolalar

C # Har xil qo'shilish algoritmlarini amalga oshirish