En anvendelse av binære søketrær: Svadageneratoren

Like dokumenter
En anvendelse av binære søketrær: Svadageneratoren

Definisjon: Et sortert tre

Definisjon av binært søketre

Binære trær: Noen algoritmer og anvendelser

Selv-balanserende søketrær

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

INF2220: Forelesning 2

Obligatorisk oppgave 1 INF1020 h2005

Lars Vidar Magnusson

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

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

Object [] element. array. int [] tall

Et eksempel: Åtterspillet

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

INF1010 Binære søketrær ++

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

Flerveis søketrær og B-trær

UNIVERSITETET I OSLO

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Trær. En datastruktur (og abstrakt datatype ADT)

PG 4200 Algoritmer og datastrukturer Innlevering 2

Balanserte binære søketrær

INF2220: Forelesning 2

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

UNIVERSITETET I OSLO

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

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

Et eksempel: Åtterspillet

Dynamisk programmering

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Slope-Intercept Formula

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF Algoritmer og datastrukturer

Eksamen FSP5119/PSP5067 Tysk nivå I Elevar og privatistar / Elever og privatister. Nynorsk/Bokmål

Algoritmer og Datastrukturer

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

Liste som abstrakt konsept/datatype

Enkle datastrukturer. Lars Greger Nordland Hagen. Introduksjon til øvingsopplegget og gjennomgang av python

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

LEKTION 1. a Se på bildene og lær hvordan du hilser og sier «ha det» på tysk. Guten Tag!

INF1010 siste begreper før oblig 2

KONTINUASJONSEKSAMEN

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

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

Notater til INF2220 Eksamen

Dynamisk programmering Undervises av Stein Krogdahl

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

Wissenstest Minivariante 2

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

Algoritmer og datastrukturer Eksamen

IN Algoritmer og datastrukturer

LEKTION 7. Österreich. 1 Les dialogen sammen to og to. 2 Spørsmål om Østerrike GLOSER. Nedenfor er en del spørsmål om Østerrike.

KONTINUASJONSEKSAMEN

LEKTION 1. a Sjå på bileta og lær korleis du helser og seier «ha det» på tysk. Guten Tag!

KONTINUASJONSEKSAMEN

LEKTION 12. Frohes Fest. 1 Weihnachtskarte. 2 Dezember in Deutschland. Oma und Opa. geht s? Hier bei uns haben wir viel.

Datastrukturer for rask søking

Algoritmer og Datastrukturer IAI 21899

UNIVERSITETET I OSLO

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn

Die Auswertung Evaluering

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Dagens stoff er hentet fra kapittel 9 i læreboka, samt kapittel 20.5 (som vi «hoppet over» sist)

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

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

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Løsningsforslag til INF110 h2001

Generelle trær BINÆRTRÆR. Binærtrær

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

Oppgave 1. Sekvenser (20%)

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

Magnus Moan (Undertegnede) Enkle datastrukturer, trær, traversering og rekursjon

København 20 Stockholm

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 99HINDB / 99HINEA / 00HDESY ( 2DA / 2DB / 2EA / DESY )

UNIVERSITETET I OSLO

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

MAT1030 Diskret matematikk

INF Algoritmer og datastrukturer

Dynamisk programmering

EKSAMEN med løsningsforslag

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer.

EKSAMEN. Moderne og eldre språk. Eksamenstid: kl 9.00 til kl (5 timer)

UNIVERSITETET I OSLO

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Exercise 1: Phase Splitter DC Operation

INF1020 Algoritmer og datastrukturer GRAFER

Algoritmer og datastrukturer Eksamen 22. februar 2011

Auch WIR arbeiten in Europa! Spørjeskjema Livshistorie

Transkript:

En anvendelse av binære søketrær: Svadageneratoren

Problemet som skal løses Les en lengre tekst skrevet i et bestemt språk, f.eks. engelsk eller tysk Registrer data som på en eller annen måte beskriver noe som er typisk for dette språket Skriv deretter ut en lengre tilfeldig tekst (meningsløs svada) som ligner på språket i den teksten som er lest

