7) Radix-sortering sekvensielt kode og effekten av cache

Like dokumenter
INF2440 Uke 8, v2016 : Om Oblig 3 - radixsortering, Ulike Threadpools, JIT-kompilering. Arne Maus PSE, Inst. for informatikk

INF2440, Uke 3, våren2015 Regler for parallelle programmer, mer om cache og Radix-algoritmen. Arne Maus OMS, Inst. for informatikk

INF2440, Uke 3, våren2014 Regler for parallelle programmer, mer om cache og Radix-algoritmen. Arne Maus OMS, Inst. for informatikk

INF2440 Uke 4, våren2014 Avsluttende om matrisemultiplikasjon og The Java Memory Model + bedre forklaring Radix. Arne Maus OMS, Inst.

INF2440 Uke 9, v2017 : Om Oblig 3 - radixsortering, Ulike Threadpools, JIT-kompilering. Arne Maus PSE, Inst. for informatikk

UNIVERSITETET I OSLO

INF2440 Uke 12, v2014. Arne Maus OMS, Inst. for informatikk

INF2440 Uke 4, v2017 Om å samle parallelle svar, matrisemultiplikasjon og The Java Memory Model + evt bedre forklaring Radix

INF2440 Uke 4, v2015 Om å samle parallelle svar, matrisemultiplikasjon og The Java Memory Model + evt bedre forklaring Radix

INF2220 høsten 2017, 12. okt.

INF2440 Uke 11, v2014 om parallell debugging og Goldbachs problem, om Oblig 3. Arne Maus OMS, Inst. for informatikk

INF2220 høsten 2015, 5. nov.

INF2220 høsten 2016, 9. nov.

UNIVERSITETET I OSLO

Parallellprogrammering og Sortering INF nov. 2015

INF2220 høsten 2017, 19. okt.

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

INF2220: Time 12 - Sortering

Løsningsforslag 2017 eksamen

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Prøveeksamen INF2440 v Arne Maus PSE, Inst. for informatikk

UNIVERSITETET I OSLO

INF2440 Uke 11, v2015 om parallell debugging og Goldbachs problem, om Oblig 2,3 og 4. Arne Maus PSE, Inst. for informatikk

INF2440 Uke 6, våren2014 Mer om oppdeling av et problem for parallellisering, mye om primtall + thread-safe. Arne Maus OMS, Inst.

INF1010 Sortering. Marit Nybakken 1. mars 2004

UNIVERSITETET I OSLO

Norsk informatikkolympiade runde

Løsnings forslag i java In115, Våren 1996

Algoritmer - definisjon

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Norsk informatikkolympiade runde

INF2440 Uke 10, v2018 : Arne Maus PSE, Inst. for informatikk

INF1020 Algoritmer og datastrukturer

IN3030 Uke 12, v2019. Eric Jul PSE, Inst. for informatikk

Quicksort. Fra idé til algoritme.

Liste som abstrakt konsept/datatype

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2015

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

8NH )RUHOHVQLQJ 'HSDUWPHQWÃRIÃ,QIRUPDWLFVÃ8QLYHUVLW\ÃRIÃ2VORÃ1RUZD\,1) ± $OJRULWKPVÃÉÃ'DWDÃ6WUXFWXUHV

INF1010 notat: Binærsøking og quicksort

UNIVERSITETET I OSLO

Binær heap. En heap er et komplett binært tre:

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

UNIVERSITETET I OSLO

Turingmaskiner.

INF2440 Eksamen 2016 løsningsforslag. Arne Maus, PSE ifi, UiO

Konvertering mellom tallsystemer

UNIVERSITETET I OSLO

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2440 Uke 11, v2017 om Goldbachs problem og Oblig 2,3. Arne Maus PSE, Inst. for informatikk

INF2440 Uke 5, våren2015 Om oppdeling av et problem for parallellisering, mye om primtall + thread-safe. Arne Maus PSE, Inst.

Øvingsforelesning 4. Martin Aasen

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Norsk informatikkolympiade runde

Oppgave 1a Definer følgende begreper: Nøkkel, supernøkkel og funksjonell avhengighet.

INF2440 Uke 14, v2015. Arne Maus PSE, Inst. for informatikk

INF3030, Uke 3, våren 2019 Regler for parallelle programmer, mer om cache og Matrise-multiplikasjon. Arne Maus / Eric Jul PSE, Inst.

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

KONTROLLSTRUKTURER. MAT1030 Diskret matematikk. Kontrollstrukturer. Kontrollstrukturer. Eksempel (Ubegrenset while-løkke)

Forelesning 2. Flere pseudokoder. Representasjoner av tall. Dag Normann januar 2008 KONTROLLSTRUKTURER. Kontrollstrukturer. Kontrollstrukturer

