vanjsko sortiranje
TRANSCRIPT
VANJSKO SORTIRANJE
SEMINARSKI RAD IZ KOLEGIJA „STRUKTURE PODATAKA“
Sadržaj
1. UVOD...................................................................................................................................................................1
2. VANJSKO SORTIRANJE.................................................................................................................................2
2.1. OPĆENITO O VANJSKOM SORTIRANJU...............................................................................................2
2.2. VIŠESMJERNO SPAJANJE i ZAMJENA IZBORA...................................................................................5
2.3. VIŠEFAZNO SPAJANJE...........................................................................................................................11
2.4. KASKADNO SPAJANJE...........................................................................................................................13
2.5. ČITANJE VRPCE UNAZAD.....................................................................................................................14
2.6. OSCILIRAJUĆE SPAJANJE......................................................................................................................15
2.7. VANJSKO BAZNO SORTIRANJE...........................................................................................................16
2.8. DVO-VRPČANO SORTIRANJE...............................................................................................................17
3. ZAKLJUČAK....................................................................................................................................................20
LITERATURA......................................................................................................................................................21
1. Uvod
Računala su postala dio svakodnevice na način da su ušla na velika vrata u sve sfere
ljudskoga života. Prema Mooreovom zakonu svake dvije godine broj operacija koje računalo
može izvršiti u sekundi se udvostruči. Tako da nas ne mora čuditi što svakim danom imamo
sve više podataka koje je potrebno digitalno pohraniti, a u međuvremenu i s njima se koristiti.
Također, ljudske potrebe idu do te mjere da želimo da naši podaci budu u što kraćem roku
pohranjeni i sortirani prema određenom principu.
Jednostavnim algoritmima sortiranja poput sortiranja izborom i mjehuričastim
sortiranjem potrebno nam je otprilike 4.5 sata za veliku količinu podataka, dok složenijim
algoritmima poput brzim sortiranjem i sortiranjem spajanjem nam je potrebno samo nekoliko
sekundi. Upravo o tome ću pisati u ovom seminaru, odnosno o tome kako izabrati
najefikasniji i najefektivniji način sortiranja podataka.
U bazama podataka vrlo je bitan izbor strukture podataka, ali mi ćemo govoriti o
tipovima vanjskog sortiranja i njegovim jednostavnijim alternativama za koje je potrebno
manje dizajniranja i manje su podložne pogreškama. Osnovna ideja vanjskog sortiranja za
razliku od unutarnjeg je u sortiranju većeg broja podataka, većeg od kapaciteta kojeg
podržava unutarnja memorija računala.
1
2. Vanjsko sortiranje
2.1. Općenito o vanjskom sortiranju
Problem se pojavljuje kada je broj zapisa koji bi trebao biti spremljen veći od samog
kapaciteta unutarnje računalne memorije. Vanjsko sortiranje je poprilično drugačije od
unutarnjeg sortiranja, iako je sama jezgra problema u oba slučaja jednaka na način da se
dobiveni podaci sortiraju neopadajućim redoslijedom, ali pristup vanjskoj memoriji i
podacima je strogo ograničen. Struktura podataka mora biti uređena na način da i djelomično
sporiji periferni memorijski uređaji (vrpce, diskovi, bubnjevi itd.) mogu izaći na kraj sa
uvjetima algoritma za sortiranje. Prema tome većina metoda za unutarnje sortiranje
(Sortiranje umetanjem, zamjenom ili odabirom) su beskorisne prilikom vanjskog sortiranja.
Ako na primjer imamo 5000 zapisa R1,R2,…R5000 koje trebamo sortirati na način da
svaki zapis Ri zauzima 20 mjesta praznog prostora, a unutarnja memorija podržava samo 1000
spremljenih zapisa jedino rješenje je da sortiramo svaki podzapis zapisa pojedinačno R1,…
R1000, R1001,…R2000, R4001…R5000 i na kraju te rezultate spojimo. Proces spajanja koristi vrlo
jednostavne strukture podataka kao što su linearne liste čiji su elementi slijedno povezani kao
kod stogova i redova, te se taj proces vrlo jednostavno izvodi i na najjeftinijim vanjskim
memorijskim uređajima. Unutarnje sortiranje popraćeno vanjskim spajanjem se vrlo često
koristi i u praksi što možemo vidjeti iz ovog primjera.
Padajući slijed zapisa koji je nastao u fazi unutarnjeg sortiranja često nazivamo string
u literaturi koja govori o sortiranju i pod tim nazivom je široko rasprostranjen na tom
području računalne znanosti. Zbog konflikta naziva i namjene uveden je novi termin nizovi
(eng.runs) koji se odnosi na sortirane segmente datoteke. Sada ćemo na primjeru objasniti
vanjsko sortiranje na magnetskim vrpcama koje se koriste kao pomoćna memorija.
Najjednostavniji način njezinog korištenja je uravnoteženo dvostruko spajanje. Tijekom prve
faze padajući nizovi stvoreni unutarnjim sortiranjem su alternativno stavljeni na vrpcu 1 i 2.
Ova faza prestaje s nestankom elemenata na ulazu. Tada se vrpca 1 i 2 vraćaju na početak
stvarajući nove nizove koji su duplo duži od originalnih. Originalni nizovi se spajaju, a novi
nizovi se zapisuju na vrpce 3 i 4. Ako vrpca 1 sadrži niz duži od niza vrpce 2, tada se taj niz
duljine 0 nalazi i na vrpci 2. Sve vrpce se obnavljaju i sadržaj vrpce 3 i 4 se spajaju u nizove
četverostruke duljine koji se snimaju naizmjenično na vrpcu 1 i 2. Proces se nastavlja na način
2
da se svaki put udvostruči duljina nizova sve dok ne preostane samo jedan niz, odnosno
sortirana datoteka. Tokom unutarnjeg sortiranja k=[log2S] gdje k zadovoljava uvjete da su se
S nizovi kreirali tokom unutarnjeg sortiranja i da 2k-1<S≤2k toliko puta prođe kroz sve podatke.
Unutarnji memorijski kapacitet je 1000, a mi imamo 5000 zapisa koji trebaju unutra biti
spremljeni i sortirani S=5.
(1)
Prvi prolaz spajanja povećava nizove na vrpcama 3 i 4 istovremeno kada ih čita s vrpce 1 i 2:
(2)
S početka vrpce 3 i kraja vrpce 4 dodani su nizovi u vrpcu 1, a s vrpce 3 su dodani u vrpcu 2:
(3)
Uravnoteženo spajanje ćemo općenito opisati slučajem T vrpci, za bilo koji T≥3. Izabrat ćemo
broj P sa 1≤P<T, i podijelit ćemo T vrpcu na dva dijela, sa P dijelom vrpce na lijevoj strani i
T-P na desnoj. Podijeli se svaki niz posebno na lijevoj strani vrpce P, a zatim treba napraviti
spajanje P-strane s lijeva nadesno, popraćeno (T-P) smjerom spajanja s desne na lijevo, sve
dok se ne završi sortiranje. Najbolji izbor podjele P je T/2. Inicijalna podjela:
(4)
Nakon prvog spajanja nastaje:
3
(5)
Drugo spajanje i prolazak kroz nizove dovršava proces, smještajući R1…R5000 na vrpcu 1. U
ovom slučaju T=6 je prilično isto kao i T=5, s obzirom da se 6 vrpca koristi samo kada je
S≥7. Trostruko spajanje zahtijeva više računalnog vremena za odvijanje procesa nego li
dvostruko spajanje, ali je u općem smislu to beznačajno u usporedbi s vremenom potrebnim
za zapisivanje, čitanje i premotavanje vrpci. S obzirom na kapacitet vrpce možemo dobiti
zadovoljavajuću procjenu vremena izvršavanja procesa. Balansirano spajanje je vrlo
jednostavno, ali nije najbolji način za rješavanje zadanog slučaja. Umjesto da premotavamo
vrpce, trebali bi zaustaviti prvi prolazak spajanja nakon vrpci 3 i 4 koje sadrže R1…R2000 i
R2001…R4000, i vrpcu 1 ostaviti spremno da čita R4001…R5000. Tada vrpce 2, 3 i 4 mogu biti
premotane i možemo dovršiti spajanje koristeći trostruko spajanje na vrpci 2. Ukupan broj
čitanja zapisa s vrpce tokom ove procedure će biti 4000+5000=9000, u usporedbi s
5000+5000+5000=15000 u balansiranoj shemi. Suvremeno računalo će znati razliku.
Zatim se trostruko spaja na vrpcu 4, a istovremeno se trake 3 i 4 premotavaju zajedno s tim da
se na traci 3 odvija trostruko spajanje, te se tako završava sortiranje što znači
3000+5000=8000 zapisa je pročitano. Također, da smo imali 6 vrpci mogli smo inicijalni niz
postaviti na vrpcu 1 preko 5 vrpce i završiti sortiranje jednim prolaskom peterostrukim
spajanjem vrpce 6. Unutarnjim sortiranjem tvorimo inicijalne nizove, dok vanjskim
sortiranjem zapravo uvelike prekoračujemo kapacitet te unutarnje memorije.
4
2.2. Višesmjerno spajanje i Zamjena izbora
U ovom slučaju imamo P padajući niz, slijed zapisa čiji su zapisi u neopadajućem
stanju. Način na koji ćemo ih spajati je taj da ćemo pogledati prvi zapis svakoga niza i
odabrati zapis čiji je znak najmanji. Taj zapis će biti smješten na izlaz, te se tada automatski
briše sa ulaza,a proces se ponavlja. Ako se dogodi da su oba dva znaka najmanja, odnosno
jednaka onda je izbor zapisa proizvoljan. U ovom zadatku imamo stablo odluke koje se sastoji
od dvije razine i na njemu će se primjenjivati četverostruko spajanje. Znak „∞“ koristimo
kako bi duljina niza koje spajamo bila definirana, a ne proizvoljna.
Slika 2.2.1. Primjer stabla odluke [Knuth, 1998., str. 251]
Svaki korak u stablu odluke sastoji se od zamjene najmanjeg elementa s njegovim
sljedbenikom u nizu i mijenjanjem putova izbora elementa. Proces zamjene jednog znaka s
drugim u stablu odluke se zove Zamjena izbora (eng. Replacement Selection).
Svaki čvor u stablu predstavlja slijed uključen u zajednički proces spajanja. Također,
ovo stablo se ponaša i funkcionira na način višeg reda „onaj koji je najmanji, ide prvi van“.
Mogli smo koristiti i hrpu umjesto stabla kako bi implementirali viši red, ali hrpa bi bila
5
uređena tako da se najmanji element nalazi na vrhu. S obzirom da hrpa nema fiksnu veličinu
ne bi koristili ni „∞“ znak već bi spajanje odnosno sortiranje bilo gotovo kada bi hrpa bila
prazna. Vanjsko sortiranje se najčešće koristi prilikom sortiranja vrlo velikih zapisa i znakova,
stoga se hrpa sastoji od pokazivača na znakove, a ne samih znakova.
Slika 2.2.2. Binarno stablo – stablo „gubitnika“ [Knuth, 1998., str. 252]
Drvo „gubitnika“ prikazuje kompletno binarno stablo sa 12 vanjskih (četverokuta) čvorova i
11 unutarnjih (kružnih) čvorova. Vanjski čvorovi su popunjeni znakovima, a unutarnji
čvorovi su popunjeni „pobjednicima“ ako se stablo gleda kao borba za najmanji znak.
Najmanji brojevi iznad svakog čvora pokazuju tradicionalan način alociranja pozicija slijedne
memorije za čitavo stablo. Kada pogledamo broj 061 vidimo da su brojevi 512, 087 i 154
„gubitnici“ u borbi s tim brojem. Što znači da mi ustvari gledamo gubitnike svake borbe
umjesto pobjednike i time stvaramo stablo spremno za nadopunjavanje.
Slika 2.2.3. Binarno stablo – stablo „gubitnika“ [Knuth, 1998., str. 252]
6
U ovom stablu vidimo da su gubitnici stavljeni ispred pobjednika. Na vrhu stabla
nadodan je čvor pod brojem 0 i on predstavlja pobjednika turnira. Svaki znak koji prihvati
izazov je gubitnik samo jedanput jer se pojavljuje jednom kao vanjski čvor, a drugi put kao
unutarnji čvor. U praksi vanjski čvorovi pri dnu predstavljat će duže zapise spremljene u
računalnoj memoriji, a unutarnji čvorovi će predstavljati pokazivače na te zapise.
Tablica 2.2.1. Primjer četverosmjerne zamjene odabira
Tehnika zamjene izbora se može koristiti i u prvoj fazi vanjskog sortiranja, ako radimo
P-smjerno spajanje ulaznih podataka sa njima samima. U gornje navedenom slučaju uzimamo
P dovoljno dugačak kako bi unutarnja memorija bila popunjena. Kada je zapis na izlazu
njegovo mjesto preuzima sljedeći zapis sa ulaza. Ako novi zapis teži manje od onog koji je
upravo izašao ne možemo ga uključiti u trenutačni niz. U suprotnom možemo ući u stablo
odluke i vidjeti kako se formirao taj novonastali dio. Svaki niz može sadržavati više od jednog
P zapisa, ali zapravo nikada nemamo više od jednog P zapisa u stablu izbora u isto vrijeme.
Gornja tablica prikazuje proces za P=4; brojevi u zagradi čekaju na uključivanje u sljedeći
niz.
Harold H.Seward (Master's Thesis, Digital Computer Laboratory Report R-232)
opisao je metodu formiranja inicijalnih nizova i također je iznio da nizovi mogu sadržavati
više od 1.5P zapisa kada se primjenjuju na slučajne podatke. A.I.Dumey je upotpunio ideju
1950.godine svojim uređajem za sortiranje u suradnji s Engineering Research Associates, ali
nije ju objavio. Naziv „Replacement selection“ stvorio je E.H.Friend 1956. godine koji je
svojim eksperimentom potvrdio da je očekivana duljina slijeda 2P i da su to realna očekivanja
7
tokom procesa. E.F.Moore potvrdio je da je duljina 2P i usporedio ju je sa situacijom
cirkularnog obilaska ralice.
Slika 2.2.3. Primjer cirkularnog obilaska ralice [Knuth, 1998., str. 255]
Pahuljice snijega uzastopno padaju na kružnu stazu, te tako ralica neprekidno kruži i čisti.
Figurativno govoreći kada se snijeg makne sa ceste tada i podaci nestaju iz sustava.
Pokazivači na cesti mogu biti zamijenjeni i realnim brojevima x, 0≤x<1. Pahuljica snijega
koja pada na poziciju x predstavlja ulazni zapis čiji je znak x, a ralica predstavlja izlaz
Zamjene izbora. Brzina ralice je obrnuto proporcionalna visini snijega s kojim se susreće.
Situacija je savršeno izbalansirana tako da ukupna količina snijega na cesti čitavo vrijeme
iznosi P. Novi niz se formira na izlazu svaki put kad ralica prođe pored oznake 0. Nakon
određenog vremena sustav prelazi u stabilno stanje zbog toga što ralica konstantnom brzinom
cirkularno kruži. Visina snijega je konstanta u susretu sa ralicom kao i brzina padanja snijega,
odnosno iz prikazanog vidimo da je budući snijeg dvaput manji od postojećeg.
Slika 2.2.4. Primjer ralice na stazi određene duljine [Knuth, 1998., str. 255]
U mnogim komercijalnim aplikacijama ulazni podaci nisu posve slučajni nego imaju
određeni poredak. Nizovi stvoreni zamjenom izbora će nastojati imati više od 2P zapisa.
Vanjsko spajanje i sortiranje određeno je brojem stvorenih nizova u inicijalnoj distributivnoj
8
fazi, stoga je i poželjno koristiti zamjenu izbora. Druge vrste unutarnjeg sortiranja stvaraju
duplo više početnih nizova zbog limitirane memorijske veličine.
Stvaranje početnih nizova zamjenom izbora otkriveno je zahvaljujući John R.
Waltersu, James Painteru i Martin Zalku, koji su koristili program za spajanje i sortiranje za
Philco 2000, 1958.godine. Koristili su se boljim načinom da inicijaliziraju stablo odluke i da
razdvoje zapise koji pripadaju različitim nizovima, te su izbacili zadnji niz koristeći se u
principu vrlo jednostavnom i jedinstvenom logikom. Osnovna ideja je da je svaki niz kao par
(S, K) gdje je K originalni znak, a S predstavlja redni broj niza kojemu zapis pripada. Kada su
takvi prošireni znakovi leksikografski poredani mi dobijemo izlazni slijed stvoren zamjenom
izbora sa S kao glavnim znakom i K kao podznakom.
Algoritam R (Zamjena izbora) je algoritam koji čita zapise sekvencijalno s početka
reda i zapisuje ih sekvencijalno na kraj reda, stvarajući RMAX broj nizova čija je duljina P ili
više (osim zadnjeg niza). Postoje P≥2 čvora i X[0],…,X[P-1] polja. Algoritam R opisuje ulaz
i izlaz svakog zapisa pojedinačno, dok je u praksi najbolje čitati i zapisivati samo relativno
velike blokove zapisa. Prema tome neki ulazni i izlazni bufferi su prisutni u memoriji i iz
pozadine efektivno smanjuju veličinu. P.E.H.Friend predložio je proširenu verziju zamjene
izbora s time da svaki put kad je key manji od lastkey na način da nestane na vrpcu ili veći ili
jednak od lastkey zapisuje se na vrpcu i stavlja se na izlazni buffer. Neka računala imaju
„raspršeno čitanje“ i „skupljeno pisanje“ mogućnosti za obradu ulazno-izlaznih podataka i sa
nedosljednih lokacija i to vodi k tehnikama preklapanja buffera sa stablom odluke.
2.3. Višefazno spajanje
Višefazno spajanje (eng.The Polyphase Merge) je princip podijele nizova na vrpce i
njihovo međusobno spajanje sve do posljednjeg niza. To ćemo sada objasniti na primjeru u
kojem imamo tri slobodne vrpčane jedinice T1, T2 i T3. Tehnikom „slobodnog spajanja“ i
unaprijed zadanim P=2 i T=3 koristimo sljedeću formu: Podijelimo početne redove
naizmjenično na vrpce T1 i T2. Zatim dolazi do spajanja nizova s T1 i T2 na T3; ako T3
sadrži samo jedan niz onda treba stati. Ako početni dijelni prolaz stvara S nizova tada će prvo
spajanje stvoriti S/2 nizova na T3, drugi će stvoriti S/4, itd. Recimo da imamo 17≤S≤32 onda
ce biti jedan dijelni prolaz, pet prolazaka spajanja i četiri kopirajuća prolaza. Općenito ako je
S>1, broj prolazaka kroz podatke je 2[log2S]. Kopirajući prolazi u ovoj proceduri su
9
nepoželjni budući da ne reduciraju broj nizova. Većinu kopiranja možemo izbjeći koristeći se
dvofaznom procedurom da podijelimo početne nizove naizmjenično na vrpce T1 i T2, zatim
spojimo nizove s T1 i T2 na T3 i onda stanemo ako T3 ima samo jedan niz. Kopiramo
polovicu nizova s T3 na T1. Spojimo nizove s T1 i T3 na T2 i onda stanemo ako T2 sadrži
samo jedan niz. Kopiramo polovicu nizova s T2 na T1. I vratimo se na A2. Broj prolazaka
kroz podatke je reduciran na 3/2[log2S]+1/2 budući da koraci A3 i A5 rade samo polovicu
prolazaka, pa je s time ušteđeno i 25% vremena. U potpunosti se može eliminirati kopiranje
ako započnemo sa Fn nizovima na T1 i Fn-1 nizovima na T2 gdje su Fn i Fn-1 Fibonaccijevi
brojevi. Primjer:n=7, S=Fn+Fn-1=13+8=21
Broj znamenaka u svakoj fazi označava broj nizova, a značenje samog broja je duljina niza.
Općenito zadan broj vrpci T≥3 i koristeći (T-1)-smjerno spajanje prikazat ćemo na primjeru
sa šest vrpci:
10
Iz tablice vidimo da 131 znači da postoji 31 niz relativne duljine 1. U principu ako želimo
pravilno višefazno spajanje moramo imati „savršenu Fibonaccijevu podjelu“ nizova na
vrpcama nakon svake faze što je otkrio R.L.Gilstad 1960. godine. Opći primjer toga je:
T=6 s poretkom {1,0,0,0,0},{1,1,1,1,1},{2,2,2,2,1},{4,4,4,3,2},{8,8,7,6,4},{16,15,14,12,8} i
{31,30,28,24,16} :
Vrpca 6 će uvijek biti prazna nakon početne podjele. Razine u tablici se kreću od n prema n+1
konstantno. U slučaju da S nije savršen, odnosno ako nemamo savršenu Fibonaccijevu
podjelu onda koristimo uravnoteženo P-smjerno spajanje i dodajemo lažni niz kako bi
postigli savršenost S. Primjer toga je Algoritam D koji višefazno spaja i sortira
horizontalnom podjelom. Uzima početne nizove i jednog po jednog stavlja na vrpce sve dok
ih ne ponestane. Također, u međukoracima nastojimo izjednačiti broj lažnih nizova na svakoj
vrpci. Zapisi na vrpcama se nalaze na kraju vrpci, a lažni nizovi na početku.
Kod višefaznog spajanja i sortiranja dolazi do problema efikasnog preklapanja
vremena premotavanja vrpci i tada koristimo metodu Razdvajanje vrpci (eng. Tape
splitting). Iterativni postupak će zapisati izlazni podatak, a pročitat će ulazni. Vrijeme
premotavanja može se izbjeći korištenjem triju vrpci, a metodu razdvajanja vrpci koristit
ćemo kod četiri ili više vrpci s (T-2)-smjernim spajanjem.
2.4. Kaskadno spajanje
Kaskadno spajanje (eng. Cascade Merge) započinje „savršenom podjelom“ nizova na
vrpci, iako se sama podjela razlikuje od podjele kod metode višefaznog spajanja. Svaka linija
11
prikazuje kompletan prolaz kroz podatke.
Iznad navedeni primjer prikazuje šest vrpci, gdje se spajanje odvija po principu (T-1)-
smjerno, (T-2)-smjerno, (T-3)-smjerno spajanje itd. Prednosti korištenja kaskadnog spajanja
naspram višefaznog spajanja je kod šest i više vrpci, iako ni tada se ne može potvrditi da će
visoki stupanj spajanja biti u potpunosti efikasan. Ako početni nizovi nisu savršeni, onda se
uobičajeno koriste lažni nizovi. U prethodnom primjeru je vidljivo da nema potrebe za lažnim
nizovima, jer su prolazi cjeloviti, odnosno imamo 190 početnih nizova i svaki zapis je
procesuiran točno pet puta. U slučaju da imamo 191 prolaz morali bi svaki zapis procesuirati
šest puta ili bi u prvom prolasku spajanja i podjele nizova smanjili kopiranje sadržaja vrpce,
što nazivamo Fergusonovom metodom koja bez poteškoća prelazi s razine na razinu.
Kaskadno spajanje s posebnom podjelom podrazumijeva Algoritam C, koji uzima jedan po
jedan početni niz i raspodjeljuje ih po vrpcama sve dok ih ne ponestane. Zatim specificira na
koji način će vrpce biti spojene i izbjegava jednosmjerno spajanje. Algoritam C funkcionirat
će po principu da postoji T≥3 slobodne jedinice i da se koristi većinom (T-1)-smjerno
spajanje.
Ako je nadodana još jedna vrpca, moguće je preklopiti skoro sva vremena tijekom
kaskadnog sortiranja. Recimo da možemo spojiti T1-T5 na T7, T1-T4 na T6, T1-T3 na T5 (u
ovome slučaju T5 je već premotana), zatim T1-T2 na T4, koji nakon toga zahtijeva kratko
vrijeme kako bi se premotao. Još jedna od modifikacija kaskadnog sortiranja jest i shema koja
uključuje višefazne i kaskadne slučajeve, gdje svaka faza sadrži (T-1)-smjerno,(T-2)-smjerno,
…, P-smjerno spajanje, a P je fiksni broj između 1 i T-1. U slučaju P=1 radi se o čistoj
kaskadi ili P=2 onda je kaskada bez faze kopiranja, a kada je P=T-1 onda se radi o višefaznom
spajanju. Kako se T povećava tako se vrijednosti P više približavaju kaskadi nego višefazi, što
znači da je u praksi bolje koristiti kaskadno spajanje nego njegovu kombinaciju. U suštini od
svih kompromisnih spajanja najbolje je osnovno višefazno jer koristi optimalan broj razina i
podjela lažnih nizova.
12
2.5. Čitanje vrpce unazad
Čitanje vrpce unazad (eng,. Reading Tape Backwards) prikazuje sposobnost čitanja
magnetskih vrpci u suprotnom smjeru u kojoj su na njoj zapisani podaci što poništava
operacije premotavanja vrpci na način da zapisujemo na vrpcu unaprijed, a čitamo unazad.
Općenito se informacije na vrpcama zapisuju unaprijed, zatim se vrpca premotava, učitava
unaprijed i ponovno premotava. Svi tipovi spajanja od uravnoteženog, višefaznog i kaskadnog
mogu biti primjenjivani na način da čitaju vrpcu unazad. No, spajanje invertira poredak niza
kada ga čitamo unazad i upisujemo unaprijed. Kada postoje dva niza u opadajućem poretku na
vrpci oni se spajaju tokom čitanja unazad i tada postaju neopadajući nizovi. Svakim
prolaskom kroz nizove, opadajući nizovi prelaze u neopadajuće i obrnuto.
Sljedeći primjer odnosi se na spajanje osam početnih nizova nad kojima ćemo koristiti
tehniku čitanja vrpce unazad u uravnoteženo spajanje na četiri vrpce. Znak A r prikazuje niz na
vrpci kao rastući niz, a Dr je opadajući niz duljine r. Prvim prolaskom (A1) niz je rastući i
čitamo ga unaprijed, tijekom drugog prolaska niz prelazi u padajući i čitamo ga unazad. Za
ubrzanje procesa spajanja najbolje je premotati vrpcu prilikom trećeg prolaska.
Proces čitanja vrpce unazad najbolje se može primjenjivati kod uravnoteženog spajanja jer
kod kaskadnog i višefaznog spajanja to traje vremenski vrlo dugo, a i tehnički je vrlo
zahtjevno. Kako bi ipak bilo izvedivo dolazi do čestih premotavanja vrpci, kopiranja sadržaja
s jedne vrpce na drugu, izmjenjivanja smjera nizova na svakoj vrpci, dodavanja lažnih nizova.
Optimalni obrazac spajanja na vrpcama je vrlo teško determinirati prvenstveno zbog
interakcije vremena premotavanja s vremenom spajanja. Zbog toga je Richard M. Karp razvio
dvije teorije prikaz vektorom i prikaz stablom koje su vrlo korisne u praksi. Vektori su u
procesu spajanja navedeni unatrag od y(m) kao prvog do y(0) kao zadnjeg što je prednost ove
razvojne teorije. Kod prikaza stablom konstruira se stablo s listom kao vanjskim čvorom za
svaki početni niz i s unutarnjim čvorom koji označava na kojem nizu je izvedeno spajanje.
Kod malih S vrijednosti višefazne i kaskadne metode su jednostavnije i brže u procesu
13
podjele i spajanja, a kod većih vrijednosti pogodnije je asimptotički optimum preraspodjele
kod spajanja.
2.6. Oscilirajuće spajanje
Oscilirajuće spajanje (eng. Oscillating Sort) kreirano je 1962. godine kada je Sheldon
Sobel predložio algoritam koji oscilira unazad i unaprijed između podjele i spajanja. Iz
algoritma je izbačen prolaz s podjelom gdje se početni nizovi ne postavljaju više na vrpce već
se većina sortiranja odvije prije nego što se ulazni podaci u potpunosti ne potroše. U
sljedećem primjeru ćemo Sobelovom metodom na pet vrpci sortirati 16 početnih nizova. A r i
Dr prikazuju rastuće i padajuće nizove relativne duljine r. Na svaku vrpcu od T1 do T4
zapisujemo početne nizove i spajamo ih čitajući unazad na petu vrpcu. Nakon prve faze dolazi
do ponovne podjele i sekundarnog spajanja stvarajući niz D4.
Dennis L. Bencher je 1965. godine stvorio „unakrsno spajanje“, odnosno algoritam koji
odgađa spajanje sve dok se ne skupi dovoljno znanja o S. Ovo spajanje se ostvaruje s
Algoritmom B koji predstavlja oscilirajuće spajanje sa unakrsnom podjelom. Uzimajući
početne nizove raspodjeljuje ih na vrpce, a povremeno prekida proces dijeljenja spajajući
sadržaje određenih vrpci. M.A.Goetz otkrio je način performanse oscilirajućeg sortiranja
čitanjem unaprijed i jednostavnim premotavanjem. Ovaj način je prilično drugačiji od drugih
jer su podaci ponekad zapisani na početak vrpce, dok se podrazumijeva da podaci sa sredine
vrpce neće biti izbrisani. Također, svi početni stringovi imaju fiksnu maksimalnu duljinu.
Ovom shemom se zaobilaze karakteristike čitanja unaprijed „prvi unutra, prvi van“, ali se
dovoljnom količinom praznog prostora između nizova može efikasno implementirati i također
na vrijeme se trebaju prepoznati i ignorirati analogne greške.
14
2.7. Vanjsko bazno sortiranje
Vanjsko bazno sortiranje (eng. External Radix Sorting) ponekad nazivamo i sortiranje
podjelom, digitalno sortiranje, džepno sortiranje i slično. Važno je naglasiti da je ovaj tip
sortiranja u potpunosti različit od spajanja. U primjeru imamo četiri vrpce i osam ponuđenih
znakova: 0,1,2,3,4,5,6,7. Na vrpci T1 nalaze se ulazni podaci, te proces započinjemo
premještanjem parnih brojeva na T3, a neparnih brojeva na T4. Tada premotamo vrpcu i
iščitavamo vrpcu T3, pa onda T4 stavljajući pritom {0,1,4,5} na vrpcu T1 i {2,3,6,7} na T2.
Nakon drugog premotavanja i podjele na vrpci T3 se nalaze 0,1,2,3, dok se na T4 nalaze
4,5,6,7. Ova metoda završava kopiranjem sadržaja sa T4 na T3. Broj izvedenih prolazaka je
jednak duljini vanjske staze stabla podijeljenoj brojem vanjskih čvorova.
Vanjsko bazno sortiranje pojavljuje se i u obliku čitanja sadržaja vrpci unazad, te se
tada susrećemo s pojmom T-lifo stabla. Iako, ova vrsta sortiranja nije u potpunosti efikasna
vrlo je zanimljiva zbog svojih metoda parcijalnog prolaska jer se pojavila prije u literaturi o
vanjskom baznom sortiranju (1946.) nego u literaturi o spajanju (1960.). U većini slučajeva
bazno sortiranje je inferiornije od sortiranja spajanjem jer tehnika zamjena izbora sortiranju
spajanjem daje bitnu prednost. Oscilirajuće bazno sortiranje tvori međupodatke koji su manji
nego što memorija može učitati tako da podjela odgovara stablu s većim brojem vanjskih
čvorova i ima niz prednosti naspram korištenja zamjene odabranog ili spajanja. Vanjska
duljina staze stabla slijedno se povećava, odnosno vrijeme sortiranja.
Ako je domet znakova vrlo mali na način da skupina zapisa znakovima koje posjeduje
bude ispunila unutarnju memoriju dvaput i više tada je bolje koristiti bazno sortiranje.
Unutarnje bazno sortiranje je superiornije nad spajanjem na određenim brzo protočnim
računalima jer unutarnje petlje baznog sortiranja izbjegavaju kompleksno grananje. Brza
vanjska memorija pridonijet će stroju da spaja podatke dovoljno brzo i u skladu sa ulazno-
izlaznim jedinicama.
15
2.8. Dvo-vrpčano sortiranje
Dvo-vrpčano sortiranje (eng. Two-Tape Sorting) je kombinacija zamjena
odabranog i mjehuričastog sortiranja. Na vrpci T1 nalazi se ulaz i čitanje započinje od P+1 u
memoriji. Zapis koji ima najmanji znak stavlja se na vrpcu 2 i zamjenjuje se novim ulaznim
zapisom. Kada na ulazu više ne postoji zapisa, najveći P znak datoteke će biti prisutan u
memoriji, a rezultat je opadajući niz znakova. Zatim se obje vrpce premotavaju i proces se
ponavlja na način da čita s vrpce T2 i zapisuje na T1. Svakim prolazom stavlja se za P više
zapisa na za to određena mjesto. Ako je veličina datoteke nezamjetno veća od veličine
memorije i brzina sortiranja će biti veća, također dvo-vrpčano sortiranje možemo koristiti i
kad nam je potrebna dodatna slobodna jedinica.
Slika 2.8.1. Prikaz vrpci 0 i 1 [Knuth, 1998., str. 354]
Slika (2.8.1.) iznad prikazuje vrpcu 0 i vrpcu 1 kao dva stoga čijim bi spajanjem
nastala linearna lista i na kojoj bi se trenutačne pozicije mogle premještati s desne na lijevu
stranu i obrnuto kopirajući s jednog stoga na drugi. Vrijeme izvođenja ovog algoritma ogleda
se u tome da su podaci spremljeni u direktnom slijedu pa je vjerojatnost da postoje dva ista
znaka nikakva. Metoda baznog sortiranja također se može primijeniti na dvo-vrpčano jer se
sama ideja temelji na čitanju datoteke više od jedanput i sličnosti s Quicksort-om. Ulazni
podaci na T1 kopirat će se na vrpcu T2 čiji znakovi u binarnoj notaciji završavaju s 0. Kada
premotamo T1, ponovno je čitamo i zapisujemo znakove kojima je zadnja znamenka 1.
Premotavanjem obje vrpce dobijemo sličan par prolaza i zamjenjuju se uloge T1 i T2, ali onda
gledamo drugi bit najmanjeg značaja. Do tad se u T1 nalaze zapisi (..00)2, a zatim slijede (…
01)2,…,(…10)2 ,…(11)2. Ako su znakovi za b bitova duži, onda treba samo 2b prolaza kroz
podatke kako bi se izvršilo sortiranje. F.C.Hennie i R.E.Stearns kreirali su sortiranje i nazvali
ga simulacija više vrpci čime su prikazali da je traka vrpce koja je potrebna, složenosti O(log
L) gdje je L maksimalna duljina prolaza kroz vrpcu kod uravnoteženog spajanja. Sortiranje
quicksort-om složenosti O(N(logN)2) je više akademske vrijednosti jer bi u suprotnom bilo
potrebno 37 sati kako bi se podaci efikasno sortirali.
16
Mono-vrpčano sortiranje objašnjeno je na primjeru transporta ljudi između katova
koristeći samo jedno dizalo. Ako u obzir uzmemo dizalo sa n katova i c brojem ljudi za koje
na svakom katu postoji prostor određenog kapaciteta. U zgradi nema vrata, prozora ni
stepenica već samo ima dizalo koje se može zaustaviti na svakom katu. Postoji cn ljudi u
zgradi, od toga c ljudi želi ići na određeni kat, a najviše b ljudi se može nalaziti u dizalu.
Zadatak je da se ljudi u dizalu prevezu što brže od točke A do točke B, odnosno od kata i do
kata i+1. U ovom slučaju ljudi predstavljaju zapise, a zgrada je vrpca. Katovi tvore
pojedinačne blokove na vrpci, a dizalo je unutarnja računalna memorija. Dizalo će napraviti
najmanje uk/b prijelaza od kata do kata, gdje uk predstavlja ukupan broj ljudi na svakom katu.
Zaključak ovog primjera je Teorem K koji kaže da ako je uk>0 za 1≤k<n onda dizalo u
najmanjem vremenskom roku svakoga dovozi do željenog odredišta.
17
3. Zaključak
Različite vrste vanjskog sortiranja pokrivat će različite potrebe programera.
Činjenica je da ćemo kod malog broja podataka koristiti unutarnje sortiranje jer je kapacitet
glavne memorije sasvim dovoljan da obradi tu količinu podataka. S druge strane vanjsko
sortiranje ćemo koristiti kod većeg broja podataka i svoj naziv je dobio po tipu memorije koju
koristi, a to je vanjska memorija, odnosno najčešće hard drive.
Strategija vanjskog sortiranja jest u kombinaciji sortiranja i spajanja gdje u fazi
sortiranja manje dijelove podataka dostatne za glavnu memoriju čita, sortira i zapisuje u
privremenu memoriju, a u fazi spajanja sortirani podaci se spajaju u veću jedinstvenu
datoteku.
Najbitniji dio samog algoritma jest u ocjeni njegove efikasnosti. Ako se natječemo s
vremenom onda se nećemo oslanjati na samu snagu i brzinu računala već ćemo nastojati
koristiti algoritme i strukture podataka koji mogu u kratkom vremenskom roku obraditi
određenu količinu podataka ovisno o potrebama korisnika.
18
Literatura
1. J. S. Vitter, Algorithms and Data Structures for External Memory, Series on
Foundations and Trends in Theoretical Computer Science, now Publishers, Hanover,
MA, 2008.
2. Donald Knuth, The Art of Computer Programming, Volume 3: Sorting and Searching,
Second Edition. Addison-Wesley, 1998, Section 5.4: External Sorting, (248–379.str.)
3. Chasing State of the Art - External Merge Sort (2010.) Dostupno 22.12.2010. na
http://dzmitryhuba.blogspot.com/2010/08/external-merge-sort.html
4. External Sorting (2009.) Dostupno 22.12.2010. na
www.cs.rutgers.edu/~muthu/lec9-04.ppt
5. Tutorial on External Sorting (2010.) Dostupno 22.12.2010. na
http://www.csd.uoc.gr/~hy460/0607Fall/lectures/CS460SortMergeTutorial06.pdf
19