Enkellänkad lista header och sentinel

Relevanta dokument
Datastrukturer. föreläsning 10. Maps 1

Föreläsning Datastrukturer (DAT036)

Datastrukturer och algoritmer

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 9. Sortering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 11 Innehåll

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningar Datastrukturer TDA

Magnus Nielsen, IDA, Linköpings universitet

Träd Hierarkiska strukturer

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 7. Träd och binära sökträd

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Föreläsning 9 Innehåll

DAI2 (TIDAL) + I2 (TKIEK)

Datastrukturer. Föreläsning 5. Maps 1

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning 12 Innehåll

Tentamen Datastrukturer D DAT 036/INN960

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Seminarium 13 Innehåll

Tentamen Datastrukturer D DAT 036/INN960

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Föreläsning 13. Träd

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

SORTERING OCH SÖKNING

Föreläsning 13 Innehåll

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen kl Uppgift 4. Uppgift 5

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Föreläsning 5 TDDC91,TDDE22,725G97: DALG. Föreläsning i Datastrukturer och algoritmer 18 september 2018

Vad har vi pratat om i kursen?

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 10 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Teoretisk del. Facit Tentamen TDDC (6)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Magnus Nielsen, IDA, Linköpings universitet

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 12 Innehåll

Tentamen Datastrukturer för D2 DAT 035

Datastrukturer. föreläsning 6. Maps 1

Kapitel 7: Analys av sorteringsalgoritmer

Programkonstruktion och. Datastrukturer

Innehåll. F7: Tabell, hashtabell, relation & lexikon. Gränsyta till Tabell. Tabell. Tabell Hashtabell Relation Lexikon.

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 5 Datastrukturer (DAT037)

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Datastrukturer och algoritmer

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Föreläsning 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Föreläsning 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

Hashing Bakom kulisserna på Pythons dictionary

Föreläsning Datastrukturer (DAT037)

Informationsteknologi Tom Smedsaas 19 augusti 2016

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Föreläsning 6 Datastrukturer (DAT037)

Hashing Bakom kulisserna på Pythons dictionary

Hashing Bakom kulisserna på Pythons dictionary. Leta i listor Osorterade listor. Leta i listor Sorterade listor

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

Fillagring och indexering

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Programkonstruktion och. Datastrukturer

Föreläsning 6. Sökträd: AVL-träd, Multi-Way -sökträd, B-träd TDDC70/91: DALG. Innehåll. Innehåll. 1 AVL-träd

Datastrukturer som passar för sökning. Föreläsning 10 Innehåll. Inordertraversering av binära sökträd. Binära sökträd Definition

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Lösningsförslag till tentamen Datastrukturer, DAT037,

Algoritmer, datastrukturer och komplexitet

Föreläsning 8. Mängd, Avbildning, Hashtabell

Föreläsning 4 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 035/INN960

Tentamen Datastrukturer, DAT037 (DAT036)

Transkript:

Enkellänkad lista header och sentinel Enkellänkad lista List- och trädimplementering 1(6) Tom lista Enkellänkad lista med header Tom lista skapar strukturell enhetlighet för alla datanoder inget specialfall för pekaren till första datanoden

Enkellänkad lista header och sentinel, forts. List- och trädimplementering 2(6) Tom lista insättning först och sist kan göras i konstant tid, O(1) borttagning skiljer sentinel-noden förenklar sökning sökt värde placeras i sentinel -noden innan sökningen inleds sökt värde hittas alltid, om inte annat i sentinel -noden

Enkellänkad cirkulär lista med header / sentinel List- och trädimplementering 3(6) Tom lista cirkulariteten bör medföra en fördel jämfört med en rak lista insättning först och sist kan göras i konstant tid, O(1) borttagning skiljer sökning förenklas den skuggade noden kan användas som sentinel

Dubbellänkad cirkulär lista med header / sentinel List- och trädimplementering 4(6) Tom lista eliminerar specialfall algoritmerna för insättning och borttagning förenklas

