Prioritetskøer og hobe Philip Bille
Plan Prioritetskøer Træer Hobe Repræsentation Prioritetskøoperationer Konstruktion af hob Hobsortering
Prioritetskøer
Prioritetskø Vedligehold en dynamisk mængde S af elementer. Hver element x er tilknyttet en nøgle x.key. Insert(x): sæt S = S cup {x}. Max(): returner element med største nøgle. Extract-Max(): fjern og returner element med største nøgle. Increase-Key(x, k): sæt x.key = k (vi antager k er større end x.key).
Anvendelser Hvad kan vi bruge en prioritetskø til? Skedulering Korteste veje i grafer (Dijkstras algoritme + venner) Mindste udspændende træer i grafer (Prims algoritme) Kompression (Huffmans algoritme)
Implementation Hvordan kan vi implementere en prioritetkø med nuværende teknikker? Med hægtet liste: O(n) for Insert, Max, Extract-Max og Increase-Key Med sorteret hægtet liste: O(1) for Max, Extract-Max O(n) for Insert og Increase-Key. Kan vi gøre det betydeligt bedre? Kræver nye teknikker!
Træer
Rodfæstet træ T. Består af knuder og kanter. Børn, forælder, efterkommer, forfader, blade, interne knuder. Acyklisk sammenhængende graf.
Lad v være en knude i T. dybden af v = længden af sti fra v til roden. højden af v = længden af længste sti fra v til en bladefterkommer. dybden af T = højden af T = længden af længste sti fra rod til et blad.
Binært træ = alle knuder har 2 børn, kaldet venstre barn og højre barn.
Komplet binært træ = alle interne knuder netop 2 børn. Næsten komplet binært træ = komplet binært træ hvor 0 eller flere blade er fjernet fra højre mod venstre. Hvad er sammenhæng mellem antallet af knuder og højden af (næsten) komplet binært træ?
n = antal knuder, h = højden. Antal blade = 2 h Antal interne knuder = 1 + 2 + 4 + + 2 h-1 = 2 h - 1 n = 2 h + 2 h - 1 = 2 h+1-1 h = Θ(log n) (gælder også for næsten komplet binært træ)
31 20 16 k 7 11 13 10 k k 3 5 2 9 12 En hob (heap) er et næsten komplet binært træ så hver knude indeholder et element hver knudes nøgle et højst ligeså stor som dens forælders (hob-orden) Kaldes en max-hob. Tilsvarende kan man definere min-hob.
Repræsentation af hobe Hvordan kan vi repræsentere en hob? Vi har brug for effektivt at kunne navigere mellem børn og forælder.
31 20 16 7 11 13 10 3 5 2 9 12 root null 31 20 16 7 11 13 null null 10 null 3 null null 5 null null null 2 null null 9 null null 12 null
31 1 20 2 16 3 7 11 13 10 4 5 6 7 3 5 2 9 12 8 9 10 11 12 31 20 16 7 11 13 10 3 5 2 9 12 1 2 3 4 5 6 7 8 9 10 11 12 31 20 16 7 11 13 10 3 5 2 9 12 Tabel H[1..n]. H[1] er rod, H[n] er blad længst til højre. Knude i har venstre barn på 2i, højre barn på 2i+1 og forælder på i/2
Prioritetskøoperationer Hvordan kan vi implementere prioritetskøoperationerne? Insert(x): sæt S = S {x}. Max(): returner element med største nøgle. Extract-Max(): fjern og returner element med største nøgle. Increase-Key(x, k): sæt x.key = k (vi antager k er større end x.key).
Insert(x): Indsæt x på næste ledige plads i tabel. Bobl op. Max(): Returner toppen af hob i A[1] Extract-Max() r = top af hob. Flyt blad længst til højre til top af hob. Bobl ned (Max-Heapify) Returner r. Increase-Key(x,k) Sæt x.key = k Bobl op.
Analyse Køretid: Insert, Extract-Max, Increase-Key i O(log n) tid Max i O(1) tid. Pladsforbrug: O(n) plads. Eksempel på implicit datastruktur.
Konstruktion af hob
Konstruktion af hob Lav A[1..n] være en tabel af heltal. Hvordan kan vi effektivt bygge en hob ud af tallene i A? (præprocessering)
Første forsøg Sæt alle elementer i A ind i hoben med n Insert operationer. Tid: Θ(n log n) Bygger hoben "oppefra og ned". Kan vi gøre det bedre?
Andet forsøg Opfat A som næsten komplet binært træ og Etabler hoborden nedefra og op for alle knuder Blade er allerede hobe af størrelse 1. For hver intern knude, bobl ned. Hvor hurtigt kører det?
For hver knude af højde h: O(h) tid. ~ n/2 knuder af højde 1, n/4 knuder af højde 2, n/8 knuder af højde 3,..., 1 knude af højde h. n/2 1 + n/4 2 + n/8 3 +... + 1 h = O(n) O(n) tid
Konstruktion af hob Givet en tabel A[1..n] kan vi bygge en hob i Θ(n) tid. Bruger kun O(1) ekstra plads.
Hobsortering
Hobsortering Lad A[1..n] være en tabel. Hobsortering: Byg hob af A. Lav n Extract-Max. Indsæt resultater sidst i tabel i stedet for at slette. Analyse. Byg en hob i Θ(n) tid n Extract-Max i Θ(nlog n) tid. i alt Θ(nlog n) tid.
Hobsortering Givet en tabel A[1..n] kan vi sortere i Θ(n log n) tid. Bruger kun O(1) ekstra plads. Ækvivalens af sortering og prioritetskøer.
Opsummering Prioritetskøer Træer Hobe Repræsentation Prioritetskøoperationer Konstruktion af hob Hobsortering