Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

1 Anvendelser II Filkomprimering 2 Filkomprimering Principper Huffmans algoritme Generering af krydsreferencer Simulering Hændelsesbaseret simulering.

Lignende præsentationer


Præsentationer af emnet: "1 Anvendelser II Filkomprimering 2 Filkomprimering Principper Huffmans algoritme Generering af krydsreferencer Simulering Hændelsesbaseret simulering."— Præsentationens transcript:

1

2 1 Anvendelser II Filkomprimering

3 2 Filkomprimering Principper Huffmans algoritme Generering af krydsreferencer Simulering Hændelsesbaseret simulering Procesbaseret simulering Plan

4 3 Filkomprimering Komprimering reducerer størrelsen af en fil for at spare plads ved lagring for at spare tid ved transmission Mange filer har et lavt informationsindhold. Komprimering benyttes til tekst:nogle bogstaver er hyppigere end andre grafik:store ensartede områder lyd:gentagne mønstre

5 4 Run-length encoding Komprimering ved tælling af gentagelser. Komprimering af tekst: Strengen AAAABBBAABBBBBCCCCCCCDABCBAAABBBBCCCD omkodes til 4A3BAA5B8CDABCB3A4B3CD Med escape-tegn (her ’ \ ’): \4A\3BAA\5B\8CDABCB\3A\4B\3CD Run-length encoding er normalt ikke særlig effektiv for tekstfiler.

6 5 Run-length encoding Komprimering af (sort-hvid raster) grafik: 000000000000011111111111111000000000 13 14 9 000000000001111111111111111110000000 11 18 7 000000001111111111111111111111110000 8 24 4 000000011111111111111111111111111000 7 26 3 000001111111111111111111111111111110 5 30 1 000011111110000000000000000001111111 4 7 18 7 000011111000000000000000000000011111 4 5 22 5 000011100000000000000000000000000111 4 3 26 3 000001111000000000000000000000001110 5 4 23 3 1 000000011100000000000000000000111000 7 3 20 3 3 011111111111111111111111111111111111 1 35 011000000000000000000000000000000011 1 2 31 2 Besparelse: 19*36 - 63*6 bit = 116 bit svarende til 23%

7 6 Fixed-length encoding Strengen ABRACADABRA (11 tegn) fylder 11 * 8 bit = 88 bit i byte-kode 11 * 5 bit = 55 biti 5-bit-kode 11 * 3 bit = 33 biti 3-bit-kode (kun 5 forskellige bogstaver) D forekommer kun 1 gang, mens A forekommer 5 gange. Vi kan forsøge at benytte korte koder for bogstaver, der forekommer hyppigt.

8 7 Variable-length encoding Hvis A = 0, B = 1, R = 01, C = 10 og D = 11, kan ABRACADABRA kodes som 0 1 01 0 10 0 11 0 1 01 0 (kun 15 bit) Problemet skyldes, at nogle koder er præfiks for andre. For eksempel er A præfiks for R. Men denne kode kan kun afkodes (dekomprimeres), hvis der anvendes skilletegn (f.eks. et blanktegn).

9 8 Præfikskoder En præfikskode for tegnene A, B, C, D og R : A = 11, B = 00, C = 010, D = 10 og R = 011. Strengen ABRACADABRA kodes som 1100011110101110110001111 (25 bit) En kode, hvor ingen tegnkode er præfiks for nogen anden tegnkode, kaldes en præfikskode. Strengen kan kun afkodes på én måde. Men den valgte præfikskode er ikke den optimale. Denne kan bestemmes ved hjælp af Huffmans algoritme.

10 9 Tries Koden repræsenteres ved et træ, et såkaldt trie (udtales traj). A BRCD 0 1 01 1100 Tegnene er placeret i træets blade. En venstre gren svarer til 0. En højre gren svarer til 1. Kode: A = 0, B = 100, C = 110, D = 111 og R = 101. Strengen ABRACADABRA kodes som 01001010110011101001010 (23 bit)