Eksempel: Tysk svada Input*: Wir reden heute sehr oft von demokratischen Idealen; das heißt nicht in Deutschland, sondern in der anderen Welt wird davon geredet. Denn wir in Deutschland haben ja dieses demokratische Ideal einst zur Genüge kennengelernt; wenn die andere Welt also heute wieder dieses Ideal preist, so können wir darauf zunächst nur erwidern, daß dieses Ideal das deutsche Volk ja mindestens 15 Jahre lang in Reinkultur kennenzulernen Gelegenheit hatte, und wir selbst haben ja nur das Erbe dieser Demokratie angetreten... Output: Deutschen, sie haben, daß nun in einen auf mich das Rechtig, eine wir erweite Phantom ist es in freiung gepredigt, für die viellein Sie eigenen, meinem größte erwiders komme, die gemeinst wehrlos geboten es ist und einem Haß sich ist und wird. - I wo den Staat, und Angriff. In diesen der eine Person, so Gottes Werte inner Europaganda gab ich nichter der armen vorhatte etwas würde eingen tapfer aber aller. Ich leiderlegt? Haben überwunde über die Gewaltigung nicht überstelle nicht geschreiternahm, das vom konnte, zu vergangesehe... *: Fra Adolf Hitlers tale i Sportpalast Berlin, 30. januar 1940

Eksempel: Engelsk svada Input*: Of this I am quite sure, that if we open a quarrel between the past and the present, we shall find that we have lost the future. Therefore, I cannot accept the drawing of any distinctions between members of the present Government. It was formed at a moment of crisis in order to unite all the Parties and all sections of opinion. It has received the almost unanimous support of both Houses of Parliament. Its members are going to stand together, and, subject to the authority of the House of Commons, we are going to govern... Output: Those to columns, which his been; and the solid, preven-eight and columns, depends our declared free and stand cared scienced not, before been France at see how the Navy is no do. We are yet at the which of the possible losses, from the come dangerous battle intend in their Priment time, together people, that the exploits craft and casting formations which we are size; It have, and for the discussions any day across the part the add great quarter when we are are and trained. Withought ago as two off the sea invasion,... *: Fra Winston Churchills tale i The House of Commons, London, 18. juni, 1940

Hvorfor løse dette problemet? En svadagenerator kan ikke brukes til noe fornuftig, medfører mye programmeringsarbeid for «ingenting»... Men: Den er et fint eksempel på smart anvendelse av algoritmer og datastrukturer til å løse et relativt komplekst problem Problemet egner seg godt for bruk av binære søketrær Løsningen gir god forståelse av hvordan søketrær og tilhørende algoritmer fungerer, her er det mye å lære... Det er morsomt (for oss nerder, i det minste) å lage en fungerende løsning

Karakterisering av språk: Tegnsekvenser Et språk kan gjenkjennes ved å se på hvilke bokstaver (og andre tegn) som ofte kommer rett etter hverandre F.eks. vil en tysk tekst typisk inneholde mange forekomster av tegnsekvensene «sch», «eis» og «en» En engelsk tekst kan ha mange «the», «wh» og «ing» I svadageneratoren lagrer vi først alle tegnsekvenser som finnes i input, sammen med frekvensinformasjon Vi skriver deretter ut en tilfeldig tekst som bare inneholder de tegnsekvensene som vi har lest inn

Innlesing av n-sekvenser Teksten leses tegn for tegn All påfølgende whitespace, inkludert linjeskift, erstattes med en enkel ' ' (space) Alle sekvenser av n tegn som kommer rett etter hverandre (såkalte n-sekvenser), skal leses og lagres Typiske verdier for n er 2 n 6 Likheten mellom input og output blir større hvis vi bruker lengre n-sekvenser Lagrer alle sekvenser, også de som inneholder skilletegn, tall, spesialtegn og space i tillegg til bokstaver