List- och trädimplementering 5(6) Träd med sentinel förenklar algoritmer denna trädstruktur används till exempel för implementering av top-down -splayträd

List- och trädimplementering 6(6) Threaded tree pekarna i lövnoderna utnyttjas för att peka på noder högre upp i trädet information om pekarnas tolkning måste lagras den skuggade noden kan agera både header och sentinel

Trädbegrepp 1(2) Trädbegrepp Träd är en form av graf. rot nivå, djup 0 rotens höjd = 3 = trädets djup gren inre nod 1 löv 2 syskon 3 höjd räknas från löv och uppåt löv har höjden 0

Trädbegrepp 2(2) Trädbegrepp, forts. träd riktad acyklisk graf med extravillkoret att en nod endast får nås via en annan nod noder startnod/rotnod slutnod/lövnod inre nod båge/gren grad för nod eller för träd = antalet barn/subträd en nod har eller kan ha maximalt grad 2 binärt träd storlek = antalet noder i ett träd barn/avkomma förälder/anfader syskon väg väglängd medelväglängd djup = nivå roten har djupet/nivån 0 höjd = den längsta vägen från en nod till ett löv alla löv har höjden 0 komplett träd helt fyllt till näst sista nivån alla noder (löv) på sista nivån är tätt packade till vänster ett komplett träd kan lagras i ett fält

VL-träd 1(4) VL-träd enkelrotation med vänster barn k 2 k 1 k 1 h h+1 k 2 h+1 h h Om den streckade noden sätts in under hjälper ej denna rotation.

VL-träd 2(4) VL-träd enkelrotation med höger barn k 2 k 1 h k 1 k 2 h+1 h h+1 h

VL-träd 3(4) VL-träd dubbelrotation med vänster barn k 3 k 2 k 1 k 1 k 3 h k 2 D h h h -1 h h -1 D I princip uppstår obalansen genom insättning i höger subträd till noden k 1 uppdelningen i två subträd och har att göra med hur vi löser obalansen genom att rotera upp moden k 2

VL-träd 4(4) VL-träd dubbelrotation med höger barn k 3 k 2 k 1 k 3 k 1 h k 2 h h -1 h h -1 D D

ottom-up-splayträd 1(6) ottom-up-splayning enkelrotation zig-left och zag-right Enkelrotation görs endast om splaynoden är ett direkt barn till rotnoden, annars någon form av dubbelrotation. Zig-left utförs då splaynoden x är vänsterbarn till rotnoden i trädet (r). r x x r Splaynoden x roteras till roten i trädet splayningen är klar.

ottom-up-splayning enkelrotation zig-left och zig-right, forts. Zig-right utförs då splaynoden x är högerbarn till rotnoden i trädet (r). ottom-up-splayträd 2(6) r x x r Splaynoden x roteras till roten i trädet splayningen är klar.

ottom-up-splayträd 3(6) ottom-up-splayning dubbelrotation zig-zig-left och zig-zig-right Någon slags dubbelrotation utförs alltid om splaynoden har en farförälder. Zig-zig-left utförs då splaynoden x är vänsterbarn till föräldern p och p är vänsterbarn farföräldern g. g x p p x D g D

ottom-up-splayträd 4(6) ottom-up-splayning dubbelrotation zig-zig-left och zig-zig-right, forts. Zig-zig-right utförs då splaynoden x är högerbarn till föräldern p och p är högerbarn till farföräldern g. g x p p x g D D

ottom-up-splayträd 5(6) ottom-up-splayning dubbelrotation zig-left-zag-right och zig-right-zag-left Zig-left-zag-right utförs när splaynoden x är högerbarn till föräldern p och p är vänsterbarn till farföräldern g. g x p p g x D D Samma slags rotation som VL-trädets dubbelrotation med vänster barn.

