1 2 4 8 16 32 64 128 254 512 1024 0,5 0,125 0,0635 10=A 11=B 12=C 13=D 14=E 15=F Notwendige Stellen für Z in B: n= logB (Z) logB(Z)= log Z /log B 4bit=eine Hex-Stelle 3bit=eine Oktalstelle Binär: Subtraktion = Addition mit 2erKomplement und invertieren des MSB GKZ 32bit: 1bit VZ, 8bit Exponent, 23bit Mantisse (führende 1 nicht aufschreiben!) Umrechnung GK . Dezimalzahl 1. Dezimalzahl als Festkommazahl binär berechnen (die Anzahl der Nachkommastellen ist immer beschränkt !) 2. Das Komma solange nach links oder rechts verschieben, bis die Festkommazahl mit „1,“ beginnt. Bei jedem Verschieben um eine Stelle den Exponenten anpassen 3. Den Exponenten in die Charakteristik umrechnen 4. Die Charakteristik als Binärzahl darstellen 5. Die einzelnen Binärzahlen zu einer Gleitkommazahl zusammensetzen (Daslinke Bit ist das Vorzeichen!) Gleitkommazahlen - Rechnen . Addition / Subtraktion 1. Exponent anpassen . Auswirkung auf die Mantisse beachten! 2. Operation auf die Mantissen ausführen 3. Normalisieren der Ergebnis-Mantisse . Auswirkung auf Exponent! . Multiplikation / Division 1. Exponenten addieren/subtrahieren, Offset berücksichtigen 2. Operation auf die Mantissen ausführen 3. Normalisieren der Ergebnis-Mantisse . Auswirkung auf Exponent! . Die Operation auf die Mantisse ist annähernd gleich zum Rechnen mit Ganzzahlen Bool'sch Algebra „und, konjunkt“: a ^ b, a*b „oder, disjunkt“: a v b, a + b bei n Variablen 2^2^n mögliche Verknüpfungen DNF: ( * * *) + ( * * *) +( * * *) Terme mit f=1 aus Wertetabelle a + (b · c) = (a + b) · (a + c) Distributiv a · a = a a + a = a Idempotenz KNF: (+ + +) * (+ + +) * (+ + +) Terme mit f=0 aus Wertetabelle, Variablen negieren -a · a = 0 -a + a = 1 Komplementäre a·(a+b) = a a+(a · b) = a Absorbtion In jedem Term müssen alle Variablen vorkommen! ___ _ _ ___ _ _ KV-Diagramm aus DNF!!!! a+b=a*b a*b =a+b Automat: Abstraktes Modell zur Prüfung v Zeichenketten (Mealy Zeichenausgabe bei Zustandsübergang/Morre Ausgabe im Zustand) endlicher Automat: endliches Eingabealphabet Determinissmus: Eindeutigkeit der Zustandsübergänge Kellerautomat: EA mi Keller Speicher Turingmaschiene: Modell zur Beurteilung der Berechenbarkeit -->EA mit Schreib/Lesespeicher Die Grammatik G einer Sprache L ist definiert durch: . Die endliche, nicht-leere Menge – der Terminalzeichen T (Alphabet) (rechts von ::=) – der Nicht-Terminale N (grammatische Begriffe) – Der Produktionsregeln (Grammatikregeln) . Sowie das Satzelement S, ein bestimmtes Element aus N Die Vereinigungsmenge aus N und T nennt man Vokabular V Die Definition wird meistens als Quadrupel angegeben: G(L) = ( T, N, S, P) Eine Grammatik besteht minimal aus der Produktionsregel – S --> ε (ε ist das leere Element) Chomsky-Hierarchie Typ 3: reguläre Grammatik Typ 2: kontextfreie Grammatik Typ 1: kontextsensitive Grammatik Typ 0: Grammatik kontextfreie Gramatik (Typ 2) erlaubte Ausdrücke auf der linken Seite: ein Nichtterminal. S ::= erlaubte Ausdrücke auf der rechten Seite: das leere Element ::= å oder beliebige Kombinationen von Terminalen und Nichtterminalen Zur Prüfung dieses Types ist ein Kellerautomat erforderlich. Zur Vereinfachung der Lesbarkeit sind gebräuchlich: 1. Zuweisungsoperator „-->“ wird ersetzt durch „::=“ 2. Einschluß der Nichtterminale in <spitze Klammern> 3. Zusammenfassung von Zuweisungen mit identischer „linker Seite“ mit der „|“ Schreibweise. Kurzschreibweisen für Wiederholungen: [] 0 oder 1 mal (optional) {} beliebig oft (auch 0 mal) () dienen der Zusammenfassung, keine Bedeutung Eine reguläre Grammatik ist den meisten Einschränkungen unterworfen:erlaubte Ausdrücke auf der linken Seite: ein Nichtterminal. S ::= erlaubte Ausdrücke auf der rechten Seite: das leere Element ::= å oder mind. ein Terminal ::= a oder mind. ein Terminal gefolgt von einem Nichtterminal. ::= abcA ( bzw. ::= Aabc) Eine reguläre Gr. ist mit einem endlichen Automaten prüfbar. Bubblesort: While Liste nicht sortiert Beginne am Listenanfang Do If Name alphabetisch hinter Nachfolger Then vertausche Name mit Nachfolger Nimm nächsten Namen While nicht Ende der Liste Komplexität: n² Radixsort: - Stapel für jedes mögliche Zeichen (d. Wortes) - Lese jedes Zeichen der Wörter von rechts und lege die Wörter auf die entsprechenden Stapel - Vereinige alle Stapel (FIFO) - Gesamtstapel auch FIFO! Komplexität: O((m+1)*k) (m Zeichenvorrat, k Anzahl Stellen) Divide and Conquer: (Mergesort) teile Liste sortiere die Teillisten vereinige die teillisten rekursiv Binärbaum: neues Element vor Wurzel-->links einfügen neues Element nach Wurzel -->rechts einfügen iterativ iterativ Heapsort: - Basierend auf binärem Baum - alle inneren Knoten bis auf maximal einen haben zwei Söhne / Töchter - alle Knoten mit weniger als 2 Kindern befinden sich auf dem grössten beiden Leveln - Blätter auf den grössten Leveln sind von Links nach rechts aufgefüllt - Heap-Eigenschaft: fast vollständig binärer Baum, jeder Knoten ist nummeriert - die in einem Knoten gespeicherte Zahl ist grösser als die in seinen Kindern gespeicherte Zahl 3 Grundoperationen: Reheap, Create-Heap, Delete Max EV Elementenvorrat (Anzahl der möglich Wörter) O rdnungssatistik EV = Bs (B: Anzahl der möglichen Zeichen, S: Anzahl der Stellen) Median aus 4: Vergleiche Kodierung: Abbildung von Alphabet 1 auf Alphabet 2 Binärer Codebaum: Entscheidungsgehalt: EG = ld EV = ld Bs = s * ld B Entscheidungsredundanz: ER = EG2 – EG1 = ld (EV2 / EV1) (EV2 binär, EV1nicht binär) Informationsgehalt: G = ld 1 / p = - ld p entspricht mittlere Stellenanzahl Mittlere Codewortlänge sm: sm = Summe über alle Zeichen (p(i) * s(i)) [bit / Symbol] minimal mittlerer Informationsgehalt = Entropie H H = Summe über all Zeichen (p(i) * ld 1 / p(i)) Informationsredundanz IR: (Überschuss an Daten) IR = sm – H Zeichenerkennung: Kompressionsfaktor = unkompr. Datenmenge / kompr. Datenmenge Huffman-Codierung: -rekursiver Aufbau eines binären Codebaumes - Tabelle mit Wahrscheinlichkeiten für das Auftreten aller Symbole des Alphabets - Sortieren nach Wahrscheinlichkeit - Zusammenfassen der beiden Symbole mit d. kleinsten Wahrscheinlichkeiten zu einem Teilbaum aus zwei Blättern, die durch 0 (rechts) und 1(links) unterschieden werden. - Dieses neue Symbol wird in einer Tabelle eingetragen und mit der neuen Wahrscheinlichkeit neu einsortiert - Dekodierung: Von Anfang an den Codebaum für jedes Zeichen durchlaufen. Kommt man an einem Blatt an hat man ein weiteres Zeichen - Huffmann-Codierung produziert einen optimale Codierung (L=H) wenn die Symbolwahrscheinlichkeit negative Potenzen von 2 sind - Nachteil wenn Anzahl der Symbole sehr groß - Nachteil wenn Symbolwahrscheinlichkeiten sich ändern - Huffman-Codierung ist ein rein sequentieller Prozess struct element { char name[50]; struct element *next; struct element *prev; }; Einfügen doppeltverk. Liste (Liste ist leer) new->next = NULL; new->prev = NULL; *last = new; *top = new; Zeiger int *ptr ptr: Speicheraddresse *ptr: Speicherinhalt zwischen zwei (tmp aktuelle Position) tmp->prev->next = new; new->next = tmp; new->prev = tmp->prev; tmp->prev = new; Variable: & variable: Speicherad variable: Inhalt Short 16bit Int, long 32bit float 32bit double 64bit char 8bit unsigned** VZ-los Array: Arrayname.Feldname Liste: zeiger->Feldname temp = (struct element *) malloc( sizeof(struct element) ); strcpy(ptr->name, variable); Am Anfang new->next = tmp new->prev = NULL; tmp->prev = new; *top = new; Am Ende latest->next = new; new->next = NULL; new->prev = latest; *last = new;