n-sekvenser: Eksempel med n = 3 Input: «Wir reden heute sehr oft von demokratischen Idealen» 3-sekvenser: «Wir» «n h» «seh» «vo» «okr» «hen» «len» «ir» «he» «ehr» «von» «kra» «en» «en» «r r» «heu» «hr» «on» «rat» «n I» «re» «eut» «r o» «n d» «ati» «Id» «red» «ute» «of» «de» «tis» «Ide» «ede» «te» «oft» «dem» «isc» «dea» «den» «e s» «ft» «emo» «sch» «eal» «en» «se» «t v» «mok» «che» «ale» Java-kode for innlesing: sekvensleser.java

Lagring av n-sekvenser Bruker et (stort) binært søketre til å registrere alle ulike n-sekvenser som finnes i teksten Treet skal ha én node for hver ulik n-sekvens Søketreet skal være sortert sortert stigende på tegnverdi (dvs. alfabetisk for bokstaver) Når vi senere skal skrive ut svada, trekker vi hele tiden tegnsekvenser fra dette søketreet

Lagring av frekvensinformasjon For hver av de ulike n-sekvensene som forekommer i teksten, må vi lagre data som sier noe om hvor ofte sekvensen forekommer Enkleste løsning: Bare lagre antall ganger hver sekvens forekommer, sammen med selve sekvensen i søketreet Ulempe: Gjør det «fiklete» å generere svada som både har samme frekvenser av n-sekvenser og ligner på originalteksten

Smartere løsning: Lagring av etterfølgertegn til hver n-sekvens For hver n-sekvens oppretter vi et nytt (mindre) søketre til å registrere alle enkelt-tegn som kom rett etter denne sekvensen. Det «lille» søketreet er sortert på tegnverdi. Hver node i søketreet lagrer selve etterfølgertegnet og antall ganger dette tegnet forekom etter denne sekvensen Ved utskrift av neste tegn velger vi alltid et av tegnene som ligger lagret i etterfølgertreet til n-sekvensen som sist ble skrevet ut Vil da bare kunne skrive ut n-sekvenser som finnes i den opprinnelige teksten

Eksempel: n = 2, input: "en pen jente.." 2-sekvenser: "en" "n " " p" "pe" "en" "n " " j" "je" "en" "nt" "te" "e." ' '(2) "en" 'p'(1) 't'(1) 'e'(1) "n " " p" 'e'(1) " j" "e." '.'(1) "je" 'n'(1) 'j'(1) "pe" 'n'(1) "nt" "te" 'e'(1) '.'(1)

En enda smartere løsning Løsningen på forrige side lagrer antall forekomster av hvert tegn i etterfølgertreet til en n-sekvens Det viser seg at det blir enklere og raskere å trekke tilfeldige etterfølgertegn hvis vi i stedet, for hver node i de «små» søketrærne, lagrer: Antall forekomster av tegn som finnes i hele subtreet som en etterfølgernode er rot i Kommer tilbake til hvordan vi faktisk gjør den tilfeldige trekkingen om litt...

Eksempel på etterfølgertre Etterfølgertegnene registreres i denne rekkefølgen i et tre som initielt er tomt: d b a c f e g h a a d e g g Resultat: d(14) b(5) a(3) f(7) c(1) e(2) g(4) h(1) Merk at antall forekomster av et tegn er lik antallet lagret i noden minus antallene lagret i høyre og venstre subtre

Metode for innsetting i etterfølgertreet Registrering av ny forekomst av et etterfølgertegn: Hvis tegnet finnes i treet fra før, økes bare antall forekomster av dette tegnet med 1 Hvis tegnet ikke finnes fra før, settes det inn som en bladnode med den vanlige algoritmen for innsetting i binært søketre I tillegg må vi oppdatere antall forekomster av tegn i alle de andre nodene som berøres av innsettingen: Gjøres enkelt ved å legge til 1 i alle nodene vi er innom på søkeveien ned til noden som lagrer dette etterfølgertegnet

