Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset.

Samankaltaiset esitykset


Esitys aiheesta: "Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset."— Esityksen transkriptio:

1 Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset viisinumeroisen postinumeron ensimmäisen numeron perusteella kymmeneen pinoon: yhdessä on 0:lla alkavat toisessa on 1:llä alkavat, jne. Sama prosessi voidaan rekursiivisesti toistaa yksittäisille pinoille käyttäen postinumeron toista numeroa (R=10)

2 Jakolajittelun lähestymistavat Eniten merkitsevän numeron jakolajittelu Tutkivat minimimäärän informaatiota lajittelun suorittamiseksi Yleistävät pikalajittelun Vähiten merkitsevän numeron jakolajittelu Numeroita tutkitaan oikealta vasemmalle

3 Binäärisen pikalajittelun eteneminen A00001 S10011 O01111 R10010 T10100 I01001 N01110 G00111 E00101 X11000 A00001 M01101 P10000 L01100 E00101 A00001 E00101 O01111 L01100 M01101 I01001 N01110 G00111 E00101 A00001 X11000 T10100 P10000 R10010 S10011 A00001 E00101 A00001 E00101 G00111 I01001 M01101 N01110 L01100 O01111 S10011 T10100 P10000 R10010 X11000 A00001 A00001 E00101 E00101 G00111 I01001 N01110 M01101 L01100 O01111 S10011 R10010 P10000 T10100 X11000 A00001 A00001 E00101 E00101 G00111 I01001 L01100 M01101 N01110 O01111 P10000 R10010 S10011 T10100 X11000 A00001 A00001 E00101 E00101 G00111 I01001 L01100 M01101 N01110 O01111 P10000 R10010 S10011 T10100 X11000

4 Binäärisen pikalajittelun bittipuu Seuraamalla polkua juuresta solmuun ja ottamalla 0:n vasemmille haaroille ja 1:n oikeille haaroille saadaan avaimen bitit jotka erottavat sen muista avaimista A00001 A00001 E00101 E00101 G00111 I01001 L01100 M01101 N01110 O01111 P10000 R10010 S10011 T10100 X11000 X T LMRSNO A EG I P

5 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } Jaetaan tiedosto avaintavun eniten merkitsevän bitin perusteella, jonka jälkeen lajittelua jatketaan rekursiivisesti.

6 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

7 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

8 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

9 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

10 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

11 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

12 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=1, j=3

13 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=3

14 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=3

15 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=2

16 Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=2 a[i]:n w:nen bitin arvo on 1 paitsi, jos kaikki w:net bitit ovat nollia

17 Eniten merkitsevän numeron jakolajittelun eteneminen ace ago and bet cab caw cue dim dug egg fee few for gig hut ilk jam jay jot joy ace ago and bet cab caw cue dim dug egg few fee for gig hut ilk jay jam jot joy ace ago and bet cab caw cue dim dug egg for few fee gig hut ilk jam jay jot joy for ilk dim jot hut ace bet egg few jay joy gig cab caw cue fee ago jam dug and

18 Eniten merkitsevän numeron jakolajittelu #define R (1 << bittejatavussa) #define numero(A, B) A[B] #define lokero(A) l+lkm[A] alkio apu[ALKIOITA_MAX]; void jakolajitteluEMN(alkio a[], int l, int r, int w) { int i, j, lkm[R + 1]; if(w > tavujasanassa) return; if(r - l <= M) { lisayslajittelu(a, l, r); return; } for(j = 0; j <= R; j++) lkm[j] = 0; for(i = l; i <= r; i++) lkm[numero(a[i], w) + 1]++; for(j = 1; j < R; j++) lkm[j] += lkm[j - 1]; /* lkm[j] on ’<j’ alkioiden lkm */ for(i = l; i <= r; i++) apu[l + lkm[numero(a[i], w)]++] = a[i]; for(i = l; i <= r; i++) a[i] = apu[i]; jakolajitteluEMN(a, l, lokero(0) - 1, w + 1); for(j = 0; j < R - 1; j++) jakolajitteluEMN(a, lokero(j), lokero(j + 1) - 1, w + 1); } Johdettu jakaumalajittelusta: avain viittaukset -> viittaukset avaimien osiin + rekursiiviset kutsut numero(a[i], 0)]] on lajiteltavan tiedoston i:nen tietueen eniten merkitsevä tavu Alkiot joiden nykyisen tavun, w, arvo on j ovat välillä [lokero(j),lokero(j+1))

19 Vähiten merkitsevän numeron jakolajittelun eteneminen ace ago and bet cab caw cue dim dug egg fee few for gig hut ilk jam jay jot joy cab jam caw jay ace fee bet few egg ago gig dim ilk and for jot joy cue dug hut cab and ace cue fee egg gig dug ilk dim jam ago for jot hut bet few caw jay joy for ilk dim jot hut ace bet egg few jay joy gig cab caw cue fee ago jam dug and

20 Jakolajittelun oikeellisuus Oletetaan että luvut on lajiteltu t-1 vähiten merkitsevät numeron perusteella 720 329 436 839 355 457 657 329 355 436 457 657 720 839

21 Jakolajittelun oikeellisuus Oletetaan että luvut on lajiteltu t-1 vähiten merkitsevät numeron perusteella Lajitellaan t:n numeron perustella: Luvut joilla on eri t:s numero lajitellaan oikein, eikä t-1:llä arvolla ole merkitystä 720 329 436 839 355 457 657 329 355 436 457 657 720 839

22 Jakolajittelun oikeellisuus Oletetaan että luvut on lajiteltu t-1 vähiten merkitsevät numeron perusteella Lajitellaan t:n numeron perustella: Luvut joilla on eri t:s numero lajitellaan oikein, eikä t-1:llä arvolla ole merkitystä Luvut joilla on sama t:s numero laitetaan syötteen mukaiseen järjestykseen => oikea järjestys 720 329 436 839 355 457 657 329 355 436 457 657 720 839

23 Vähiten merkitsevän numeron jakolajittelu alkio apu[ALKIOITA_MAX]; void jakolajitteluVMN(alkio a[], int l, int r) { int i, j, w, lkm[R + 1]; for(w = tavujasanassa - 1; w >= 0; w--) { for(j = 0; j <= R; j++) lkm[j] = 0; for(i = l; i <= r; i++) lkm[numero(a[i], w) + 1]++; for(j = 1; j < R; j++) lkm[j] += lkm[j - 1]; for(i = l; i <= r; i++) apu[lkm[numero(a[i], w)]++] = a[i]; for(i = l; i <= r; i++) a[i] = apu[i]; } Toimii ainoastaan stabiilin lajittelualgoritmin kanssa. Kun avaimet on stabiilisti lajiteltu niiden i:n viimeisen tavun mukaiseen järjestykseen: 1)Ensimmäiset tavut ovat samat => avaimet ovat järjestyksessä stabiiliuden perusteella 2)Ensimmäiset tavut ovat erilaiset => i:n viimeisen tavun mukaisella järjestyksellä ei ole väliä, myöhemmmät iteraatiot järjestävät


Lataa ppt "Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset."

Samankaltaiset esitykset


Iklan oleh Google