Estä lajittelu

Lohkojen lajittelu (Pocket sort, basket sort, eng.  Bucket sort ) - lajittelualgoritmi , jossa lajitellut elementit jaetaan rajalliseen määrään erillisiä lohkoja (taskuja, koreja) siten, että jokaisen seuraavan lohkon kaikki elementit ovat aina enemmän (tai vähemmän) kuin edellisessä. Jokainen lohko lajitellaan sitten erikseen, joko rekursiivisesti samalla menetelmällä tai eri menetelmällä. Elementit työnnetään sitten takaisin taulukkoon . Tämän tyyppisellä lajittelulla voi olla lineaarinen suoritusaika.

Tämä algoritmi vaatii tietoa lajiteltavien tietojen luonteesta, "vertaa"- ja "swap"-toimintojen lisäksi, riittää yhdistämiseen, keon lajitteluun, pikalajitteluun, komentotulkkilajitteluun, lisäyslajitteluun.

Edut: kuuluu nopeiden algoritmien luokkaan, jossa on lineaarinen O(N) suoritusaika (hyvillä syöttötiedoilla).

Haitat: se huonontaa paljon suurella määrällä pieniä erilaisia ​​elementtejä tai epäonnistuneesta toiminnosta saada korinumero elementin sisällöstä. Joissakin näistä tapauksista merkkijonojen osalta, joita esiintyy merkkijonojen lajitteluun perustuvan BWT -pakkausalgoritmin toteutuksissa , käy ilmi, että Sedgwickin merkkijonojen pikalajittelu on nopeudeltaan paljon nopeampi kuin lohkolajittelu .

Algoritmi

Jos syöteelementit jakautuvat tasaisesti , taskulajittelualgoritmin odotettu ajoaika on lineaarinen. Tämä on mahdollista syötetietoihin liittyvien tiettyjen oletusten vuoksi. Pocketsort olettaa, että syöttödata on jakautunut tasaisesti segmentille [0, 1 ) .

Algoritmin ideana on jakaa segmentti [0, 1) n identtiseksi segmentiksi ( taskuksi ) ja jakaa n syöttöarvoa näihin taskuihin. Koska syötetyt numerot jakautuvat tasaisesti, oletetaan, että jokainen tasku jakautuu pieneen määrään numeroita. Sitten taskuissa olevat numerot lajitellaan peräkkäin. Lajiteltu taulukko saadaan luettelemalla kunkin taskun elementit peräkkäin.

Pseudokoodi

funktio bucket-sort(A, n) on buckets ← uusi joukko n tyhjää elementtiä jos i = 0 arvoon (pituus(A)-1) , lisää A[i] taulukon ryhmien [msbits(A[i], k)] loppuun, jos i = 0 - n - 1 do seuraava lajittelu(ämpärit[i]) return Array concatenation buckets[0], ..., buckets[n-1]

Bucket-sort- funktion syöte on lajiteltava taulukko (luettelo, kokoelma jne.) A ja lohkojen lukumäärä - n .

Buckets array on joukko taulukoita (luettelot, joukko kokoelmat jne.), jotka vastaavat A :n elementtien luonnetta .

Funktio msbits(x,k) liittyy läheisesti lohkojen määrään - n (palauttaa arvon 0:sta n:ään) ja yleensä palauttaa k merkittävintä bittiä x :stä ( floor(x/2^(size) (x)-k ))) ). Erilaisia ​​funktioita voidaan käyttää msbiteinä (x,k) , jotka vastaavat lajitellun tiedon luonnetta ja mahdollistavat taulukon A jakamisen n lohkoon. Esimerkiksi AZ-merkkien kohdalla tämä voi vastata kirjainnumeroita 0-25 tai palauttaa ensimmäisen kirjaimen koodin (0-255) ASCII-merkistölle. numeroille [0, 1) se voi olla funktio kerros(n*A[i]) ja mielivaltaiselle lukujoukolle välissä [a, b) se voi olla funktion kerros (n*(A[i] ) ]-a)/(ba)) .

Seuraava lajittelu -toiminto toteuttaa myös lajittelualgoritmin jokaiselle ensimmäisessä vaiheessa luodulle lohkolle. Rekursiivinen bucket-lajittelun käyttäminen seuraavan lajittelun muodossa muuttaa tämän algoritmin kantalukulajitteluksi . Tapauksessa n = 2 , se vastaa pikalajittelua (vaikkakin mahdollisesti huonolla kääntöpisteen valinnalla).

Vaikeusaste

Arvioidaan lohkolajittelualgoritmin monimutkaisuus siinä tapauksessa, että lisäyslajittelua käytetään lohkolajittelualgoritmina ( seuraava lajittelu pseudokoodista) .

Algoritmin monimutkaisuuden arvioimiseksi otetaan käyttöön satunnaismuuttuja n i , joka ilmaisee taskuun putoavien elementtien lukumäärää B[i]. Lisäyslajittelun suoritusaika on .

Taskulajittelualgoritmin ajoaika on

Lasketaan tasa-arvon molempien osien matemaattinen odotus :

Etsitään arvo .

Otetaan käyttöön satunnaismuuttuja , joka on yhtä suuri kuin 1 , jos se putoaa i - taskuun, ja 0 muussa tapauksessa: A[j]

Jos k ≠ j , X ij ja X ik ovat riippumattomia, niin:

Tällä tavalla

Joten taskulajittelualgoritmin odotettu ajoaika on

Kirjallisuus

Katso myös

Linkit