Sortering i Lineær Tid

Algoritmer - definisjon

EKSAMEN. Emne: Algoritmer og datastrukturer

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Binære trær: Noen algoritmer og anvendelser

EKSAMEN. Algoritmer og datastrukturer

b) 17 går ikke opp i 84 siden vi får en rest på 16 når 84 deles med 17 c) 17 går opp i 357 siden

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Om Kurset og Analyse av Algoritmer

Algoritmer og datastrukturer Eksamen

Norsk informatikkolympiade runde

Norsk informatikkolympiade runde

Alle hele tall g > 1 kan være grunntall i et tallsystem.

Algoritmer og datastrukturer Eksamen 22. februar 2011

EKSAMEN med løsningsforslag

Kapittel 8: Sortering og søking

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2013

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2016

Forelesning 5. Diverse komponenter/større system

UNIVERSITETET I OSLO

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Pensum: 3. utg av Cormen et al. Øvingstime: I morgen, 14:15

INF Algoritmer og datastrukturer

Kapittel 9: Sortering og søking Kort versjon

Transkript:

) Radix-sortering sekvensielt kode og effekten av cache Dels er denne gjennomgangen av vanlig Radix-sortering viktig for å forstå en senere parallell versjon. Dels viser den effekten vi akkurat så tilfeldig oppslag i lageret med korte eller lange arrayer b[] i uttrykk som a[b[i]] kan gi uventede kjøretider. Ideen bak Radix er å sortere tall etter de ulike sifrene de består av og flytte de frem og tilbake mellom to arrayer a[] og b[] slik at de stadig blir sortert på ett siffer mer.

Om høyre, minst signifikant siffer først Radix Radix-sortering, her vist varianter: R: Radix-sortering med ett siffer R: Radix-sortering med to sifre R: Radix-sortering med tre sifre Alle tre består av to metoder: radix,radix eller radix som Først regner ut max-verdien i a[]. Så regnes ut noen konstanter som antall bit i det/de sifrene a[] skal sorteres med. Deretter kalles metoden for hvert siffer det skal sorteres etter radix radix radix

Den første av to algoritmer som -siffer Radix består av. radix static void radix(int [] a) { // digit : a[] int max = a[], numbit =, n =a.length; // finn max verdi i a[] for (int i = ; i < n ; i++) if (a[i] > max) max = a[i]; while (max >= (<<numbit) )numbit++; // antall siffer i max // bestem antall bit i siffer og siffer int bit = numbit/, bit = numbit-bit; } int[] b = new int [n]; ( a,b, bit, ); // første siffer fra a[] til b[] ( b,a, bit, bit);// andre siffer, tilbake fra b[] til a[]

radix /** Sort a[] on one digit ; number of bits = masklen, shiftet up shift bits */ static void ( int [] a, int [] b, int masklen, int shift){ int acumval =, j, n = a.length; int mask = (<<masklen) -; int [] = new int [mask+]; // a) =the frequency of each radix value in a for (int i = ; i < n; i++) [(a[i]>> shift) & mask]++; // b) Add up in '' - accumulated values for (int i = ; i <= mask; i++) { j = [i]; [i] = acumval; acumval += j; } // c) move numbers in sorted order a to b for (int i = ; i < n; i++) b[[(a[i]>>shift) & mask]++] = a[i]; }// end

a... m - Figure. The use of array in any radix algorithm when sorting on a digit with numbit bits. The illustration is after sorting. We see that there are two elements in a[] with the value on that digit, elements with value,,and element with value numbit -.

Forklaring av: [(a[i]>> shift) & mask]++; del Tar det innenfra og ut; a[i]>> shift Ethvert ord i lageret består a -ere og -ere (alt er binært) Java har flere shift-operasjoner feks.: a[i]>>b betyr: shift alle bit-ene i a[i] b antall plasser til høyre og fyll på med b stk -er på venstre del av a[i]. a[i]<<b betyr: shift alle bitene i a[i] b antall plasser til venstre og fyll på med b stk -er på høyre del av a[i]. De bit-ene som shiftes ut av a[i] går tapt i begge tilfeller. a<< er det samme som a*, a<< er det samme som a*, a<<k er det samme som a* k Ett element i a[]: bit masklen shift mask = masklen ere

Forklaring av: [(a[i]>> shift) & mask]++; del Java har flere bit-logiske operasjoner, for eksempel & (og): a & b er et tall som har -ere der både a og b har en -ere, og resten er. Eks: a& = et tall som er null over alt unntatt i bit som har samme bit-verdi som bit i a. Vi kan betrakte b som en maske som plukker ut de bitverdiene i a hvor b har -ere. Poenget er at: (a[i]>> shift) & mask er raskeste måte å finne hvilken verdi a[] har for et gitt siffer (sifferverdien) : Først skifter vi bit-ene i a[i] ned slik at sifferet vi er interessert i ligger helt nederst til høyre. Så &-er vi med en maske som bare har -ere for så mange bit vi har i det sifferet vi er interessert i nederst (og ellers). [(a[i]>> shift) & mask] er da det elementet i [] som har samme indeks som sifferverdien i a[i]. Det elementet i [] øker vi så med (++ operasjonen)

Eksempel (shift = og mask =) vi vil ha dre siffer a[i] = (i 8-tallsystemet)=.. a[i] >> =.. (a[i] >>) &.. =.. = Vi kan velge fritt hvor lange (antall bit) sifre og hvor mange sifre vi vil ha sortere på, men summen av antall bit i sifrene vi sorterer på må være større eller lik antall bit i max, det største tallet i a[]. Et godt valg er å ha en øvre grense på bit-lengden av et siffer f.eks =, og da heller ta så mange sifre det trengs for å sortere a[]. 8

Stegene i en radix-sortering radix,,eller: Finn maks verdi i a[] og bestem antall sifre med mer. FinnMax har vi parallellisert (en gang for hvert siffer): a) Tell opp hvor mange det er i a[] med de ulike mulige sifferverdiene på dette sifferet. b) Adder sammen verdiene til en array som sier hvor vi skal flytte et element i a[] med en gitt sifferverdi. c) Flytt elementene fra a[] til b[] slik at de minste verdier kommer øverst,..osv d) Kopier b[] tilbake til a[] (trenges ikke i radix,radix,..) Stegene a, b og c skal vi senere parallellisere (d kan fjernes) 9

