Blokkrendezés

Blokkrendezés (Pocket sort, basket sort, eng.  Bucket sort ) - rendezési algoritmus , amelyben a rendezett elemek véges számú különálló blokk (zsebek, kosarak) között vannak elosztva úgy, hogy minden következő blokkban sorrendben minden elem mindig több legyen. (vagy kevesebb), mint az előzőben. Ezután minden blokkot külön-külön rendezünk, akár rekurzív módon, akár egy másik módszerrel. Az elemek ezután visszakerülnek a tömbbe . Az ilyen típusú rendezésnek lehet lineáris végrehajtási ideje.

Ehhez az algoritmushoz az "összehasonlítás" és a "csere" függvényeken túlmenően ismerni kell a rendezendő adatok természetét, ami elegendő az összevonási rendezéshez, kupac rendezéshez, gyors rendezéshez, shell rendezéshez, beillesztési rendezéshez.

Előnyök: a lineáris O(N) végrehajtási idővel rendelkező gyors algoritmusok osztályába tartozik (jó bemeneti adatokon).

Hátrányok: sokat ront sok kis különböző elem mellett, vagy az elem tartalmából a kosárszám megszerzésének sikertelen funkcióján. Az esetek némelyikében a BWT -tömörítési algoritmus karakterlánc-rendezésen alapuló implementációiban előforduló karakterláncok esetében kiderül, hogy a Sedgwick-féle karakterláncok gyorsrendezése sokkal gyorsabb, mint a blokkrendezés.

Algoritmus

Ha a bemeneti elemek egyenletes eloszlásúak , akkor a zsebrendezési algoritmus várható futási ideje lineáris. Ez a bemeneti adatokkal kapcsolatos bizonyos feltételezések miatt lehetséges. A Pocketsort feltételezi, hogy a bemeneti adatok egyenletesen oszlanak el a [0, 1) szegmensen .

Az algoritmus lényege, hogy a [0, 1) szegmenst n azonos szegmensre (zsebre) osztja, és n bemeneti értéket oszt ezekre a zsebekre. Mivel a bemeneti számok egyenletesen oszlanak el, feltételezzük, hogy minden zseb kis számú számra esik. Ezután a zsebekben lévő számok sorba rendeződnek. Rendezett tömböt kapunk az egyes zsebek elemeinek szekvenciális felsorolásával.

Pszeudokód

függvény bucket-sort(A, n) az kofák ← n üres elemből álló új tömb ha i = 0 -tól (hossz(A)-1-ig) , illessze be az A[i] -t a tömbök [msbits(A[i], k)] végére, ha i = 0 és n - 1 do következő rendezés(vödrök[i]) return Tömbösszefűzési gyűjtők[0], ..., gyűjtők[n-1]

A bucket-sort függvény bemenete egy rendezhető tömb (lista, gyűjtemény stb.) A és a blokkok száma - n .

A buckets tömb olyan tömbök tömbje (listák tömbje, gyűjtemények tömbje stb.), amelyek megfelelnek az A elemeinek természetének .

Az msbits(x,k) függvény szorosan kapcsolódik a blokkok számához - n (értéket ad vissza 0-tól n-ig), és általában a k legjelentősebb bitet adja vissza x -ből ( floor(x/2^(size) (x)-k ))) ). Különféle függvények használhatók msbit(x,k)-ként, amelyek megfelelnek a rendezett adatok természetének, és lehetővé teszik az A tömb n blokkra való felosztását. Például AZ karakterek esetén ez lehet egyezés a 0-25 betűszámokkal, vagy visszaadhatja az első betű kódját (0-255) az ASCII-karakterkészlethez; a [0, 1) számoknál lehet a padló(n*A[i]) , az [a, b) intervallumban lévő tetszőleges számhalmaznál pedig az (n* ( A[i]) függvény ]-a)/(ba )) .

A next-sort funkció egy rendezési algoritmust is megvalósít az első lépésben létrehozott minden egyes blokkhoz. A bucket-sort rekurzív használata következő rendezésként ezt az algoritmust radix rendezéssé változtatja . n = 2 esetén a gyorsrendezésnek felel meg (bár potenciálisan rossz pivot-választással).

Nehézségi fok

Becsüljük meg a blokkrendezési algoritmus összetettségét arra az esetre, amikor a beillesztési rendezést blokkrendezési algoritmusként használjuk ( következő rendezés pszeudokódból) .

Az algoritmus bonyolultságának becsléséhez vezessünk be egy n i valószínűségi változót , amely a zsebbe kerülő elemek számát jelöli . A beillesztési rendezés futási ideje . B[i]

A zsebrendezési algoritmus futási ideje a

Számítsuk ki az egyenlőség mindkét részének matematikai elvárását :

Keressük az értéket .

Vezessünk be egy valószínűségi változót , amely egyenlő 1 -gyel, ha az i -edik zsebbe esik , és 0 -val egyébként: A[j]

Ha k ≠ j , X ij és X ik függetlenek, akkor:

Ily módon

Tehát a zsebrendezési algoritmus várható futási ideje:

Irodalom

Lásd még

Linkek