ottom-up-splayträd 6(6) ottom-up-splayning dubbelrotation zig-left-zag-right och zig-right-zag-left, forts. Zig-right-zag-left utförs när splaynoden x är vänsterbarn till föräldern p och p är högerbarn till farföräldern g. g x p g p x D D Samma slags rotation som VL-trädets dubbelrotation med höger barn.

Top-down-splayning enkelrotation zig-left Enkelrotation utförs endast då en dubbelrotation inte kan utföras. Zig-left utförs om noden k 1 är vänsterbarn till rotnoden k 2 och k 1 är det sökta värdet, eller om det sökta värdet är mindre än k 1 och vänster subträd till k 1 () är tomt Här visas även den avslutande sammanslagningen (efter den heldragna linjen): Top-down-splayträd 1(8) Utgångsläge Flytta k 2 inkl. till R Flytta ut subträden från k 1 Sammanslaget träd L k 2 R L k 1 R L k 1 R k 1 k 1 k 2 k 2 L k 2 R effekten på mitträdet motsvarar en enkelrotation k 1 hamnar i roten av mitträdet

Top-down-splayning enkelrotation zig-right Zig-right utförs om noden k 2 är högerbarn till rotnoden k 1 och k 2 är det sökta värdet, eller om det sökta värdet är större än k 2 och höger subträd till k 2 () är tomt. Här visas även den avslutande sammanslagningen (efter den heldragna linjen): Top-down-splayträd 2(8) Utgångsläge Flytta k 1 inkl. till L Flytta ut subträden från k 2 Sammanslaget träd L k 1 R L k 2 R L k 2 R k 2 k 2 k 1 k 1 L k 1 R

Top-down-splayträd 3(8) Top-down-splayning dubbelrotation zig-zig Dubbelrotation utförs alltid då det är möjligt. zig-zig-left görs om det sökta värdet hör hemma i subträdet k 1 och det trädet inte är tomt annars zig-left zig-zig-right görs om det sökta värdet hör hemma i subträdet k 3 och det trädet inte är tomt annars zig-right Utgångsläge Rotera k 3 k 2 och Utgångsläge Rotera k 1 k 2 och zig-zig-left flytta ut till R zig-zig-right flytta ut till L L k 3 R L k 1 R L k 1 R L k 3 R k 2 k 2 k 2 k 2 k 1 D k 3 k 3 k 1 D D D effekten på mitträdet motsvarar en dubbelrotation k 1 resp. k 3 hamnar i roten av mitträdet.

Top-down-splayträd 4(8) Top-down-splayning dubbelrotation zig-zag ig-left-zag-right utförs om det sökta värdet hör hemma i vänster innerträd (k 2 ) och det inte är tomt annars zig-left zig-right-zag-left utförs om det sökta värdet hör hemma i höger innerträdet (k 2 ) och det inte är tomt annars zig-right Utgångsläge Rotera k 3 till R Utgångsläge zig-left-zag-right och k 1 till L zig-right-zag-left Rotera k 1 till L och k 3 till R L k 3 R L k 2 R L k 1 R L k 2 R k 1 k 1 k 3 k 3 k 1 k 3 k 2 D k 2 D D

Top-down-splayträd 5(8) Förenklad zig-zag alternativ till zig-zag Motsvarar en enkelrotation (zig): Utgångsläge förenklad zig-left-zag-right Rotera k 3 till R Utgångsläge förenklad zig-right-zag-left Rotera k 1 till L L k 3 R L k 1 R L k 1 R L k 3 R k 1 k 2 D k 2 k 3 D k 2 k 3 D k 1 k 2 D gör koden påtagligt enklare algoritmen sammanfaller med den för zig kräver två iterationssteg men eliminerar en del kontroller av olika fall innebär inte två på varandra följande enkelrotationer vad som ska ske i nästa splaysteg beror på trädets nya form och innehåll

Top-down-splayträd 6(8) Splayningen upphör Splayningen upphör när det sökta värdet x finns i rotnoden i mittenträdet, eller det subträd till rotnoden där det sökta värdet hör hemma är tomt Sökt värde x hittat Sökt värde x < k Sökt värde x > k x L R L k R L k R ( och kan vara tomma) ( kan vara tomt) ( kan vara tomt) Sista steget i splayningen är att slå ihop de tre träden till ett träd.

