230 likes | 500 Views
Kód, abeceda, kódování zpráv. Kódován í – proces nahrazování posloupností, vyjádření symbolů zprávy v jedné ( zdrojové ) abecedě A, posloupností vyjádření těch samých symbolů v jiné ( kódovací ) abecedě A C
E N D
Kód, abeceda, kódování zpráv Kódování – proces nahrazování posloupností, vyjádření symbolů zprávy v jedné (zdrojové) abeceděA, posloupností vyjádření těch samých symbolů v jiné (kódovací) abecedě AC kódové slovo – prvek AC, presp. posloupnost prvků Ac, použivá pro vyjádření prvku A, resp. posloupnosti prvků A kód – množina všech kódových slov, použitá pro jistou konkrétní formu kódování, předpis pro zobrazování (podmnožin) prvků A do (podmnožin) prvků AC Příklady aplikací kódování: pořizování dat, šifrování (utajování) zpráv, samoopravné kódování (integrita) zpráv, komprese (minimalizace „prostoru pro uchování“) zpráv, transformace zpráv na signálové prvky pro přenos, ...
Kód, abeceda, kódování zpráv formálněji Abeceda – konečná množina znaků (prvků) Slovo (zpráva, fráze, řetězec) nad abecedou A – konečná posloupnost znaků z A délku této posloupnosti nazýváme délkou slova, je-li slovo značeno s, pak značíme jeho délku |s| množinu všech slov nad abecedou A značíme A* , množinu všech slov nenulových délek vzniklých ze znaků z A označujemeA+ -pro naše zkoumání platí AC = {0,1} -Kódování je funkce , kód C je trojice C : (A, A*,K) -Aby kódování bylo jednoznačně dekódovatelné, funkce K musí být prostá (každé dva různé zdrojové prvky jsou zobrazovány na dvě různá kódová slova).
Kód, abeceda, formálněji Typická strategie kódování: zprávu s rozdělíme na slova s = s1 s2 ... sk , si ∊A* si– slova, fráze, pokud neřekneme jinak, fráze mají pevnou délku -určíme C(s1), ... , C(sk) ∊A*, kde C(si) jsou kódová slova -K(s) = C(s1) C(s2) ... C(sk), resp. K(s1s2...sk) = C(s1) C(s2) ... C(sk)
Kód, příklad kód, C, zobrazující prvky abecedy A do množiny prvků abecedy AC A je např. posloupnost znaků {a,b,c,d,...} AC jsou např. kódová slova tvořená vybranými bitovými řetězci např. kód ACII ztotožňuje znaky (anglické) abecedy a některé další znakys dekadickými čísly 0 až 127, např. A ∼ 65, a ∼97 pro zpracování v počítači je kódovací abeceda vyjadřovaná 7icemi bitůekvivalentními dekadickým kódovým slovům, např. A ∼ 1 000 0012. Pak kód ASCII ztotožňuje znaky anglické abecedy se 7icemi bitů text HELLO! zobrazuje kód ASCII na binární řetězec 100100010001011001100100110010011110100012, pro lepší vizuální názornost s mezerou mezi znaky: 1001000 1000101 1001100 1001100 1001111 01000112
Klasifikace kódů, problém jednoznačné dekódovatelnosti kód C je nesingulární kód, když každý prvek abecedy S1, např. {A,B,C,D, …} zobrazuje na jiné kódové slovo vytvořené z prvků abecedy S2, např. {1,0} příklad nesingulárního kódu: S1 = { A,B,C,D}, S2 = { 0,010,01,10}) vysílač vysílá znak B jako bitovou posloupnost 010 přijímač přijme řetězec 010 a přijatý řetěz může dekódovat na znak B nebo na řetěz znaků CA nebo na řetěz znaků AD výše uvedený kód není jednoznačně dekódovatelný pokud se vysílá zpráva složená z více symbolů, kódovaných nesingulárním kodem, musí se jednotlivé symboly oddělovat speciálním symbolem, např. „čárkou“ (,) – oddělovač/separátor, …
Klasifikace kódů, jednoznačně dekódovatelný kód Cílem kompresního kódování je řešení problému minimalizace očekávaných délek kódových slov, ale při zachování omezující podmínky požadující zachovat schopnost on-line dekódovat kódová slova bez vkládání separátorů jestliže v nesingulárním kódu C platí -C(x1, …, xn) = C(x1), …, C(xNn) a zdrojové prvky a kódová slova, xi a C(xi), mají konečné délky, pak C je jednoznačně dekódovatelný kód. Kód (A,AC,K) je jednoznačně dekódovatelný kód právě tehdy, když všechny možné řetězce z jsou jednoznačně dekódovatelné Řetězec x ∊je jednoznačně dekódovatelný vzhledem k zobrazení K, jestliže existuje právě jeden řetězec y ∊ A+ takový, že K(y) = x
Klasifikace kódů, jednoznačně dekódovatelný kód Každému vygenerovanému řetězci kódových slov jednoznačně dekódovatelného kódu odpovídá jediný zdrojový řetězec, který jej produkuje, a dále platí – pro zjištění byť i prvního symbolu zprávy se někdy musí analyzovat celá zpráva Jestliže C(a) = 10, C(b) = 00, C(c) = 11 a C(d) = 110, pak C(ab) = 1000, C(cb) = 1100. při přijetí zprávy 1000 se hodnota ab rozpozná „online“ 1000 při přijetí zprávy 1100 se ale pozná, zda se jedná o cb, 1100 nebo d?, 1100, až po analýze celého řetězu problém – kódové slovo c je prefix kódového slova d Určení, zda libovolný kód je jednoznačně dekódovatelný je algoritmicky neřešitelný problém Existují třídy kódů, které jsou jednoznačně dekódovatelné, mezi ně patří např. prefixové, afixové a blokové kódy.
Klasifikace kódů,prefixový, afixový a blokový kód Jestliže žádné kódové slovo z jednoznačně dekódovatelného kódu není prefixem jiného kódového slova z , jedná se o prefixový kód žádné kódové slovo prefixového kódu není zřetězením jiného kódového slova (prefixu) a dalšího řetězce prefixový kód lze dekódovat prvek po prvku, během čtení zleva doprava, můžeme začít s dekódováním, aniž bychom znali celý kódový text, každé kódové slovo je„samovyčlenitelné“ mezi prefixové kódy patří například kód UTF-8 Pro afixový kód platí, že žádné jeho kódové slovo není příponou jiného jeho kódového slova. Je dekódovatelný znak po znaku během čtení zprava doleva. Pokud mají všechna kódová slova stejnou délku, pak tento kód označujeme jako blokový. Blokovým kódem je například kód ASCII
Klasifikace kódů,prefixový kód platí – každý prefixový kód je nesingulární kód platí – každý prefixový kód je jednoznačně dekódovatelný kód existují ale i jednoznačně dekódovatelné kódy, které nejsou prefixové: C(a) = 0, C(b) = 01, C(c) = 011 a C(d) = 0111 je nesingulární jednoznačně dekódovatelný kód, každá 0 následující po nějakém existujícím symbolu jednoznačně startuje nový symbol není prefixový kód – např. C(a) = 0 je prefixem všech symbolů atd.
Proč se vlastně kóduje? je nutná změna velikosti a/nebo typu abecedy, např. znaky a,b,c, … kódujeme na posloupnosti 0 a 1. Kódování si vynucuje prostředí do kterého se zpráva zapisuje, kterým se přenáší, … existuje požadavek na utajení obsahu zprávy kryptografie PV017 a další předměty kódování omezující přístup ke kódu jen na autorizované subjekty je nutné dosáhnout lepší využití kapacity paměti, resp. kapacity přenosového kanálu komprese dat,tou se budeme dále zabývat hlouběji =identifikace a odstranění redundance (nadbytečnosti) v originální zprávě jejím kódováním do jiné abecedy
Komprese zprávy – role metodiky tvorby kódových slov Zdroj generuje zprávy, jejichž symboly jsou kódované prvky abecedy o N prvcích Pro kódování prvků této abecedy do abecedy {0,1} potřebujeme v průměru alespoň log2N bitů, pokud nechceme takovým kódováním snížit možné množství informace ve zprávě pokud N = 8, pak potřebujeme alespoň 3 bity, log28 = 3, 23 = 8 pokud N = 26, pak potřebujeme alespoň 5 bitů, 25 = 32, 6 kombinací se přitom nevyužije … Pro vyjádření symbolů zpráv se používají kódová slova prvky, či posloupnosti prvků, nějaké abecedy, např. {a,b, …}, polohy rukou signalisty, slova jazyka, … případně posloupnost prvků nějaké abecedy, např. {0,1} – {0 110 001, 0 110 010, …} nebo {0, 10, 11, 110, 1110, 1111}
Komprese zprávy – role metodiky tvorby kódových slov kódová slova pevné délky {a,b, …},{0 110 001, 0 110 010, …} výhoda – snadná a jednoznačná dekódovatelnou, slovníky nerespektují se žádné statistické charakteristiky výskytu kódová slova proměnné délky {0, 10, 110, 1110, 1111} délky kódových slov obvykle odrážejí statistické charakteristiky výskytu jednotlivých kódových slov základní zákon komprese dat -je žádoucí, aby častěji použitá kódová slova měla kratší délku požaduje se bezprostřední rozhodnutelnost při dekódování vhodná je prefixová vlastnost kódu vhodné jsou prefixové kódy žádné kódové slovo kódu není prefixem některého jiného kódového slova daného kódu
Průměrná délka kódového slova kódu Průměrnou délka kódového slova kódu C pro diskrétní náhodnou veličinu X nabývající hodnot x∊ A s pravděpodobnostní funkcí p(x) definujeme jako L(C) = pro jednoznačně dekódovatelný kód platí H(X) ≤ L(C) Nechť A = 0, 10, 11, p(0) = 0,5, p(10) = 0,4, p(11) = 0,1: -log2(0,5) = 1, -log2(0,4) = 1,32, - log2(0,1) = 3,32 H(X) = 0,5 × 1 + 0,4 × 1,32 + 0,1 × 3,32 = 1,36 a L(C) = 0,5 × 1 + 0,4 × 2 + 0,1 × 2 = 1,5 Nechť A = 00, 01, 11, p(00) = 0,5, p(10) = 0,4, p(11) = 0,1 : H(X) se změnou kódování nezmění, H(X) = 1,36 a L(C) = 0,5 × 2 + 0,4 × 2 + 0,1 × 2 = 2, jak dá rovněž i selský rozum
Prefixové kódy, o ty nám hlavně jde Pro libovolný optimální prefixový kódC pro náhodnou veličinu X platí H(X) ≤ L(C) < H(X) + 1. unární kódC C(1) = 1, C(i + 1) = 0C(i) nebo C(1) = 0, C(i + 1) = 1C(i) C(i) = i – 1 nul následovaných 1, C(5) = 000012 resp. C(i) = i – 1 jedniček následovaných 0, C(5) = 111102 optimální kód pro
Prefixové kódy, o ty nám hlavně jde binární kódC(0) = 0, C(1) = 1, C(2i) = C(i)0, C(2i + 1) = C(i)1 nesplňuje vlastnost jednoznačně dekódovatelného kódu, jeho použití vyžaduje používání buďto oddělovačů nebo pevné délky kódových slov pevná délka kódových slov vyžaduje apriorní znalost velikosti množiny kódovaných čísel – N, poněvadž ta pak determinuj velikost, délku, kódových slov, |B(N)| = [1 + log2 N], a velikost množiny N nemusí vždy známé předem (B(n) – binární reprezentace celého čísla n) binární kód je optimální pro p(i) = 1/N
Další příklady prefixových kódů (Eliasovy, Peter Elias, 1975) nechť B(n) značí B(n) bez nejvýznamnějšího bitu (vždy = 1) C1:kladené celé se kóduje zápisem s prefixem – unárním kódem délky binární reprezentace n, |B(n)| n = 38 = 1001102 (38) = 001102, | | = 6, takže C1(38) = 000001001102 n = 5 = 1012, (5) = 012, || = 1, takže C1(1) = 12 délka C1() = 2[log2 ] + 1 C2: přeuspořádání C1: každý z B(n)bitů se uvede příznakem 0, poslední příznak na konci kódového slova = 1 C2(5) = 000112, délkový prefix se rozptýlí do B(n)
Prefixový strom Každý prefixový kód (nad binární kódovací abecedou) lze znázornit binárním stromem – prefixovým stromem Prefixový strom lze využít k dekódování. 1 1 2 01 3 001 4 0001 5 00001 6 …
Prefixový strom Elias, C1 1 1 2 010 3 011 4 00100 5 00101 6 00110 7 00111 8 0001000 …
Prefixový strom Elias, C2 1 1 2 001 3 011 4 00001 5 00011 6 01001 7 01011 8 0000001 …
Další příklady prefixových kódů (Eliasovy) Kódová slova Eliasova kódu C1 kód jsou pro velká čísla dlouhá To je způsobeno reprezentací délky kódu čísla unárním kódem Eliasův kód C3používá pro vyjádření délky kódu čísla kód C2 Nejprve ilustrace s malým číslem, 50 (1100102) kódové slovo Eliasova kódu C1 pro 50 je 000001100102, |B(50)| = 6 bitů, jeho permutací na kódové slovo C2 vznikne 010000010012 délka kódového slova pro 50 v C2 je 11 bitů C1(6) = 00110, C2(6) = 01001, C3(50) = 01001100102 délka kódového slova pro 50 v C3 je 10 bitů
Další příklady prefixových kódů (Eliasovy) a nyní Eliasův kód C3pro 1 000 000 (111101000010010000002) Kódové slovo Eliasova kódu C1 pro 1000000 je 0000000000000000000111101000010010000002, |B(1 000 000)| = 20 bitů, |C1(1 000 000)| = 39 bitů délku 20 vyjádříme v C2, 20 = 101002, |B(20)| = 5, C1(20) = 0000101002, C2(20) = 0001000012 Kódové slovo Eliasova kódu C3 pro 1 000 000 je 00010000111101000010010000002 a má délku 28 bitů místo 39 bitů kódu téhož čísla v C2
Poznámky k porovnání kódů Prostorově nejvýhodnější je samozřejmě binární kód, ten ale není jednoznačně dekódovatelný Unární kód je použitelný pro malá čísla, délka jeho kódových slov výrazně roste s rostoucí zdrojovou jednotkou