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. Den 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 (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 r) { root = r; } 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 compares(Comparable rhs) { Node n = (Node) rhs; return weight < n.weight ? -1 : weight == n.weight ? 0 : -1; } public boolean lessThan(Comparable rhs) { return weight < ((Node) rhs).weight; } 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(Vector list) { BinaryHeap priorityQueue = new BinaryHeap( new Node(Integer.MIN_VALUE)); Enumeration e = list.elements(); while (e.hasMoreElements()) priorityQueue.insert((Character) e.nextElement()); try { for (int size = list.size(); size >= 2; size--) { Node t1 = (Node) priorityQueue.deleteMin(); Node t2 = (Node) priorityQueue.deleteMin(); priorityQueue.insert(new Node(t1.weight + t2.weight, t1, t2)); } return new HuffmanTree((Node) priorityQueue.deleteMin()); } catch (Underflow e) { return null; } }

17 16 import java.io.*; import java.util.*; import DataStructures.*; import Supporting.*; import Exceptions.*; class HuffmanTree {...}; class Node implements Comparable {...}; class Character extends Node {...}; class CodeTable {...}; public class Huffman { static Vector readFrequencies(BufferedReader input) throws IOException {...}; static HuffmanTree buildHuffmanTree(Vector list) {...}; static CodeTable buildCodeTable(HuffmanTree tree) {...}; static void doCommands(BufferedReader input, HuffmanTree tree, CodeTable table) {...}; public static void main(String argv[]) {...}; }

18 17 CodeTable buildCodeTable(HuffmanTree tree) { CodeTable codeTable = new CodeTable(); codeTable.build(tree.root, ""); return codeTable; } class CodeTable { String[] code = new String[256]; void build(Node n, String prefix) { if (n instanceof Character) code[((Character) n).character] = prefix; else { build(n.left, prefix + "0"); build(n.right, prefix + "1"); }

19 18 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

20 19 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

21 20 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.

22 21 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

23 22 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. class IdNode implements Comparable { String word; Queue lines; IdNode(String theWord, int currentLine) { word = theWord; lines = new QueueAr(); lines.enqueue(new Integer(currentLine)); } public int compares(Comparable rhs) { return word.compareTo(((IdNode) rhs).word); } public boolean lessThan(Comparable rhs) { return word.compareTo(((IdNode) rhs).word) < 0; } }

24 23 public void generateCrossReference() { BinarySearchTree theIdentifiers = new BinarySearchTree(); // Insert identifiers into the search tree while (getNextID()) { try { IdNode id = (IdNode) theIdentifiers.find(currentIdNode); id.lines.enqueue(new Integer(currentLine)); } catch (ItemNotFound e) { try { theIdentifiers.insert( new IdNode(currentIdNode.word, currentLine)); } catch(DuplicateItem ex) {} // Cannot happen } //... print the cross reference... } Opbygning af binært søgetræ

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

26 25 // Iterate through search tree and output // identifiers and their line number try { InOrder itr = new InOrder(theIdentifiers); for (itr.first(); itr.isValid(); itr.advance()) { IdNode id = (IdNode) itr.retrieve(); System.out.print(id.word + ": " + (Integer) id.lines.dequeue()); while (!id.lines.isEmpty()) System.out.print(", " + (Integer) id.lines.dequeue()); System.out.println(); } catch (ItemNotFound e) {} // Empty tree catch (Underflow e) {} // Cannot happen Udskrivning af det binære søgetræ (ved hjælp af inorder-traversering)

27 26 Simulering Anvendelser II

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

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

30 29 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

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

32 31 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

33 32 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

34 33 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)

35 34 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

36 35 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

37 36 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)

38 37 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

39 38 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

40 39 Waiting line Car washer Served car Tearoom Car washer Simulering af et bilvaskeri (car wash)

41 40 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 holder åben 8 timer om dagen. (8) Biler, der ankommer før lukketid, bliver vasket.

42 41 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.

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

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

45 44 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.

46 45 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); }

47 46 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(); }

48 47 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)); }

49 48 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); }

50 49 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; }

51 50 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)); }

52 51 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

53 52 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

54 53 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; }

55 54 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

56 55 public void cancel() { if (suc != null) { suc.pred = pred; pred.suc = suc; suc = pred = null; } suc pred 5.3 2.33 7.24 ev

57 56 public static void runSimulation(double period) { 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(); time = 0; }

58 57 Repræsentation af hændelseslisten (SQS) Hændelseslisten kan organiseres, således at indsættelse bliver mere effektiv. For eksempel ved brug af et splay-træ. [ Øvelsesopgave ]

59 58 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

60 59 Identifikation af processerne (1) Bil( Car ) (2) Bilvasker( CarWasher ) (3) Bilgenerator( CarGenerator )

61 60 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); }

62 61 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)); }

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

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

65 64 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

66 65 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

67 66 Læs kapitel 14 i lærebogen (side 367-408) Løs følgende opgaver 6-1. Opgave 12.1 6-2. Se opgaven på næste side. Ugeseddel 6 16. oktober - 23. oktober

68 67 Simuleringsopgave Pakken simulation.event, der kan hentes fra kursets hjemmeside, tilbyder faciliteter til hændelsesbaseret simulering. a. Benyt pakken til at simulere den modembank, der er beskrevet i kapitel 13 i lærebogen. b. Benyt et splay-træ til at implementere hændelseslisten. Denne datastruktur findes i pakken DataStructures. Vær opmærksom på, at metoden insert kaster en udtagelse, hvis der i forvejen findes en post med samme nøgle. Pakken javaSimulation, der også kan hentes fra kursets hjemmeside, tilbyder faciliteter til procesbaseret simulering. c. Benyt denne pakke til at simulere modembanken.


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

Lignende præsentationer


Annoncer fra Google