11 10 Huffmans algoritme (D. A. Huffman, 1952) Beregn frekvenserne for de tegn, der indgår i meddelelsen (eller benyt en foruddefineret frekvenstabel). Tegn Frekvens A 5 B 2 C 1 D 1 R 2 Byg et trie ved successivt af kombinere de to mindste frekvenser.

12 11 Huffmans algoritme A 5 B 2 R 2 C 1 D 1 2 4 6 11 Start med et træ for hvert tegn. Sålænge der er mere end ét træ: sammensæt de 2 “billigste” træer til 1 træ ved at tilføje en ny knude som rod. Træet er optimalt (minimerer ∑ dybde i *frevens i ) - men ikke unikt

13 12 Implementering af Huffmans algoritme class HuffmanTree { HuffmanTree(Node root) { this.root = root; } Node root; } class Node {...} class Character extends Node {...} Repræsentation af træ:

14 13 class Node implements Comparable { Node(int w) { weight = w; } Node(int w, Node l, Node r) { weight = w; left = l; right = r; } public int compareTo(Object rhs) { Node n = (Node) rhs; return weight < n.weight ? -1 : weight == n.weight ? 0 : -1; } int weight; Node left, right; } weight angiver summen af bladenes frekvenser i det træ, der har knuden som rod.

15 14 class Character extends Node { Character(char c, int w) { super(w); character = c; } char character; } Character-objekter udgør træets blade

16 15 HuffmanTree buildHuffmanTree(ArrayList list) { PriorityQueue pq = new BinaryHeap(); Iterator itr = list.iterator(); while (itr.hasNext()) pq.insert((Character) itr.next()); while (pq.size() >= 2) { Node t1 = (Node) pq.deleteMin(); Node t2 = (Node) pq.deleteMin(); pq.insert(new Node(t1.weight + t2.weight, t1, t2)); } return new HuffmanTree((Node) pq.deleteMin()); }

17 16 Problemer for Huffmans algoritme Kodetræet skal medsendes (typisk 255 bytes) Beregningsmæssigt dyr To gennemløb af filen (frekvensbestemmelse + kodning) Typisk 25% pladsreduktion, men ikke optimal

18 17 LZW-komprimering (Lempel, Ziv og Welch, 1977) Opbyg successivt en ordbog i form af et trie. Eksempel: ABRACADABRA 0 A 1 B 2 R 3 C 4 D 5 B 6 A 7 Fixed-length encoding Kodning: ABR1C1D63A

19 18 Generering af krydsreferencer Udvikling af et program, der indlæser et Java-program og udskriver alle programmets navne i sorteret orden sammen med de linjenumre, hvori de forekommer. Navne, der kun forekommer i kommentarer, tekststrenge og tegnkonstanter, skal ikke medtages.