Top-down-splayträd 7(8) Sammanslagning av träden eventuella subträd till mitträdets rot flyttas ut till sidoträden den nod som blir kvar i mittenträdet blir rotnod när träden sedan slås ihop Splayningen avslutad Flytta ut subträden, Det resulterande trädet L k R L k R k L R (,, L, R kan vara tomma) Om inte det sökta värdet x finns i trädet (x = k) gäller följande: om x < k så gäller att x > alla värden i L (inklusive ; L < ). om x > k, så gäller att x < alla värden i R (inklusive, < R).

Top-down-splayträd 8(8) Och sedan, efter splayningen? enbart sökning klart värdet finns i rotnoden om det fanns i trädet sätta in ett nytt värde x ska bli rotnod: Det ihopslagna trädet Insättning om x < k Insättning om x > k k x k k x L R L R L R ta bort ett värde x finns i rotnoden om värdet finns i trädet: om rotnoden endast har ett subträd kan rotnoden tas bort och ersättas av subträdet, annars splaya inorder efterföljade till roten av vänster subträd och sätt in höger subträd som dess högerbarn. (visas ej med figurer)

OH -träd 1(6) -träd sökträd av vanligtvis hög grad, eller ordning, typiskt 100 eller mer två slags noder (block) inre noder där utvalda nycklar och pekare/adresser till subträd lagras lövnoderna där dataposterna lagras en primärt filorienterad trädstruktur används till exempel i filsystem och databaser ordningen bestäms typiskt av hur många nyckel-pekar-par som ryms i ett minnesblock de -träd vi ska studera kallas + -träd

OH -träd 2(6) + -träd av ordning M M är + -trädets ordning L är antalet dataposter som ryms i ett löv en inre nod kan lagra upp till M-1 nycklar (upp till M barn) k 1 k 2... k m... alla inre noder utom roten ska ha mellan M / 2 och M barn en nyckel i en inre nod anger den minsta nyckeln i det högra subträdet k < k 1 k 1 k < k 2 k k m roten är antingen ett löv eller ett inre nod med minst 2 barn alla löv ska finnas på samma djup och ska innehålla L / 2 till L dataposter gäller förstås inte om totala antalet poster är mindre än L / 2 löven kan vara sammanlänkade för att möjliggöra snabb inordertraversering även andra genvägar kan finnas Relaterade begrepp: noddelning görs vid överskott i en nod och man inte vill eller kan adoptera bort nodsammanslagning görs vid underskott i en nod om det ej är möjligt att låna/adoptera lån/adoption görs vid underskott i en nod och det är möjligt att låna/adoptera från ett närmaste syskon balansering görs vid noddelning och adoption och innebär att innehållet fördelas jämnt mellan två noder

OH -träd 3(6) + -träd av låg ordning M = 3, M / 2 = 2 k 1 k 1 k 2 en inre nod ska ha två eller tre subträd M = 4, M / 2 = 2 k 1 k 1 k 2 k 1 k 2 k 3 en inre nod ska ha två, tre eller fyra subträd

OH -träd 4(6) Insättning sök upp lövet där posten (nyckeln) hör hemma om det finns plats sätt in klart! annars (överskott) dela lövet genom att skapa ett nytt högersyskon fördela posterna jämnt (balansera) de med större nycklar i det nya lövet nyckel-pekar-par för det nya lövet sätts in till höger om det delade lövets position i föräldranoden om föräldranoden (en inre nod) är full dela fördela nyckel-pekar-paren jämnt (balansera) de större nycklarna i den nya noden sätt in nyckel-pekar-par för den nya noden i föräldranoden, till höger om den delade nodens position upprepa vid behov om proceduren når rotnoden och denna är full dela rotnoden en ny rotnod skapas pekaren till den gamla rotnoden sätt in längst till vänster nyckel-pekar-par för den gamla rotnodens nya syskon sätts in en ny rotnod har alltid två barn -träd växer i höjd vid roten, inte vid löven.

