Begreper
01 Grunnlag
- Problem og instans #
- Et problem er relasjonen mellom input og output. En instans er én bestemt input. Problemstørrelsen er plassen en instans trenger, som regel antall elementer.
- RAM-modellen #
- Random-access machine: en idealisert maskin der aritmetikk, sammenligning, hopp og oppslag i én celle koster én tidsenhet hver, og instruksjonene utføres etter hverandre. Heltallene er om lag bits brede.
- Asymptotisk notasjon #
- Et språk for vekst som ser bort fra konstantfaktorer og lavere ordens ledd. Oppfører seg som sammenligning av tall: er , er , er , er og er . De to siste krever ulikheten for enhver konstant , ikke bare for én.
- Beste, verste og gjennomsnittlige tilfelle #
- Tre funksjoner av : kjøretiden for den billigste instansen av størrelse , for den dyreste, og den forventede kostnaden når instansen trekkes tilfeldig. Hvilket tilfelle det gjelder er uavhengig av hvilken asymptotisk operator som brukes på det.
- Løkkeinvariant #
- En påstand om tilstanden som holder ved starten av hver iterasjon. Vises med initialisering, vedlikehold og terminering, og er induksjonsbeviset for at løkka er korrekt.
- Insertion-Sort #
- Sorterer ved å holde sortert og sette inn på rett plass i det utsnittet. Bruker i beste tilfelle og i verste, og sorterer på plass.
02 Datastrukturer
- Stakk #
- Sist inn, først ut (LIFO). Alt skjer på toppen:
Pushlegger på ogPoptar av, begge i konstant tid. Implementeres med en tabell og en toppindeks. - Kø #
- Først inn, først ut (FIFO).
Enqueuelegger til bakerst ogDequeuetar ut forrest, begge i konstant tid. Implementeres gjerne som ringbuffer: en tabell der indekseneheadogtailrykker fremover og går rundt til starten når de passerer enden. - Lenket liste #
- Noder som peker på neste node, og i en dobbeltlenket liste også på forrige. Innsetting og sletting koster konstant tid når du står ved noden; søk følger pekerne og koster lineær tid.
- Dynamisk mengde #
- Funksjonalitet, ikke en bestemt struktur: hold en mengde elementer med nøkler, og støtt
Search,InsertogDelete, for ordnede nøkler ogsåMinimum,Maximum,SuccessorogPredecessor. Finnes ikke svaret, returneres NIL. - Hashtabell #
- Oppslagstabell der en hashfunksjon regner indeksen ut fra nøkkelen, for eksempel . To nøkler kan få samme indeks, en kollisjon; med kjeding får hver plass en lenket liste som tar imot alle sine nøkler.
- Belastningsfaktor #
- : antall elementer delt på antall plasser i hashtabellen. Med kjeding og jevn fordeling er forventet søketid , så tabellen bør vokse i takt med datamengden.
- Perfekt hashing #
- For en statisk nøkkelmengde: nøklene hashes først inn i plasser, og plass med nøkler får en sekundærtabell med plasser og en hashfunksjon uten kollisjoner der. Søk tar konstant tid selv i verste fall, og plassen er .
- Amortisert analyse #
- Snitt per operasjon over en hel operasjonsfølge, i verste fall. Aggregert analyse: regn ut totalt arbeid og del på antall operasjoner. Ingen sannsynlighet er involvert, i motsetning til gjennomsnittstilfellet, som er et snitt over instanser.
- Tabelldobling #
- Når tabellen er full, eller for en hashtabell når har nådd en fast grense: alloker en dobbelt så stor, kopier (eller hash på nytt) alt over og fortsett. Én innsetting kan koste lineær tid, men innsettinger koster totalt under operasjoner, og nøyaktig når er en toerpotens. Det er amortisert konstant per innsetting.
03 Problemer og reduksjoner
- Søkeproblem #
- Gitt en instans : finn en løsning slik at . Finnes ingen, feiler søket.
- Beslutningsproblem #
- Gitt en instans : avgjør om det finnes en løsning med . Svaret er ja eller nei, og problemet kan ses som mengden av ja-instanser.
- Optimeringsproblem #
- Blant de akseptable løsningene til en instans: finn en som er best mulig etter et gitt mål, for eksempel størst, kortest eller billigst.
- Sertifikat #
- En påstått løsning som verifiseres: gitt og sertifikatet , sjekk om . Å verifisere er ofte langt billigere enn å finne løsningen selv.
- Orakel #
- En hypotetisk subrutine som antas å løse et gitt problem. Reduksjoner beskrives med orakler: det som gjenstår etter omformingen av instansen, overlates til oraklet.
- Reduksjon #
- Å løse problem ved å omforme instansen og bruke et orakel for problem . Cook-reduksjoner tillater mange orakelkall, Levin-reduksjoner ett kall med oversettelse av løsningen tilbake, og Karp-reduksjoner ett kall der ja/nei-svaret går uendret gjennom. En billig reduksjon fra til viser at er minst like vanskelig som .
04 Splitt og hersk
- Splitt og hersk #
- Designmetode: løs grunntilfellet direkte, ellers del instansen i uavhengige delinstanser, løs dem rekursivt og kombiner delsvarene. Arbeidet ligger som regel i enten delingen eller kombinasjonen. Korrektheten vises ved sterk induksjon over problemstørrelsen.
- Rekurrens #
- En ligning som definerer en funksjon ved hjelp av seg selv på mindre argumenter, for eksempel . Kjøretiden til en rekursiv algoritme har denne formen. En algoritmisk rekurrens har konstant grunntilfelle for små og terminerer, og det antas når ikke annet er sagt.
- Iterasjonsmetoden #
- Løser en rekurrens ved å ekspandere den rekursive forekomsten gjentatte ganger til et mønster viser seg, velge antall ekspansjoner slik at argumentet treffer grunntilfellet, og summere.
- Rekursjonstre #
- Iterasjonsmetoden tegnet som et tre: rota er , nivå har noder av størrelse , og kjøretiden er summen av nivåkostnadene. Antall løvnoder er .
- Substitusjonsmetoden #
- Verifiserer en gjettet eller funnet løsning med induksjon: anta at løsningen holder for mindre argumenter, sett inn i rekurrensen og vis at den holder for . Sjekk grunntilfellet. Påstanden må være nøyaktig den samme før og etter, konstanten inkludert; i hypotesen og i konklusjonen kan skjule to ulike konstanter.
- Masterteoremet #
- Løser ved å sammenligne den drivende funksjonen med vannskillefunksjonen . Er polynomisk mindre, dominerer løvnodene: . Er for en konstant , er løsningen . En logaritmisk faktor under vannskillefunksjonen, som , dekkes ikke. Er polynomisk større og regulær, dominerer rota: .
- Binærsøk #
- Søk i en sortert tabell ved å sammenligne med midtelementet og søke rekursivt i den halvdelen verdien må ligge i. , altså . Det rekursive kallet er det siste i prosedyren, så algoritmen skrives like gjerne som en løkke.
- Merge-Sort #
- Del på midten, sorter halvdelene rekursivt og flett dem. Flettingen kopierer halvdelene til og med en vaktpost bakerst og flytter det minste forreste elementet til neste ledige plass, i tid. i alle tilfeller.
- Quicksort #
- Partition velger siste element som pivot og ordner resten med små elementer til venstre og store til høyre, i tid; pivoten havner på sin endelige plass. Delene sorteres rekursivt. ved jevn deling og i snitt over alle rekkefølger, når pivoten står alene, som på sortert input. Randomized-Quicksort bytter et tilfeldig element inn som pivot. Da er hvert element med i delinger i forventning, så forventet kjøretid er for enhver input.
- Forventet kjøretid #
- Snitt over algoritmens egne tilfeldige valg, for én fast instans. Skiller seg fra gjennomsnittstilfellet, som er et snitt over instanser, og fra amortisert kjøretid, som er et snitt over operasjonene i en følge.
05 Rangering i lineær tid
- Sammenligningsbasert sortering #
- Sortering som bare får informasjon om elementene gjennom parvise tester . Insertion-Sort, Merge-Sort og Quicksort er sammenligningsbaserte; Counting-Sort, Radix-Sort og Bucket-Sort er det ikke.
- Beslutningstre #
- Modell for en sammenligningsbasert algoritme på elementer: hver indre node er en sammenligning med to utfall, hver løvnode en ferdig rekkefølge, og én kjøring er en sti fra rota. Sortering krever minst løvnoder, så høyden, antall sammenligninger i verste tilfelle, er minst .
- Sorteringsgrensen #
- Enhver sammenligningsbasert sorteringsalgoritme bruker sammenligninger i verste tilfelle. Grensen sier ingenting om beste tilfelle, som kan være . Den smitter over på et annet problem bare gjennom en reduksjon fra sortering med kjøretid .
- Rang #
- Det -ende minste elementet i en tabell har rang . Rang 1 er minimum, rang maksimum, og medianen har rang , den nederste av de to midterste når er partall.
- Randomized-Select #
- Finner elementet med rang som Quicksort med ett rekursivt kall: Randomized-Partition setter pivoten på plass med rang i segmentet. Er , er pivoten svaret; er , søkes rang blant de små, ellers rang blant de store. Forventet for enhver input, i verste tilfelle.
- Select #
- Rangering i garantert . Pivoten er medianen av medianene til grupper på fem, funnet med et rekursivt kall, og minst elementer havner på hver side av den. . Gir også de minste elementene i lineær tid: finn rang og del rundt det.
- Stabil sortering #
- En sorteringsalgoritme er stabil når like nøkler står i samme innbyrdes rekkefølge i output som i input. Insertion-Sort, Merge-Sort og Counting-Sort er stabile; Quicksort er det ikke. Radix-Sort krever en stabil subrutine.
- Counting-Sort #
- Sorterer heltall i området uten sammenligninger: tell forekomstene av hver verdi i , gjør kumulativ slik at er antall elementer , og gå baklengs gjennom : trekk én fra og legg på den plassen i . Baklengs gjør den stabil. .
- Radix-Sort #
- Sorterer -sifrede tall stabilt på ett siffer om gangen, det minst signifikante først, med Counting-Sort som subrutine. Etter pass er tallene sortert på de siste sifrene; stabiliteten er induksjonssteget. når hvert siffer har verdier.
- Bucket-Sort #
- Antar input uniformt fordelt i . Legg i bøtte av , sorter hver bøtte med Insertion-Sort, og sett bøttene etter hverandre. Forventet som et snitt over inputer, i verste tilfelle.
06 Rotfaste trestrukturer
- Rotfast tre #
- Et fritt tre, en sammenhengende graf uten sykler, med én node valgt som rot. Rota har ingen forelder, hver annen node har én, og nodene rett under en node er barna dens. En løvnode har ingen barn; de andre er indre noder. Dybden er antall kanter opp til rota, og høyden er den største dybden. Representeres med pekere til barna, eller med én peker til første barn og én til neste søsken.
- Komplett binærtre #
- Et binærtre der alle indre noder har to barn og alle løvnodene har samme dybde. Med høyde har det løvnoder og indre noder, så noder i alt og .
- Binært søketre #
- Et binærtre med nøkler der alt i venstre deltre til en node er mindre enn eller lik noden og alt i høyre deltre større enn eller lik, for hver node. Søk, innsetting, minimum, maksimum, etterfølger og sletting følger én sti og koster . Høyden er forventet for tilfeldig innsettingsrekkefølge og i verste tilfelle; balanserte søketrær garanterer .
- Inorder-Tree-Walk #
- Besøker venstre deltre, så noden, så høyre deltre, rekursivt fra rota. I et binært søketre kommer nøklene ut i sortert rekkefølge. . Preorder og postorder behandler noden før eller etter de to rekursive kallene.
- Tree-Insert #
- Søker etter den nye nøkkelen til søket treffer nil, med en peker ett steg bak , og henger den nye noden på som venstre eller høyre barn. En ny node blir alltid en løvnode. .
- Etterfølger #
- Noden med den minste nøkkelen som er større enn nøkkelen til , den neste i Inorder-Tree-Walk. Har et høyre deltre, er etterfølgeren minimum der; ellers er den den nærmeste noden over som har i sitt venstre deltre. Tree-Successor følger én sti, . Forgjengeren finnes symmetrisk.
- Haug #
- Et binærtre som er komplett ned til nest nederste nivå, med det nederste fylt fra venstre, lagret i en tabell nummerert nivå for nivå: barna til er og , forelderen . Haugegenskapen for en maks-haug er for alle unntatt rota, så det største elementet står i rota. En min-haug har . Høyden er .
- Max-Heapify #
- Reparerer en maks-haug der bare kan bryte haugegenskapen: bytt med det største barnet hvis det er større, og fortsett rekursivt der det mindre elementet havnet. Elementet synker høyst steg, .
- Build-Max-Heap #
- Kaller Max-Heapify på de indre nodene fra ned til 1, nedenfra og opp, så begge deltrærne alltid er hauger når turen kommer til en node. , for de fleste nodene står langt nede og synker lite. Ikke det samme som kall til Max-Heap-Insert, som koster i verste tilfelle.
- Prioritetskø #
- Dynamisk mengde med nøkler som prioriteter, gjerne med duplikater, som støtter Insert, Maximum, Extract-Max og Increase-Key, eller min-variantene. En maks-haug gir Maximum i og de tre andre i : Extract-Max flytter det siste elementet opp i rota og lar det synke, Increase-Key lar elementet stige, og Insert er Increase-Key fra på en ny siste plass.
- Heapsort #
- Sortering ved utvelgelse med en maks-haug: bygg haugen av hele , og bytt så ganger rota med det siste elementet i haugen, minsk haugen og reparer rota med Max-Heapify. Sorterer på plass, i verste tilfelle og i beste, når alle elementene er like.
07 Dynamisk programmering
- Dynamisk programmering #
- Designmetode: rekursiv dekomponering der hvert delsvar lagres første gang det regnes ut og slås opp senere. Gir riktig svar når problemet har optimal delstruktur, og lønner seg når delinstansene overlapper. Løses med memoisering ovenfra og ned, eller iterativt nedenfra og opp i topologisk rekkefølge i delinstansgrafen.
- Delinstansgraf #
- Én node per forskjellig delinstans, og en kant fra til når svaret for bygger på svaret for . Må være asyklisk, og hver kjede av avhengigheter må ende i et grunntilfelle. Kalltreet til en rekursiv løsning har én node per sti i grafen som ender i instansen. Kjøretiden til dynamisk programmering er som regel lineær i antall noder og kanter.
- Overlappende delinstanser #
- Flere instanser bygger på den samme delinstansen, direkte eller indirekte. Skjer det på mange nivåer, blir en rekursiv løsning uten lagring eksponentiell. I splitt og hersk overlapper delinstansene ikke, så der gir lagring ingenting.
- Optimal delstruktur #
- En optimal løsning består av optimale løsninger på delinstansene. Vises som regel ved å bytte ut en del: var den ikke optimal, kunne den byttes ut og gi en bedre løsning. Korteste vei har egenskapen. Lengste enkle vei har den ikke, for to lengste delveier kan bruke de samme nodene.
- Memoisering #
- Rekursjon med hukommelse: første kall med et argument regner ut svaret og lagrer det, og senere kall med samme argument slår det opp. Løsningen ovenfra og ned (top-down) i dynamisk programmering. Løser bare delinstansene som faktisk trengs.
- Lengste felles delsekvens #
- Forkortet LCS. En lengste sekvens som er en delsekvens av både og , der en delsekvens er det som står igjen når null eller flere elementer strykes. LCS-Length fyller for prefiksene og rad for rad og lagrer en pil i , og Print-LCS følger pilene bakfra. .
- Det binære ryggsekkproblemet #
- Gjenstander med verdi og vekt , og en kapasitet : velg gjenstander med størst mulig totalverdi og totalvekt høyst , der hver gjenstand er med eller ikke med. er det beste med gjenstandene og kapasitet , og er den største av verdien uten gjenstand og verdien med den. , som er pseudopolynomisk.
- Pseudopolynomisk kjøretid #
- Polynomisk som funksjon av et tall fra inputen, men ikke av inputstørrelsen i bits. Ryggsekkløsningen bruker , men tar bare bits, så kjøretiden er .
08 Grådighet
- Grådighet #
- Designmetode: gjør det valget som ser best ut her og nå, løs den ene delinstansen som er igjen, og sett valget og delløsningen sammen. Valget tas før noen delinstans er løst. Algoritmen er riktig når problemet har grådighetsegenskapen og optimal delstruktur.
- Grådighetsegenskapen #
- Det finnes en optimal løsning som tar det første grådige valget. Egenskapen sier bare at det første valget er trygt. At alle de grådige valgene er trygge, følger først sammen med optimal delstruktur, ved induksjon.
- Utvekslingsargument #
- Bevis for grådighetsegenskapen: ta en vilkårlig optimal løsning, bytt ut ett av valgene med det grådige, og vis at løsningen fortsatt er lovlig og ikke blir dårligere. Da finnes en optimal løsning med det grådige valget.
- Det kontinuerlige ryggsekkproblemet #
- Som det binære ryggsekkproblemet, men du kan ta med en andel mellom 0 og 1 av hver gjenstand og får samme andel av verdien. Løses grådig: fyll sekken etter synkende kilopris , så bare den siste gjenstanden blir delt. med sorteringen.
- Aktivitetsutvalg #
- Velg flest mulig aktiviteter der ingen to overlapper. Det grådige valget er aktiviteten som slutter først, og delinstansen som er igjen, er aktivitetene som starter ved sluttiden dens eller senere. Greedy-Activity-Selector bruker når aktivitetene er sortert etter sluttid.
- Prefiksfri kode #
- Binær kode der ingen kodeord er et prefiks av et annet, så en kodet tekst kan dekodes ett kodeord om gangen fra starten. Tegnes som et kodetre med tegnene i løvnodene: kodeordet er stien fra rota, med 0 for venstre og 1 for høyre barn, og lengden er dybden.
- Huffman-kode #
- En optimal prefiksfri kode, laget av Huffmans algoritme. Hvert tegn starter som et tre i en min-prioritetskø på frekvens, og ganger slås de to trærne med lavest frekvens sammen under en ny node med summen av frekvensene. med en binær haug.
09 Traversering av grafer
- Nabolister #
- Grafrepresentasjon med én liste per node: inneholder ut-naboene til . Tar plass. Å gå gjennom naboene til tar tid proporsjonal med antallet, men å sjekke om er en kant krever et søk i lista. Standardvalget for traversering.
- Nabomatrise #
- Grafrepresentasjon som en -tabell der når er en kant. Tar plass uansett antall kanter, og svarer på om er en kant i konstant tid. Symmetrisk for en urettet graf.
- Traverseringstre #
- Treet som forgjengerkantene danner etter en traversering, med startnoden som rot. BFS gir et bredde-først-tre der stien fra rota er en korteste vei. DFS gir en dybde-først-skog med ett tre per kall fra hovedløkka.
- Dybde-først-søk #
- Forkortet DFS. Traversering som går videre fra den nyeste noden den har oppdaget: DFS-Visit kaller seg selv på hver hvite nabo med en gang. DFS starter fra hver hvite node etter tur og gir hver node en starttid og en sluttid . .
- Parentesteoremet #
- I en dybde-først-skog er intervallene og enten disjunkte, eller så ligger det ene inni det andre, og da er den indre noden en etterkommer av den ytre. Skrives «(u» ved og «u)» ved , blir parentesene riktig nøstet.
- Hvit-sti-teoremet #
- er en etterkommer av i en dybde-først-skog hvis og bare hvis det, da ble oppdaget, fantes en sti fra til med bare hvite noder.
- Kantklassifisering #
- DFS deler kantene i tre-kanter (i dybde-først-skogen), bakoverkanter (til en forfader), foroverkanter (til en etterkommer, utenfor treet) og krysskanter (alle andre). Kanten er en tre-kant hvis er hvit når den undersøkes, en bakoverkant hvis er grå, og en forover- eller krysskant hvis er svart. En rettet graf har en sykel hvis og bare hvis DFS finner en bakoverkant.
- DAG #
- Rettet asyklisk graf: en rettet graf uten sykler. Har en topologisk sortering, og DFS finner ingen bakoverkanter i den.
- Topologisk sortering #
- En rekkefølge av nodene i en DAG der kommer før for hver kant . Topological-Sort kjører DFS og setter hver node først i en lenket liste når den blir ferdig, så lista blir sortert etter synkende sluttid. .
- Sterke komponenter #
- De største mengdene av noder i en rettet graf der hver node kan nå hver annen langs rettede stier. Kollapses hver komponent til én node, blir grafen en DAG. Strongly-Connected-Components kjører DFS på , og så DFS på med startnodene etter synkende sluttid: hvert tre er én komponent. .
- Bredde-først-søk #
- Forkortet BFS. Traversering med en FIFO-kø fra en startnode : nodene besøkes lag for lag, i stigende avstand. Gir , korteste vei målt i antall kanter, og et bredde-først-tre av forgjengerkanter. .
Ingen begreper matcher søket.