20 19 Eksempel /* Trivial application that displays a string */ public class TrivialApplication { public static void main(String[] args) { System.out.println("Hello World!"); } input:output: String: 3 System: 4 TrivialApplication: 2 args: 3 class: 2 main: 3 out: 4 println: 4 public: 2, 3 static: 3 void: 3 123456123456

21 20 Datastrukturer og algoritme Opbyg et binært søgetræ indeholdende de fundne navne. Hver knude indholder et navn og en kø af de linjenumre, hvori navnet forekommer. Udskriv til slut søgetræets indhold i sorteret orden. TreeMap theIdentifiers; ArrayList lines;

22 21 public void generateCrossReference() { TreeMap theIdentifiers = new TreeMap(); String id; while ((id = getNextID()) != "") { ArrayList lines = theIdentifiers.get(id); if (lines == null) { lines = new ArrayList(); theIdentifiers.put(id, lines); } lines.add(new Integer(currentLine)); } //... print the cross reference... } Opbygning af binært søgetræ

23 22 Eksempel på binært søgetræ key: "TrivialApplication" lines: 2 key: "main" lines: 2 key: "public" lines: 2 3 key: "static" lines: 3 key: "void" lines: 3 key: "println" lines: 4 key: "out" lines: 4 key: "class" lines: 2 key: "System" lines: 4 key: "args" lines: 3 key: "String" lines: 3

24 23 Simulering

25 24 Definitioner Simulering Simulering: Eksperimenter med modeller på en datamaskine Model Model: Repræsentation af et system System System: Et valgt udsnit af virkeligheden

26 25 Matematiske modeller Sproglige modeller Mundtlige og skriftlige beskrivelser Grafiske modeller Billeder, tegninger Skematiske modeller Diagrammer Ikke-matematiske modeller Symbolske modeller

27 26 Matematiske modeller Statisk: Repræsentation af et system i en given fast tilstand Dynamisk: Repræsentation af et systems adfærd over tid Analytisk: En model, hvor relevante spørgsmål alene kan besvares ud fra matematiske ræsonnementer Ikke-analytisk: En model, hvor relevante spørgsmål om modellen er matematisk uhåndterbare

28 27 Simulering (mulig indsnævring) Simulering er eksperimenter med dynamiske, ikke-analytiske modeller på en datamaskine

29 28 En god model er en model, der opfylder det formål, man har med den. Modeller er hverken falske eller sande, men kan være mere eller mindre hensigtsmæssige i forhold til deres formål. Første skridt i en modelleringsproces er en klargøring af, hvad man vil bruge modellen til. Abstraktion og aggregering benyttes som teknikker til at opnå “håndterbare” modeller. Modellering er formålsbestemt

30 29 Modellerings- og simuleringsprocessen teoretisk modelvalidering Model 2. Model- konstruktion Program program- verifikation 3. Model- kodning 1. System- identifikation System empirisk modelvalidering 4. Simulering Teori bekræftelse på teori

31 30 Kontinuerte: Modellens tilstand beskrives ved variable, som varierer kontinuert (“blødt” og uden spring). Modellen er typisk beskrevet ved differentialligninger Dynamiske modeltyper t f(t)

32 31 Diskrete: Modellens tilstand beskrives ved variable, som ændres i spring (forårsaget af hændelser). Eksempel: Et køsystem (kundebetjeningen i en bank, en lægekonsultation). f(t) t

33 32 Kombineret kontinuert og diskret: Modellens tilstand kan beskrives ved variable, som både varierer kontinuert og ændres i spring. Eksempel: et køleskab (varmeudvekslingen med omgivelserne er kontinuert, termostaten forårsager diskrete hændelser) f(t) t

34 33 Modelleringsperspektiver Kontinuert, diskret, eller kombineret kontinuert/diskret er egenskaber ved en model, ikke ved et system Eksempel: Trafikken på en vej Makroperspektiv: kontinuert strøm Mikroperspektiv: hændelser (f.eks. start og stop)

35 34 Begrundelser for at anvende simulering Systemet eksisterer ikke Eksperimenter med det virkelige system er for kostbare, for tidskrævende eller for farlige Eksperimenter med det virkelige system er praktisk umulige at foretage (havstrømme, solsystemet) Formål Beslutningstagen Indsigt

36 35 Begrænsninger ved simulering Kan være kostbar både i maskin- og menneskeressourcer Validering er vanskelig Indsamling af data samt analyse og fortolkning af resultater kræver sædvanligvis et godt kendskab til statistik

37 36 Waiting line Car washer Served car Tearoom Car washer Simulering af et bilvaskeri (car wash)

38 37 Systembeskrivelse (1) Bilerne ankommer til vaskeriet med gennemsnitligt 11 minutters mellemrum. (2) Der er ansat 2 bilvaskere. (3) Når en bil ankommer, bliver den vasket, hvis der er en ledig bilvasker. Ellers venter den i en kø. (4) Så længe der er biler, der venter, bliver de vasket efter tur. (5) En vask tager 10 minutter. (6) Når en bilvasker bliver ledig, venter han i testuen, indtil der ankommer en bil. (7) Vaskeriet har åbent 8 timer om dagen. (8) Biler, der ankommer før lukketid, bliver vasket.

39 38 Formål med simulering (er bestemmende for model) Formålet er at undersøge, hvor meget bilernes ventetid kan nedbringes ved at ansætte endnu en bilvasker. Modeltype En diskret hændelsesmodel.

40 39 Simuleringsparadigmer (1) Hændelsesbaseret (Eks. “Bil ankommer”, “Vask afsluttes”) (2) Aktivitetsbaseret (Eks. “En bil vaskes”) (3) Procesbaseret (Eks. “En bil”, “En bilvasker”)

41 40 Identifikation af hændelser (1) En bil ankommer( CarArrival ) (2) En bilvask påbegyndes( StartCarWashing ) (3) En bilvask afsluttes( StopCarWashing )

42 41 Pakken simulation.event public abstract class Event { protected abstract void actions(); public final void schedule(double evTime); public final void cancel(); public final static double time(); public final static void runSimulation(double period); public final static void stopSimulation(); } Hændelserne og deres tilknyttede handlinger beskrives i underklasser af klassen Event.

43 42 import simulation.event.*; import simset.*; import random.*; public class CarWashSimulation extends Simulation { int noOfCarWashers, noOfCustomers; double openPeriod = 8 * 60, throughTime; Head tearoom = new Head(), waitingLine = new Head(); Random random = new Random(7913); CarWashSimulation(int n) { noOfCarWashers = n;... } class CarWasher extends Link {} class Car extends Link { double entryTime = time(); } class CarArrival extends Event {...} class StartCarWashing extends Event {...} class StopCarWashing extends Event {...} public static void main(String args[]) { new CarWashSimulation(2); }

44 43 Konstruktøren i CarWashSimulation CarWashSimulation(int n) { noOfCarWashers = n; for (int i = 1; i <= noOfCarWashers; i++) new CarWasher().into(tearoom); new CarArrival().schedule(0); runSimulation(openPeriod + 1000000); report(); }

45 44 CarArrival class CarArrival extends Event { public void actions() { if (time() <= openPeriod) { new Car().into(waitingLine); if (!tearoom.empty()) new StartCarWashing().schedule(time()); new CarArrival().schedule(time() + random.negexp(1/11.0)); }

46 45 StartCarWashing class StartCarWashing extends Event { public void actions() { CarWasher theCarWasher = (CarWasher) tearoom.first(); theCarWasher.out(); Car theCar = (Car) waitingLine.first(); theCar.out(); new StopCarWashing(theCarWasher, theCar). schedule(time() + 10); }

47 46 StopCarWashing class StopCarWashing extends Event { CarWasher theCarWasher; Car theCar; StopCarWashing(CarWasher cw, Car c) { theCarWasher = cw; theCar = c; } public void actions() { theCarWasher.into(tearoom); if (!waitingLine.empty()) new StartCarWashing().schedule(time()); noOfCustomers++; throughTime += time() - theCar.entryTime; }

48 47 Metoden report void report() { System.out.println(noOfCarWashers + " car washer simulation"); System.out.println("No.of cars through the system = " + noOfCustomers); java.text.NumberFormat fmt = java.text.NumberFormat.getNumberInstance(); fmt.setMaximumFractionDigits(2); System.out.println("Av.elapsed time = " + fmt.format(throughTime / noOfCustomers)); }

49 48 2 car washer simulation No.of cars through the system = 43 Av.elapsed time = 12.46 3 car washer simulation No.of cars through the system = 43 Av.elapsed time = 10.51 Kørselsresultater

50 49 Planlagte hændelser opbevares i en cirkulær tovejs-liste, SQS, der er sorteret i stigende orden efter hændelsernes indtræffelsestidspunt. Implementering af pakken simulation.event 2.335.37.24 9.8 0 SQS suc pred

51 50 public abstract class Event { protected abstract void actions();... private final static Event SQS = new Event() { { pred = suc = this; } protected void actions() {} }; private static double time = 0; private double eventTime; private Event pred, suc; }

52 51 public void schedule(final double evTime) { if (evTime < time) throw new RuntimeException ("attempt to schedule event in the past"); cancel(); eventTime = evTime; Event ev = SQS.pred; while (ev.eventTime > eventTime) ev = ev.pred; pred = ev; suc = ev.suc; ev.suc = suc.pred = this; } 5.3 2.33 7.24 suc pred ev

53 52 public void cancel() { if (suc != null) { suc.pred = pred; pred.suc = suc; suc = pred = null; } suc pred 5.3 2.33 7.24

54 53 public static void runSimulation(double period) { time = 0; while (SQS.suc != SQS) { Event ev = SQS.suc; time = ev.eventTime; if (time > period) break; ev.cancel(); ev.actions(); } stopSimulation(); } public static void stopSimulation() { while (SQS.suc != SQS) SQS.suc.cancel(); }

55 54 Repræsentation af hændelseslisten (SQS) Hændelseslisten kan organiseres, således at indsættelse bliver mere effektiv. For eksempel ved brug af en binær hob.

56 55 Procesbaseret simulering En proces er systemkomponent, der udfører en sekvens af handlinger i simuleret tid. Hver handling sker i tilknytning til en hændelse. hændelse proces vent i kø bliv vasket aktivitet hændelse aktivitet tid

57 56 Identifikation af processerne (1) Bil( Car ) (2) Bilvasker( CarWasher ) (3) Bilgenerator( CarGenerator )

58 57 Processer og deres tilknyttede handlinger beskrives i underklasser af klassen Process. Pakken javaSimulation public abstract class Process extends Link { protected abstract void actions(); public static double time(); public static void activate(Process p); public static void hold(double t); public static void passivate(); public static void wait(Head q); }

59 58 import javaSimulation.*; import javaSimulation.Process; public class CarWashSimulation extends Process { int noOfCarWashers, noOfCustomers; double openPeriod = 8*60, throughTime; Head tearoom = new Head(), waitingLine = new Head(); Random random = new Random(7913); CarWashSimulation(int n) { noOfCarWashers = n; } public void actions() {...} class Car extends Process {...} class CarWasher extends Process {...} class CarGenerator extends Process {...} public static void main(String args[]) { activate(new CarWashSimulation(2)); }

60 59 public void actions() { for (int i = 1; i <= noOfCarWashers; i++) new CarWasher().into(tearoom); activate(new CarGenerator()); hold(openPeriod + 1000000); report(); } Hovedprocessens aktioner

61 60 class CarGenerator extends Process { public void actions() { while (time() <= openPeriod) { activate(new Car()); hold(random.negexp(1/11.0)); } class CarGenerator

62 61 class Car extends Process { public void actions() { double entryTime = time(); into(waitingLine); if (!tearoom.empty()) activate((CarWasher) tearoom.first()); passivate(); noOfCustomers++; throughTime += time() - entryTime; } class Car

63 62 class CarWasher extends Process { public void actions() { while (true) { out(); while (!waitingLine.empty()) { Car served = (Car) waitingLine.first(); served.out(); hold(10); activate(served); } wait(tearoom); } class CarWasher

64 63 Læs kapitel 14 Løs følgende opgaver Opgave 27: 12.1 (2 point) Opgave 28: Se de næste sider (4 point, ikke-obligatorisk) Opgave 29: Se de næste sider (4 point, ikke-obligatorisk) Afleveringsfrist: tirsdag den 20. november Ugeseddel 8 6. november - 13. november

65 64 Opgave 28: Simulering (4 point, ikke-obligatorisk) Pakken simulation.event, der kan hentes fra kursets hjemmeside, tilbyder faciliteter til hændelsesbaseret simulering. Benyt pakken til at simulere den modembank, der er beskrevet i kapitel 13 i lærebogen.

66 65 Opgave 29: Møntproblemet (4 point, ikke-obligatorisk) En 20-krone, en 10-krone, en 1-krone og en 25-øre er lagt på et bræt med 5 felter, som vist nedenfor. Opgaven går ud på at placere mønterne i omvendt rækkefølge i de 4 felter længst til højre på brættet, ved anvendelse af færrest muligt antal træk. I hvert træk flyttes en mønt et felt til højre eller venstre. Mønterne kan stables, men i et træk må kun den øverste mønt i en stabel flyttes, og en mønt må aldrig placeres ovenpå en mønt, der er mindre. Løs denne opgave ved hjælp af et Java-program 20 10 1 1 25


Download ppt "1 Anvendelser II Filkomprimering 2 Filkomprimering Principper Huffmans algoritme Generering af krydsreferencer Simulering Hændelsesbaseret simulering."

Lignende præsentationer


Annoncer fra Google