OH -träd 5(6) Insättning, forts. Om ett nytt -träd ska skapas från en befintlig mängd av poster kan detta göras effektivare än med vanlig insättning. sortera posterna skapa en rotnod och ett första löv sätt in pekare till det första lövet längst till vänster i rotnoden fyll på det första lövet till önskad fyllnadsgrad nåtts skapa ett nytt löv och fyll till önskad fyllnadsgrad minsta nyckeln och en pekare till lövet sätts in i nästa lediga position i föräldranoden då en föräldranod nått önskad fyllnadsgrad dela och balansera föräldranoden sätt in den nya nodens nyckel-pekar-par i föräldranoden upprepa vid behov om rotnoden behöver delas skapas en ny rotnod upprepa från tredje punkten ovan till dess alla indata har satts in

OH -träd 6(6) orttagning sök upp lövet där posten ska finnas ta bort posten om lövet är åtminstone halvfullt minst L / 2 poster återstår behöver inte trädstrukturen åtgärdas om posten var den med det minsta nyckelvärdet justera i föräldranoderna klart! annars om det finns ett högersyskon med fyllnadsgrad > L / 2 adoptera fördela posterna jämnt mellan de två löven (balansera) ny minsta nyckel i högersyskonet justera i föräldranoderna annars om det finns ett högersyskon men dess fyllnadsgrad är L / 2 slå ihop posterna i högersyskonet flyttas över ta bort högersyskonets nyckel-pekar-par i föräldern om underskott uppstår i föräldern åtgärdas det analogt (balansera? slå ihop?) om det inte finns ett högersyskon används vänster syskon om sammanslagningen når rotnoden och då endast ett barn återstår (underskott) ta bort rotnoden det enda återstående barnet blir ny rotnod -träd minskar i höjd vid roten, inte vid löven.

Hashtabeller 1(8) Hashtabeller ssociativ sökstruktur söknycklar avbildas på tabelladresser hashfunktion en nyckeltransformation som ger hemadressen för en post/nyckel i hashtabellen kollision två poster med olika nycklar erhåller samma hemadress kollisionshanteringsmetoder linjär sondering kvadratisk sondering dubbelhashning separat länkning klungbildning primär klungbildning hamnar man i en klunga vid insättning kommer klungan att växa genom insättning sist sekundär klunga består av poster med samma hemadress och samma sonderingsväg dimensionering ofta viktig fyllnadsgraden får normalt ej bli för hög typiskt 50 70 % olika kollisionshanteringsmetoder kan ha speciella storlekskrav (primtal, multipel av något värde, )

Hashtabeller 2(8) Hashfunktioner eräknar en nyckels hemadress i hashtabellen ska vara snabb att beräkna bör täcka hela tabellen ska ge jämn spridning i tabellen vara reproducerbar Olika metoder som hashfunktioner kan baseras på divisionsmetoden dividera nyckeln med tabellstorleken mittkvadratmetoden kvadrera nyckeln och välj siffrorna i mitten som adress sifferurvalsmetoder plocka ut väl valda siffror ur nyckeln som adress folding -metoder dela upp i nyckeln i delar och addera dessa längdberoendemetoder när nyckelvärden kan variera i längd (t.ex. strängar) låt längden inverka Många hashfunktioner opererar på heltalsvärden nycklar måste förbearbetas för att erhålla ett heltalsvärde. En perfekt hashfunktion innebär att varje nyckel kan avbildas på en unik hemadress endast i specialfall.

