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

Et eksempel: Åtterspillet

Die Auswertung Evaluering

Slope-Intercept Formula

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

Object [] element. array. int [] tall

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.

Ordliste. Obligatorisk oppgave 1 - Inf 1020


Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Binære trær: Noen algoritmer og anvendelser

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

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

LEKTION 7. das Gebäude bygningen die Kirche kyrkja das Riesenrad pariserhjulet

Wissenstest Minivariante 2

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

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

Norges Informasjonsteknologiske Høgskole

Endelig ikke-røyker for Kvinner! (Norwegian Edition)

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

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

Exercise 1: Phase Splitter DC Operation

Lederskap og Tillitskultur - hvorfor de beste lykkes

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.4

Håndtering av tekstfiler

UNIVERSITETET I OSLO

STILLAS - STANDARD FORSLAG FRA SEF TIL NY STILLAS - STANDARD

Periodens sosiale læringsmål:

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

Auch WIR arbeiten in Europa! Spørjeskjema Livshistorie

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

Algoritmer og datastrukturer Assignment 11 Side 1 av 5

Vekeplan 4. Trinn. Måndag Tysdag Onsdag Torsdag Fredag AB CD AB CD AB CD AB CD AB CD. Norsk Matte Symjing Ute Norsk Matte M&H Norsk

KANDIDATEN MÅ SELV KONTROLLERE AT OPPGAVESETTET ER FULLSTENDIG

Korteste vei i en vektet graf uten negative kanter

Algoritmer og Datastrukturer

Obligatorisk oppgave 1 INF1020 h2005

Den som gjør godt, er av Gud (Multilingual Edition)

Årsplan Tysk for ungdomstrinnet. 1 Das ist meine Welt

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

Han Ola of Han Per: A Norwegian-American Comic Strip/En Norsk-amerikansk tegneserie (Skrifter. Serie B, LXIX)

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

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

Kommunikasjonsperm. Overvåking og undersøkelser side 1. Smerter side 2. Naturlige funksjoner, eliminasjon side 3. Sengeleie og stell side 4

Rekursiv programmering

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

KROPPEN LEDER STRØM. Sett en finger på hvert av kontaktpunktene på modellen. Da får du et lydsignal.

Information search for the research protocol in IIC/IID

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

Språkleker og bokstavinnlæring

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

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

Monteringsanvisning Assembly Instructions Monteringsanvisning. Søve Lekemiljø AS 3830 Ulefoss - Norway Tlf:

Macbeth: Frozen Scenes

Unit Relational Algebra 1 1. Relational Algebra 1. Unit 3.3

INF2220: Forelesning 2

Hvordan føre reiseregninger i Unit4 Business World Forfatter:

Byggesaksutvalget sak 36/08 - vedlegg 5

Trigonometric Substitution

Periode Tema Kompetansemål Arbeidsmåter Vurderingsformer (underveisvurdering med og uten karakter)

UNIVERSITETET. Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Hashliknende strukturer.

kpmg AS Senior revisor

THE MONTH THE DISCIPLINE OF PRESSING

Algoritmer og Datastrukturer

GYRO MED SYKKELHJUL. Forsøk å tippe og vri på hjulet. Hva kjenner du? Hvorfor oppfører hjulet seg slik, og hva er egentlig en gyro?

Eksamen FSP5119 Tysk I PSP5067 Tysk, nivå I. Nynorsk/Bokmål

Se vedlagte skisse som viser hvordan det er tenkt. Dette har også grunneier bekreftet til oss vil være ok.

Syntax/semantics - I INF 3110/ /29/2005 1

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

EKSAMEN med løsningsforslag

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

PETROLEUMSPRISRÅDET. NORM PRICE FOR ALVHEIM AND NORNE CRUDE OIL PRODUCED ON THE NORWEGIAN CONTINENTAL SHELF 1st QUARTER 2016

INF Algoritmer og datastrukturer

Leder i StOr, Anine Klepp. Organisasjonskonsulent, Anette Faane Aasbø

Disjunkte mengder ADT

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

Ukebrevet BARNEHAGEN. Velkommen til Damenes Aften - 8.februar kl se vedlegg i forrige ukebrev for mer info om denne dagen!

Kritisk lesning og skriving To sider av samme sak? Geir Jacobsen. Institutt for samfunnsmedisin. Kritisk lesning. Med en glidende overgang vil denne

Algoritmer og Datastrukturer IAI 21899

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

Funksjonalitet og oppbygning av et OS (og litt mer om Linux)

Håndtering av tekstfiler

- Vennlig hilsen gründerne bak retyre

KartenSpiel ZahlenMonster: 6

PRIORITETSKØ. Aksjehandel. Datastruktur for aksjehandel. Nøkler og Totalorden-relasjonen

KartenSpiel ZahlenMonster: 8

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.4

Hvorfor skal vi lære grammatikk?

Fra sekvensielt til parallelt

UNIVERSITETET I OSLO

Eksamensoppgave i SØK2008 Offentlig økonomi

Dynamic Programming Longest Common Subsequence. Class 27

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

FIRST LEGO League. Härnösand 2012

Anvendelser av grafer

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

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» «ir» «r r» «re» «red» «ede» «den» «en» «n h» «he» «heu» «eut» «ute» «te» «e s» «se» «seh» «ehr» «hr» «r o» «of» «oft» «ft» «t v» «vo» «von» «on» «n d» «de» «dem» «emo» «mok» «okr» «kra» «rat» «ati» «tis» «isc» «sch» «che» «hen» «en» «n I» «Id» «Ide» «dea» «eal» «ale» «len» «en» 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) f(7) a(3) 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) m(7) b(3) e(1) k(2) o(4) s(1) Etter: h(15) f(6) m(7) b(3) e(2) k(2) o(4) s(1)

Eksempel: Setter inn ny forekomst av 'l' Før: h(14) f(5) m(7) b(3) e(1) k(2) o(4) s(1) Etter: h(15) f(5) m(8) b(3) 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) f(7 1) a(3 3) c(1 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