Eksempel: Setter inn ny forekomst av 'e' Før: h(14) f(5) b(3) m(7) e(1) k(2) o(4) s(1) Etter: h(15) f(6) b(3) m(7) e(2) k(2) o(4) s(1)

Eksempel: Setter inn ny forekomst av 'l' Før: h(14) f(5) b(3) m(7) e(1) k(2) o(4) s(1) Etter: h(15) f(5) b(3) m(8) e(1) k(3) o(4) l(1) s(1)

Etterfølgertre: Implementasjon Bruker en egen klasse for et etterfølgertre Klassen inneholder en indre klasse for nodene i treet, som lagrer: Selve etterfølgertegnet Totalt antall forekomster i subtreet hvor noden er rot Pekere/referanser til venste og høyre barn Metoden for å registrere en ny forekomst av et etterfølgertegn blir nesten lik standardmetoden for innsetting i binært søketre Java-kode: etterfolgerregister.java

Registrering av n-sekvenser i det «store» sekvenstreet Under innlesning registrerer vi hele tiden hver nsekvens som leses sammen med sekvensens etterfølgertegn i teksten Hvis en lest sekvens ikke finnes fra før, settes den inn som en bladnode med den vanlige algoritmen for innsetting i binært søketre Etter at vi har funnet/opprettet sekvensen i det «store» søketreet, registrerer vi en ny forekomst av det leste etterfølgertegnet for denne sekvensen

Sekvenstre: Implementasjon Bruker en egen klasse for sekvenstreet Klassen inneholder en indre klasse for nodene i treet, som lagrer: Selve n-sekvensen En peker til roten i det «lille» søketreet med registrerte etterfølgertegn til denne sekvensen Pekere til venste og høyre barn i sekvenstreet Metoden for å registrere ny forekomst av sekvens blir nesten lik standardmetoden for innsetting i et søketre Java-kode: sekvensregister.java

Utskrift av tilfeldig svada Begynner med å skrive ut den første n-sekvensen som ble lest fra input Skriver deretter ut ett og ett tegn på denne måten: Søk i det «store» sekvenstreet og finn den siste utskrevne sekvensen Velg tilfeldig et av tegnene som er registrert som etterfølger til denne siste utskrevne n-sekvensen, og skriv ut dette tegnet Vi har da skrevet ut en ny n-sekvens, og er klar for å velge neste tegn fra denne sekvensens etterfølgertre Trekkingen av etterfølgertegn gjøres slik at tegnene forekommer med samme frekvenser som i input

Eksempel: Tilfeldig trekking av etterfølgertegn d(14 2) b(5 1) a(3 3) c(1 1) f(7 1) e(2 2) g(4 3) h(1 1) Trekk et tilfeldig tall r, 1 r 14: Hvis 1 r 5, velg (rekursivt) et tegn fra venstre subtre Hvis 5 < r (14 7) = 7, velg tegnet i roten, d Hvis (14-7) = 7 < r 14, velg (rekursivt) et tegn fra høyre subtre Fordeling: a: 1 2 3, b: 4, c: 5, d: 6 7, e: 8 9, f: 10, g: 11 12 13, h: 14

Implementasjon av utskrift Tilfeldig trekning av etterfølgertegn: Søk etter n-sekvens og neste tegn som skal skrives ut: Metoden trekk i etterfolgerregister.java Metoden trekketterfolger i sekvensregister.java Formatering av utskriften: Metoden skrivsvada i hovedprogrammet svada.java

Tekstfiler som kan brukes til testing Adolf Hitlers tale i Sportpalast Berlin, 30. januar 1940 Winston Churchills tale i The House of Commons, London, 18. juni, 1940 Kong Harald Vs nyttårstale i 2008 Merk: I disse tre filene er nest siste avsnitt i talen repetert på slutten av filen, for å unngå at vi skriver ut en n-sekvens som ikke finnes registrert Filene inneholder spesialtegn som kan gi problemer ved utskrift fra Java-programmet tegnsettet i output kan evt. transformeres før utskrift