Hashtabeller 3(8) Kollisionshantering Kollision innebär att olika poster/nycklar erhåller samma hemadress oundvikligt i de allra flesta fall. Kollisioner kan hanteras på olika sätt: flera poster lagras på hemadressen poster tilldelas minne dynamisk och länkas till hemadressen separat länkning hashtabellen kan vara hinkorganiserad varje adress rymmer ett fixt antal poster en del av hashtabellen avsätts som överskottsarea hashfunktionen adresserar i detta fall endast den övriga delen primärarean kolliderade poster placeras i överskottsarean och länkas en alternativ, ledig plats i hashtabellen söks upp linjär sondering kvadratisk sondering dubbelhashning

Hashtabeller 4(8) Linjär sondering (med steget 1) irkulär linjärsökning efter ledig plats: h 0 = hash(k) hemadress h i = (h 0 + i) mod T i = 1, 2,, T. 0: 1: 2: Sonderingen avbryts om: 3: ledig plats påträffas 4: post med samma nyckel påträffas k hash(k) 5: åter till hemadressen tabellen är full Fördelar: enkel fullständig tabelltäckning Nackdelar: T-1: klungbildning både primär och sekundär

Hashtabeller 5(8) Kvadratisk sondering Syftar till att eliminera primär klungbildning. h 0 = hash(k) hemadress h i = (h 0 + i 2 ) mod T i = 1, 2,, T / 2. k hash(k) 0: 1: 2: Sonderingen avbryts om: 3: ledig plats påträffas 4: post med samma nyckel påträffas 5: i > T / 2 (sedan ej garanterat finna plats och adresser återbesöks) Fördelar: relativt enkel eliminerar i princip primär klungbildning T-1: Nackdelar: sekundär klungbildning ej fullständig tabelltäckning

Hashtabeller 6(8) Dubbelhashning Syftar till att undvika även sekundär klungbildning. h 0 = hash1(k) hemadress c = hash2(k) = R - (k mod R) R primtal < T h i = (h 0 + i * c) mod T i = 1, 2,, T. Sonderingen avbryts om: k c = 3 hash 1 (k) 0: 1: 2: 3: 4: ledig plats påträffas 5: post med samma nyckel påträffas tabellen full Fördelar: eliminerar i princip både primär och sekundär klungbildning Nackdelar: T-1: mer komplicerad

Hashtabeller 7(8) Linjär hashning Dynamisk tabell. hinkorganiserad på varje adress kan rymmas flera poster. initialt minst 2 hinkar i tabellen. tabellen växer och krymper genom hinkdelning resp. hinksammanslagning. En serie av hashfunktioner används: h i (k) = k mod (2 i * M) i = 0, 1, 2, en eller två av dessa används i taget, beroende på om en hink är delad eller ej M är det initiala antalet hinkar i tabellen. initialt används hashfunktionen h 0 (k) efter första hinkdelningen används både h 0 (k) och h 1 (k) då samtliga M hinkar delats har antalet hinkar fördubblats och alla poster är spridda enbart med h 1 (k): motsvarar en tabell med initial storlek 2M enbart h 1 (k) används initialt efter första hinkdelningen används även h 2 (k)

Hashtabeller 8(8) Linjärhashningsfunktioner hash i (k) = k mod (2 i M) i = 0, 1, 2, M = initial tabellstorlek hash 0 (k) = k mod (2 0 M) = k mod 1 M = [ M == 2 ] = k mod 2 (resten vid division med 2; 0 eller 1) hash 1 (k) = k mod (2 1 M) = k mod 2 M = [ M == 2 ] = k mod 4 (resten vid division med 4; 0, 1, 2 eller 3) hash 2 (k) = k mod (2 2 M) = k mod 4 M = [ M == 2 ] = k mod 8 (resten vid division med 8; 0 7) hash 3 (k) = k mod (2 3 M) = k mod 8 M = [ M == 2 ] = k mod 16 (resten vid division med 16; 0 15)

