acm icpc praktikum

17
ACM ICPC Praktikum Kapitel 4: Sortieren

Upload: avalon

Post on 13-Jan-2016

23 views

Category:

Documents


0 download

DESCRIPTION

ACM ICPC Praktikum. Kapitel 4: Sortieren. Übersicht. Problem und Anwendungen Bubblesort Bucketsort Mergesort Topologisches Sortieren. 2. 5. 1. 7. 8. 4. 1. 2. 4. 5. 7. 8. Problem. Sortierproblem: Gegeben: Folge x 1 ,x 2 ,…,x n - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ACM ICPC  Praktikum

ACM ICPC Praktikum

Kapitel 4: Sortieren

Page 2: ACM ICPC  Praktikum

Übersicht

• Problem und Anwendungen

• Bubblesort

• Bucketsort

• Mergesort

• Topologisches Sortieren

Page 3: ACM ICPC  Praktikum

Problem

Sortierproblem:

• Gegeben: Folge x1,x2,…,xn

• Gesucht: Sortierung :{1,…,n} ! {1,…,n}, so dass x(1) <= x(2) <= … <= x(n)

2 5 1 7 8 4

1 2 4 5 7 8

Page 4: ACM ICPC  Praktikum

Anwendungen• Eindeutigkeitstest: Wie können wir testen, dass alle Werte in einer

Folge verschieden sind?• Duplikatentfernung: Wie können wir alle bis auf ein Duplikat für

jedes Element entfernen?• Scheduling: Eine optimale Regel zum Scheduling von uniformen

Jobs mit Deadlines ist “Earliest Deadline First (EDF)”, was eine Sortierung benötigt.

• Median: Wir wollen das k-tgrößte Element einer Folge finden.• Häufigkeitszählung: Was ist das am häufigsten vorkommende

Element in einer Folge?• Vereinigung oder Schnitt: Ist einfach, wenn die beiden Teilmengen

in sortierte Folge gegeben sind.• Gibt es x und y mit x+y=z? Sortiere die Folge S. Laufe mit i aufwärts

beginnend mit 1 und mit j abwärts beginnend mit n. Prüfe, ob S[i]+S[j]=z. Falls <, dann erhöhe i, und sonst erniedrige j.

Page 5: ACM ICPC  Praktikum

Bubblesort

• Idee: Vergleich benachbarter Einträge.

bubblesort(int s[1..n], int n){ for i=1 to n-1 do { for j=1 to i do if (s[j+1]<s[j]) then swap(s[j],s[j+1]) }}

Page 6: ACM ICPC  Praktikum

Bucketsort

• Idee: falls Werte in ganze Zahlen in [a,b], allokiere Array dafür