Hva viser dette om cachen? manglende caching av data for Radix gir lengere kjøretider Radix med ganger så lang kode som Radix går jevnt over - ganger så fort når n>! Radixmed ganger så lang kode som Radix går ganger så fort når n > mill.

Radix-sortering den sekvensielle algoritmen Vi aksepterer at vi forrige gang greide å finne verdien av et siffer i a[]: (a[i]>> shift) & mask regner ut sifferverdien av et siffer i a[i] som : Har ett eller flere sifre til høyre for seg (mindre signifikante) som til sammen i sum har shift bit Mask inneholder så mange -ere nederst som det er bit i det sifferet vi vil finne nå og er ellers. Anta at vi skal sortere denne a[] på to sifre, a

Høyre, minst signifikant siffer først sortering på to sifre: Radix som vi nå bruker Radix-sortering, nå siffer: Radix: Radix-sortering på to sifre Radix bestås av to metoder: radix som først regner ut max-verdien i a[]. Så regnes ut noen konstanter, som antall bit i de to sifrene a[] skal sorteres med. Deretter kalles metoden for hvert av de to sifrene (dvs. to ganger) radix

Stegene i en : a) Tell opp i en array slik at [k] = hvor mange ganger k er en sifferverdi a[]. Eks. hvor mange tall i a[] = i dette sifferet? b) Legg sammen antallene i slik at [k] sier hvor i b[] vi skal plassere første element i a[] vi finner med sifferverdien k c) Finn sifferverdien i a[k] og flytt a[k] til b[] der [sifferverdien] sier a[k] skal være. Øk [sifferverdien] med til neste plass i b[]

Radix-sortering steg a) første, bakerste siffer Vi skal sorterere på siste siffer med bit sifferlengde (tallene -) a) Tell opp sifferverdier i []: a Før telling: Etter telling:

Radix-sortering steg b) finne ut hvor sifferverdien skal plasseres De a[i] ene som inneholder j hvor skal de flyttes sortert inn i b[]? - Hvor skal -erne stare å flyttes, -erne,.osv b) Adder opp sifferverdier i []: Før addering: Etter addering : b Kan også sies sånn: Første -er vi finner plasserer vi b[], første -er i b[] fordi det er stk -ere og de må først. -erne starter vi å plassere i b[] fordi stk -ere og stk -ere må før -erne,.osv.

Radix-sortering steg c) flytt a[k] til b[] der [s] peker, hvor s= sifferverdien i a[k] a c) flytt a[k] til b[] der [s] peker, hvor s= sifferverdien i a[k], øk [s] med. Før flytting Før flytting b Etter flytting b

Så sortering på siffer fra b[] til a[] trinn a) og b) b Etter telling på siffer : Etter addering : a

Så sortering på siffer fra b[] til a[] trinn c) b Etter telling på siffer : Etter addering : a

Situasjonen etter sortering fra b[] til a[] på siffer Etter flytteing b a a[] er sortert!