Olika sätt att kategorisera sorteringsmetoder Sortering llmänt 1(4) intern extern intern: alla data ryms i primärminnet vanligtvis direktadresserbara sortering av fält extern: data på fil samsortering i samband med sekventiell läsning/skrivning av filer jämförande distributiv jämförande: parvis jämförelse av värden (nycklar) platsbyte eller förflyttning för att ordna distributiva: ett värde i sig (sorteringsnyckeln eller viss del av) bestämmer förflyttning grundläggande teknik, för jämförande metoder urval utbyte insättning samsortering enkel avancerad enkla: enkla algoritmer bygger ofta direkt på en grundläggande teknik typiskt O(n 2 ) avancerade: mer invecklade algoritmer förfinar tekniken typiskt O(n m log n), m vanligtvis 2. stabil ej stabil en stabil metod bibehåller ordningen inbördes mellan lika värden naturlig ej naturlig står arbetsinsatsen i proportion till graden av ordning hos indata?

Sortering llmänt 2(4) nalys av sorteringsalgoritmer Framtagning av tidskomplexiteten baseras på analys av antalet jämförelser antalet förflyttningar eller byten ett byte = tre förflyttningar Val av metod kan påverkas av datamängden en enkel metod kan duga för små datamängder initialordning inversioner antalet oordnade par i indata; ett mått på (o)ordningen hos indata tre analysfall: ordnat omvänt ordnat slumpmässigt ordnat bästafall värstafall normalfall minnesbehov n+1 2 n 3 n stabilitet element med likvärdiga nycklar bibehåller inbördes ordning

Sortering llmänt 3(4) Interna sorteringsmetoder urval Selectionsort, Heapsort utbyte ubblesort, Shakersort, Quicksort insättning Insertionsort, Shellsort samsortering Mergesort (intern samsorteringsmetod) distributiva Radixsort (ucketsort), ountsort nm. Det generella begreppet merge sort (samsortering) används för att generellt beteckna metoder som bygger på samsorteringstekning, dvs även de externa samsorteringsmetoderna.

Sortering llmänt 4(4) Externa sorteringsmetoder Samsorteringsteknik används två grundläggande tekniker: balanserad samsortering bestämd, ökande delsekvenslängd i varje pass naturlig samsortering så långa ordnade delsekvenser som möjligt genereras i varje situation Metoder balanserad 2-vägs samsortering naturlig 2-vägs samsortering 2-vägs Polyphase Merge avancerad form av balanserad tvåvägs samsortering antalet delsekvenser i filerna bygger på Fibonaccis talserie Replacement Selection ingen sorteringsmetod teknik för att generera initiala delsekvenser för naturliga samsorteringsmetoder

Sorteringsalgoritmer 1(12) ubblesort template<typename omparable> void bubblesort(vector<omparable>& v) for (int p = v.size(); p > 1; --p) for (int j = 0; j < p - 1; ++j) if (v[j] > v[j + 1]) swap(v[j], v[j + 1]); (bubblar tunga element mot slutet av fältet)

Sorteringsalgoritmer 2(12) Shakersort template<typename omparable> void shakersort(vector<omparable>& v) int left = 0; int right = v.size() - 1; int last_swap = right; // position för senaste byte while (left < right) for (int i = right; i > left; --i) if (v[i - 1] > v[i]) swap(v[i - 1], v[i]); last_swap = i; left = last_swap; for (int i = left; i <= right; ++i) if (v[i - 1] > v[i]) swap(v[i - 1], v[i]); last_swap = i; right = last_swap - 1;

Sorteringsalgoritmer 3(12) Selectionsort template<typename omparable> void selectionsort(vector<omparable>& v) for (int p = 0; p < v.size() - 1; ++p) int min = p; for (int j = p + 1; j < v.size(); ++j) if (v[j] < v[min]) min = j; swap(v[min], v[p]);

Sorteringsalgoritmer 4(12) Insertionsort template<typename omparable> void insertionsort(vector<omparable>& v) for (int p = 1; p < v.size(); ++p) omparable tmp = v[p]; int j; for (j = p; j > 0 && tmp < v[j - 1]; --j) v[j] = v[j - 1]; v[j] = tmp;