bucketsort(int s[1..n], int n) { // allocate array num[a..b] for i=a to b do num[i]=0; for i=1 to n do num[s[i]]++; i=1; j=a; while i<=n do { while num[j]=0 do j=j+1; for k=0 to num[j]-1 do s[i+k]=j; i = i+num[j]; }}

Page 7: ACM ICPC  Praktikum

Mergesort

• Idee: verschmelze Teillisten in größer werdende Listen

mergesort(int s[1..n], int n) { // n: power of 2, otherwise filled with (MAXINT-1)’s for size=1 to n/2 do { a[size+1] = MAXINT; // a[1..size+1] for one list b[size+1] = MAXINT; // b[1..size+1] for other list for i=1 to n/(2*size) do { // prepare for merging for j=1 to size do a[j] = s[2*(i-1)*size+j]; for j=1 to size do b[j] = s[(2*i-1)*size+j]; k = 1; l=1; // merge for j=2*(i-1)*size+1 to 2*i*size do if a[k]<b[l] then { s[j]=a[k]; k=k+1; } else { s[j]=b[l]; l=l+1; } } } }

Page 8: ACM ICPC  Praktikum

Suchen in sortierter Folge

• Binäre Suche

O(log n) Zeit

Page 9: ACM ICPC  Praktikum

Topologisches Sortieren

• Eingabe: azyklischer gerichteter Graph G=(V,E), V={1,…,n}

• Ausgabe: Ordnung :{1,…,n} ! {1,…,n} auf Knoten, so dass für alle Kanten (i,j) 2 E gilt (i)<(j).

• Algorithmus:Breitensuche, angefangen mit Knoten ohne eingehende Kante.

Page 10: ACM ICPC  Praktikum

Topologisches Sortieren

Datenstrukturen:

class edge { node *dest; edge *next;};

class node { int indeg; // # incoming edges edge *out; // link to outg. edges};

toposort(node v[1..n], int s[1..n], int n) { i=1; for j=1 to n do if v[j].indeg=0 then { s[i]=j; i=i+1; } b=1; e=i; // begin and end in s[] while b<e do { for j=b to e-1 do { l = v[s[j]].out; while l<>NULL do { l->dest->indeg--; if l->dest->indeg=0 then { s[i]=l->dest; i=i+1; } l = l->next; } } b = e; e=i; } } }

Page 11: ACM ICPC  Praktikum

2-dimensionales Sortieren

• Welche Struktur erlaubt schnelle Suche?

• Delaunay Triangulierung.

• Wird noch in Geometrie behandelt…

Page 12: ACM ICPC  Praktikum

Problem I

Vito’s Familie:

• Eingabe: ganze Zahlen s1,…,sr,0<r<500, 0<si<30000

• Ausgabe: Position p, die Summe der paarweisen Distanzen zu allen si minimiert.

Page 13: ACM ICPC  Praktikum

Problem II

Stacks of Pancakes:• Eingabe: Mehrere Stapel von Pfannkuchen,

jeder bestehend aus 1-30 Pfannkuchen. Jeder Pfannkuchen hat ganzzahligen Durchmesser zwischen 1 und 100.

• Ausgabe: Sortiere jeden Stapel durch Flip-Operationen, wobei Flip(i) alle Pfannkuchen von Position i aufwärts einmal umdreht.

Page 14: ACM ICPC  Praktikum

Problem III

Bridge:• Eingabe: n Personen mit ganzahligen

Geschwindigkeiten, um den Fluss zu überqueren.

• Ausgabe: Plan mit minimaler Zeit, um alle Personen über den Fluss zu bringen. Die Beschränkung ist, dass es nur ein Boot gibt und höchstens zwei darin sitzen können. Der langsamste bestimmt die Geschwindigkeit des Bootes.

Page 15: ACM ICPC  Praktikum

Problem III

Longest Nap:

• Eingabe: Ein Tag mit Terminen, gegeben durch „Zeit1 Zeit2 Termin“.

• Ausgabe: Finde längste Pause zwischen den Terminen.

Page 16: ACM ICPC  Praktikum

Problem IV

Shoemaker’s Problem:• Eingabe: N Schuhaufträge, Schuhauftrag i

benötigt Ti Tage und für jede Verzögerung um einen Tag muss eine Strafe von Si Cents bezahlt werden. Der Schuhmacher kann nur an einem Schuh pro Tag arbeiten.

• Ausgabe: Reihenfolge der Schuhaufträge, die die geringste Strafe verursacht.

Page 17: ACM ICPC  Praktikum

Problem V

CDVII:• Eingabe: Gebührentabelle mit einem Eintrag pro

Stunde des Tages und eine Reihe von Enter und Exit Ereignissen, bestehend aus „Nummernschild Monat:Tag:Stunde:Minute“ und der Entfernung zum Ende der Autobahn. Die Rechnung multipliziert die Gebühren mit den gefahrenen Kilometern, enthält einen Dollar pro Fahrt und zwei Dollar als Grundgebühr.

• Ausgabe: Gib die Rechungen für die Nummernschilder aus.