Sorteringsalgoritmer 5(12) Shellsort Den ursprunliga versionen med gap som är multiplar av 2. template<typename omparable> void shellsort(vector<omparable>& v) for (int gap = v.size() / 2; gap > 0; gap /= 2) for (int i = gap; i < v.size(); ++i) omparable tmp = v[i]; int j; for (j = i; j >= gap && tmp < v[j - gap]; j -= gap) v[j] = v[j - gap]; v[j] = tmp;

Sorteringsalgoritmer 6(12) Heapsort (Heapsort 1) template<typename omparable> void percolate_down(vector<omparable<& v, int i, int n) omparable tmp = v[i]; int child; for (; i * 2 <= n; i = child) child = i * 2; if (child!= n && v[child + 1] > v[child]) child++; if (tmp < v[child]) v[i] = v[child]; else break; v[i] = tmp; // välj vänster barn // välj höger barn i stället // hål vandrar ner // klart! // sätt in tmp i hålet

Sorteringsalgoritmer 7(12) template<typename omparable> void Heapsort(vector<omparable>& v) for (int i = v.size() / 2; i >= 0; --i) percolate_down(v, i, v.size()); for (int j = v.size() - 1; j > 0; --j) swap(v[0], v[j]); percolate_down(v, 0, j); (Heapsort 2) // generera initial heap // flytta sista elementet till roten // återställ heap-ordningen för återstående heap

Sorteringsalgoritmer 8(12) Mergesort (Mergesort: 1) template<typename omparable> void Mergesort(vector<omparable>& v) vector<omparable> tmp_vector(v.size()); msort(v, tmp_vector, 0, v.size() - 1); template<typename omparable> void msort(vector<omparable>& v, vector<omparable>& tmp, int left, int right) if (left < right) int center = (left + right) / 2; msort(v, tmp, left, center); msort(v, tmp, center + 1, right); merge(v, tmp, left, center + 1, right);

Sorteringsalgoritmer 9(12) template<typename omparable> void merge(vector<omparable>& v, vector<omparable>& tmp, int left_pos, int right_pos, int right_end) int left_end = right_pos - 1; int tmp_pos = left_pos; int n_elements = right_end - left_pos + 1; while (left_pos <= left_end && right_pos <= right_end) if (v[left_pos] <= v[right_pos]) tmp[tmp_pos++] = v[left_pos++]; else tmp[tmp_pos++] = v[right_pos++]; while (left_pos <= left_end) tmp[tmp_pos++] = v[left_pos++]; while (right_pos <= right_end) tmp[tmp_pos++] = v[right_pos++]; for (int i = 0; i < n_elements; ++i, --right_end) v[right_end] = tmp[right_end]; (Mergesort 2) // element kvar i vänster halva? // element kvar i höger halva?

Sorteringsalgoritmer 10(12) Quicksort (Quicksort 1) Sorteringen med den enkla metoden (insertionsort) görs i ett separat, sista steg. const unsigned int UTOFF = 3; template<typename omparable> void Quicksort(vector<omparable>& v) qsort(v, 0, v.size() - 1); insertionsort(v); // qsort sorterar till UTOFF

Sorteringsalgoritmer 11(12) template<typename omparable> void qsort(vector<omparable>& v, int left, int right) if (left + UTOFF <= right) omparable pivot = median3(v, left, right); i = left; j = right - 1; for (;;) while (v[++i] < pivot); while (v[--j] > pivot); if (i < j) swap(v[i], v[j]); else break; swap(v[i], v[right - 1]); qsort(v, left, i - 1); qsort(v, i + 1, right); // flytta pivot (Quicksort 2)

Sorteringsalgoritmer 12(12) template<typename omparable> omparable& median3(vector<omparable>& v, int left, int right) int center = (left + right) / 2; if (v[left] > v[center]) swap(v[left], v[center]); if (v[left] > v[right]) swap(v[left], v[right]); if (v[center] > v[right]) swap(v[left], v[center]); swap(v[center], v[right - 1]); return v[right - 1]; // göm pivot // returnera pivot (Quicksort 3)