sortowanie na bazie wykorzystanie sortowania ze zliczaniem

Podobne dokumenty
Wykład I: Kodowanie liczb w systemach binarnych. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Wygra Polska czy Brazylia, czyli o tym jak zwięźle zapisywać informacje

mgr inż. Grzegorz Kraszewski SYSTEMY MULTIMEDIALNE wykład 4, strona 1. GOLOMBA I RICE'A

Temat: Algorytm kompresji plików metodą Huffmana

teoria informacji Entropia, informacja, kodowanie Mariusz Różycki 24 sierpnia 2015

Technologie Informacyjne

Granica kompresji Kodowanie Shannona Kodowanie Huffmana Kodowanie ciągów Kodowanie arytmetyczne. Kody. Marek Śmieja. Teoria informacji 1 / 35

Podstawowe pojęcia. Teoria informacji

Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie)

teoria informacji Kanały komunikacyjne, kody korygujące Mariusz Różycki 25 sierpnia 2015

Kodowanie i kompresja Streszczenie Studia dzienne Wykład 9,

Stan wysoki (H) i stan niski (L)

Kompresja bezstratna. Entropia. Kod Huffmana

Modulacja i kodowanie. Labolatorium. Kodowanie źródłowe Kod Huffman a

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

wiadomość komunikat - informacja Caius Julius Cesar Człowiek zasztyletowany przez senatorów na forum Romanum w Idy Marcowe roku DCCIX ab urbe condita

Techniki multimedialne

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Kody Tunstalla. Kodowanie arytmetyczne

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Teoria informacji i kodowania Ćwiczenia

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Zadanie 1. Potęgi (14 pkt)

1259 (10) = 1 * * * * 100 = 1 * * * *1

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

AKD Metody słownikowe

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Dane, informacja, programy. Kodowanie danych, kompresja stratna i bezstratna

Temat: Pojęcie potęgi i wykładniczy zapis liczb. Część I Potęga o wykładniku naturalnym

Przemysłowe Sieci Informatyczne (PSI) Wykład #3 kodowanie i wstęp do teorii informacji WYDZIAŁ ELEKTROTECHNIKI I AUTOMATYKI KATEDRA INŻYNIERII

2. Zmienne i stałe. Przykłady Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117).

DYDAKTYKA ZAGADNIENIA CYFROWE ZAGADNIENIA CYFROWE

Liczby rzeczywiste. Działania w zbiorze liczb rzeczywistych. Robert Malenkowski 1

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

IX. Wskaźniki.(3 godz.)

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Języki programowania zasady ich tworzenia

Ćwiczenie nr 4: Kodowanie arytmetyczne, range coder

Kodowanie i kompresja Tomasz Jurdziński Studia Wieczorowe Wykład Kody liniowe - kodowanie w oparciu o macierz parzystości

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Pomorski Czarodziej 2016 Zadania. Kategoria C

Systemy liczenia. 333= 3*100+3*10+3*1

ZADANIE 1. Rozwiązanie:

ZESPÓŁ LABORATORIÓW TELEMATYKI TRANSPORTU ZAKŁAD TELEKOMUNIKACJI W TRANSPORCIE WYDZIAŁ TRANSPORTU POLITECHNIKI WARSZAWSKIEJ

Zadanie 1. Suma silni (11 pkt)

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Założenia i obszar zastosowań. JPEG - algorytm kodowania obrazu. Geneza algorytmu KOMPRESJA OBRAZÓW STATYCZNYCH - ALGORYTM JPEG

Systemy liczbowe używane w technice komputerowej

Entropia Kodowanie. Podstawy kompresji. Algorytmy kompresji danych. Sebastian Deorowicz

Kompresja Kodowanie arytmetyczne. Dariusz Sobczuk

EGZAMIN MATURALNY Z INFORMATYKI 17 MAJA 2016 POZIOM PODSTAWOWY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I WYBRANE: Czas pracy: 75 minut

Wprowadzenie Algorytm ByteRun ByteRun - przykład Algorytm RLE Przykład działania RLE Algorytm LZW Przykład kompresji LZW

1.1. Pozycyjne systemy liczbowe

Algorytmy i struktury danych

0 + 0 = 0, = 1, = 1, = 0.

Wykład 2. Informatyka Stosowana. 10 października Informatyka Stosowana Wykład 2 10 października / 42

Niech x 1,..., x n będzie ciągiem zdarzeń. ---

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Wstęp do Programowania, laboratorium 02

Kod U2 Opracował: Andrzej Nowak

WYDZIAŁ MATEMATYKI KARTA PRZEDMIOTU

Wykład 2. Informatyka Stosowana. 9 października Informatyka Stosowana Wykład 2 9 października / 42

Technika Cyfrowa i Mikroprocesorowa

R n = {(x 1, x 2,..., x n ): x i R, i {1,2,...,n} },

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

SYSTEMY LICZBOWE. Zapis w systemie dziesiętnym

Kodowanie predykcyjne

O systemach liczbowych

Arytmetyka. Arytmetyka. Magdalena Lemańska. Magdalena Lemańska,

Krótka wycieczka do wnętrza komputera

Kodowanie i entropia

Języki i metodyka programowania. Reprezentacja danych w systemach komputerowych

PAMIĘĆ RAM. Rysunek 1. Blokowy schemat pamięci

Wstęp do informatyki- wykład 1

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Rachunek prawdopodobieństwa

Architektura komputerów

Pliki. Informacje ogólne. Obsługa plików w języku C

Dydaktyka matematyki (II etap edukacyjny) II rok matematyki Semestr letni 2016/2017 Ćwiczenia nr 7

Jednostki informacji. Bajt moŝna podzielić na dwie połówki 4-bitowe nazywane tetradami (ang. nibbles).

Plan wyk ladu. Kodowanie informacji. Systemy addytywne. Definicja i klasyfikacja. Systemy liczbowe. prof. dr hab. inż.

Programowanie obiektowe i C++ dla matematyków

1. Operacje logiczne A B A OR B

Metoda Karnaugh. B A BC A

MATEMATYKA WYMAGANIA EDUKACYJNE DLA KLASY IV. Dział programowy: DZIAŁANIA W ZBIORZE LICZB NATURALNYCH

Luty 2001 Algorytmy (7) 2000/2001

Zapis liczb binarnych ze znakiem

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

PLAN KIERUNKOWY. Liczba godzin: 180

Teoria informacji i kodowania Ćwiczenia Sem. zimowy 2016/2017

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

Znaki w tym systemie odpowiadają następującym liczbom: I=1, V=5, X=10, L=50, C=100, D=500, M=1000

Zadanie 2: Arytmetyka symboli

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

Transkrypt:

sortowanie na bazie wykorzystanie sortowania ze zliczaniem sortowanie na bazie polega na sortowaniu fragmentów danych, cyfr, od cyfry najmniej znaczącej do najbardziej znaczącej.można np. sortować liczby całkowite 64-pozycyjne jako czterocyfrowe wartości o bazie 2 do 16 (tzn. tyle jest wartości jakie te cyfry mogą przyjąć) lub trzydziestodwu-cyfrowe wartości o bazie dwa do drugiej = 4. To jakie wartości zostaną wybrane jako baza, zależy od właściwości samych danych (od ich oceny przez sortującego) 1

sortowanie na bazie opis argumentów int rxsort( int *data, int size, int p, int k) data - wskazuje na dane size - ile elementów do posortowania p - liczba cyfr w liczbach k baza (np. jeśli mamy liczby zapisane w układzie dziesiętnym i sortujemy po jednej cyfrze, to k=10 ) 2

sortowanie na bazie rxsort() #include <limits.h> #include <math.h> #include <stdlib.h> #include <string.h> int rxsort(int *data, int size, int p, int k); int rxsort(int *data, int size, int p, int k) { int *counts, *temp; 3

sortowanie na bazie rxsort() int index, pval, i, j, n; /********************************* Alokacja pamięci na liczniki. *********************************/ if ((counts = (int *)malloc(k * sizeof(int))) == NULL) return -1; 4

sortowanie na bazie rxsort() /**************** Alokacja pamięci na elementy posortowane ****************/ if ((temp = (int *)malloc(size * sizeof(int))) == NULL) return -1; 5

sortowanie na bazie rxsort() /* sortowanie od pozycji najmniej znaczącej do najbardziej znaczącej */ for (n=0; n<p; n++) { /* poniżej inicjalizacja liczników */ for (i=0; i<k; i++) counts[i] = 0; 6

sortowanie na bazie rxsort() /* Wyliczenie wartości pozycji. */ pval = (int)pow((double)k, (double)n); /* Zliczanie wystąpień poszczególnych cyfr */ for (j = 0; j < size; j++) { index = (int)(data[j] / pval) % k; counts[index] = counts[index] + 1; } 7

sortowanie na bazie rxsort() /* Korekta liczników w celu uwzględnienia liczników je poprzedzających. */ for (i = 1; i < k; i++) counts[i] = counts[i] + counts[i - 1]; /* Użycie liczników do umieszczenia poszczególnych elementów we właściwych miejscach /* for (j = size - 1; j >= 0; j--) { index = (int)(data[j] / pval) % k; temp[counts[index] - 1] = data[j]; counts[index] = counts[index] - 1; } 8

sortowanie na bazie rxsort() /* Przygotowanie do zwrócenia posortowanych dotąd danych */ memcpy(data, temp, size * sizeof(int)); } /* Zwolnienie pamięci zaalokowanej na sortowanie */ free(counts); } free(temp); return 0; 9

sortowanie na bazie rxsort() opis argumentów int rxsort( int *data, int size, int p, int k) data - wskazuje na dane size - ile elementów do posortowania p - liczba cyfr w liczbach k baza 10

przykład sortowania na bazie wykorzystanie sortowania ze zliczaniem 302 611 901 102 253 901 302 253 611 302 102 302 901 102 611 529 529 253 529 611 102 529 253 901 n=0 n=1 n=2 n=3 ( baza = {0,1,2,4,5,6,7,8,9} ) sortowanie zbioru liczb jako liczb zapisanych w systemie dziesiętnym) 11

Kompresja danych Kompresja danych polega na zmniejszeniu liczby bitów potrzebnych do zapisania danych. Podstawy teoretyczne teoria informacji (dział matematyki). Kompresja i dekompresja danych. Dlaczego dane w ogóle można skompresować? Kompresja stratna, kompresja bezstratna....zajmujemy się teraz kompresją bezstratną... Każde dane można scharakteryzować jeśli chodzi o ich zawartość informacyjną używając pojęcia zapożyczonego z termodynamiki entropia. Definiujemy ją dla informacji na poziomie sygnału. 12

Kompresja danych Co to jest informacja? informacja na poziomie sygnału informacja na poziomie semantycznym (zdania...) rozumowanie logiczne Na którym poziomie odbywać się może kompresja? Claude Shannon Warren Weaver, 1948 rok The Bell System Technical Journal, vol. 27, pages 379-423, 623-656, 13 July & October, 1948, A mathematical theory of communication

Kompresja danych Przykład informacji na poziomie semantycznym (zdania...) linie proste a,b,c należą do tej samej płaszczyzny π 14

Kompresja danych Przykład rozumowania logicznego Czy liczbę sqrt(2) da się przedstawić jako iloraz dwóch liczb całkowitych? (nie da się wyliczyć ilości informacji (?), można przedstawić dowód, że się nie da) 15

Kompresja danych Fundamentalnym problemem komunikacji jest reprodukowanie możliwie wiernie (bezstratnie lub małostratnie) wiadomości. Wiadomość ta jest przesyłana z punktu do punktu (czasoprzestrzeni). Na poziomie sygnałów nie rozpatruje się znaczenia (sensowności) tych wiadomości. Istotne jest to, że przesłana wiadomość jest jedną wybraną ze zbioru możliwych wiadomości. System komunikacyjny musi być opracowany tak, by każdą z tych możliwych wiadomości potrafił przesłać; każdą gdyż przed przesłaniem informacji nie wiadomo która to z możliwych wiadomości będzie przesyłana. To z rozważań o komunikacji pojawiła się jednostka informacji w sensie sygnału jeden bit. 16

Kompresja danych System komunikacji składa się z: -źródła informacji -transmittera (zamienia wiadomość na sygnały odpowiednie dla kanału) -kanału (to medium transportujące kabel, fala radiowa, światłowód) -odbiornik (działa odwrotnie do transmittera) -odbiornik informacji (osoba, dysk optyczny, robot przemysłowy...) Oczywiście można informację przesyłać w sposób nadmiarowy, np. tą samą wiadomość przesłać dwoma listami czy dwukrotnie przeprowadzić rozmowy telefoniczne czy dwukrotnie przesłać datagram używając jako kanału Internetu; ile trzeba przesłać minimalnie by wiadomość była przesłana bezstratnie? 17

Kompresja danych Rozważmy: Niech system komunikacyjny może przyjąć jeden z K podstanów. Teraz a) przesyła N sygnałow ; b) przesyła 2N sygnałow. O ile więcej przesyła informacji w przypadku b) w porównaniu do przypadku a)? (...i jeszcze chcemy by informacja miała własność addytywności...) 18

Kompresja danych Gdyby liczyć to w ilości kombinacji możliwych wiadomości, to w przypadku a) tych możliwości jest K do potęgi N, a w przypadku b) jest ich K do potęgi 2N. Czy to byłaby właściwa miara ilości informacji przekazywanej? Jakie cechy winna mieć miara informacji (będziemy ją nazywać entropią)? Powinna liniowo zależeć od ilości sygnałów, oraz powinna rosnąć (tylko jak?) z ilością możliwych podstanów w jednym sygnale. Okazuje się, że istnieje tylko jedna możliwość zdefiniowania, by ten warunek spełnić: 19

Kompresja danych entropia E oto jej definicja E = const N log 2 K jeśli każdy z podstanów równie prawdopodobny, to p = p i = 1./K, E = const (-N) log 2 p jeśli p i są różne to E = const Σ i (-N i ) log 2 (p i ) (jeśli const=1, to jest to ilość informacji w bitach) 20

Kompresja danych Ilość informacji nie może zależeć od tego, co zdefiniujemy za sygnał, a co za możliwy podstan sygnału (przyjęta definicja entropii czyli ilości informacji to zapewnia! sprawdzimy to na przykładzie przedstawionym na następnej folii) 21

Kompresja danych Niech np. na każdym przerzutniku, symbolizowanym przez znak może pojawić się stan wysoki lub stan niski, z równym prawdopodobieństwem ½ ; przesłana wiadomość niech ma 4 sygnały zbudowane jak poniżej lub równoważnie 2 sygnały (patrz poniżej) (w obu powyższych przypadkach ilość informacji wynosi 8 bitów, czyli tyle samo!) 22

Kompresja danych inna równoważna definicja entropii; jeśli mamy źródło które produkuje sygnały, każdy sygnał ma K możliwych podstanów, prawdopodobieństwo danego podstanu i wynosi p(i), to entropia E (czyli ilość informacji) wynosi E = - const Σ i p(i) log 2 (p(i)) (w tym sumowaniu i przebiega od 1 do K; przyjmuje się const=1) 23

Kompresja danych np. entropia w przypadku gdy jest jeden sygnał o dwóch możliwościach o prawdopodobieństwach p oraz (1-p) E = - ( p log p + (1-p) log(1-p) ) Jeśli p dąży do zera lub do jeden, to ilość informacji dąży do zera (E dąży do zera), jeśli o wielkości p nic nie wiadomo, to p=1/2, wtedy E=1 (jeden bit informacji). 24

Kompresja danych np. ilość informacji powinna być taka sama dla poniższych dwóch przypadków rozkładów prawdopodobieństwa. 1/2 1/2 1/3 1/2 2/3 1/6 1/3 25

Kompresja danych oznaczajac przez E ilość informacji, dla poprzedniego slajdu powinno być E(1/2; 1/3; 1/6) = E(1/2; 1/2) + 1/2 * E(2/3; 1/3) (wzór na E jest trzy folie wcześniej) (więcej informacji pod adresem http://cm.belllabs.com/cm/ms/what/shannonday/shannon1948.pdf, np. na początku 6 rozdziału) 26

Kompresja danych przykładowa entropia drzewo Huffmana kodowanie Huffmana jako przykład algorytmu kompresji (przedstawiony przykład udowadnia,że kodowanie Huffmana wydajnie pakuje w sposób bezstratny dane) poniżej adres strony: jak zbudować drzewo Huffmana http://www.siggraph.org/education/materials/hypergraph/video/mpeg/ mpegfaq/huffman_tutorial.html 27

Kompresja danych kolejny przykład: niech zródło informacji produkuje sekwencję liter A,B,C,D z prawdopodobieństwami 0.5, 0.25, 0.125, 0.125. Można policzyć, że na każdy przesyłany sygnał (tutaj znak) ilość informacji wynosi 7/4 bitów. Tymczasem standartowo rozrzutnie używa się 8 bitów. Można zakodować( drzewo Huffmana ) A = 0 B = 10 C = 110 D = 111 W 1000 przesłanych znaków jest 500 A, 250 B, 125 C, 125 D. Źródło przeznaczyło na nie 1000 * 8 bitów. Liczona entropia daje 1000*7/4 = 1750 bitów. Po skompresowaniu zużywamy 500*1 + 250*2 + 125*3 + 125*3 = 1750 bitów. Czyli osiągnęliśmy nawet granice kompresji jako sygnału. 28

Kompresja danych kolejny przykład: niech zródło informacji produkuje sekwencję liter A,B,C,D z prawdopodobieństwami 0.5, 0.25, 0.125, 0.125. Można policzyć, że na każdy przesyłany sygnał (tutaj znak) ilość informacji wynosi 7/4 bitów. Tymczasem standartowo rozrzutnie używa się 8 bitów. Można zakodować( drzewo Huffmana ) A = 0 B = 10 C = 110 D = 111 (jako ćwiczenie proszę przeliczyć, że traktując ten skompresowany zbiór jako zbiór zer oraz jedynek, stosująć wzór na entropię pięć folii wstecz, otrzyma się również 1750 bitów!) 29

Kompresja danych Poziom semantyczny informacji Weźmy pod uwagę liczbe π Ile bitów informacji należy przesłać, aby przesłać ją bezstratnie? nieskończenie wiele (traktując informację na poziomie sygnałowym) A na poziomie semantycznym można przesłać,że jest to stosunek obwodu koła do jego średnicy, bezstratnie. W teorii informacji nie znaleziono sposobu wyliczania ilości informacji merytorycznej. Tym bardziej ilości informacji związanej z rozumowaniem logicznym. 30

Dygresja: rozumowanie logiczne Czy liczbę pierwiastek z 2 da się zapisać jako ułamek, gdzie licznik i mianownik to liczby naturalne? Udowadnia się, że nie można ile jest informacji uzyskanej dzięki znajomości dowodu tej własności? Nie znamy sposobu wyliczenia ilości tej informacji. 31

Dygresja czy tak by można kompresować? mamy np. pewien tekst do przesłania, w języku angielskim znajdujemy pewną liczbę 1.xxxxxxxxxx..., przesyłamy do odbiornika definicję tej liczby (teoretycznie taki sposób nie jest sprzeczny z semantycznym pojęciem informacji) 32

Kompresja danych algorytm RLE RLE Run Length Encoding Zalety: niskie zapotrzebowanie na moc obliczeniową, w wybranych sytuacjach algorytm najlepszy Idea: zamień sekwencję danych na liczbę powtórzeń pewnych znaków ABBBBBBBBBCDEFFFFF to chcemy skompresować A$9BCDE$5F użyty został znak kontrolny $ 33

Kompresja danych algorytm RLE Co zrobić jeśli w danych do skompresowania jest znak identyczny z wybranym znakiem kontrolnym? Można np. zapisac $ jako $%, to już pozwoli na jednoznaczne zidentyfikowanie takiej sytuacji. 34

Kompresja danych LZ77 pewną wadą kodowania Huffmana jest to, że potrzebne do kodowania drzewo może w przypadku ciągłej transmisji okazać się w pewnym momencie przestarzałe. Niestety zmieniać trzeba go w sposób rewolucyjny czyli trzeba zmienić całe drzewo. Istnieją algorytmy adaptacyjne, pomyślane jako nadążające za sytuacją. LZ77 (Lempel-Ziv-1977) korzysta z bufora z podglądem oraz z okna przesuwnego. Podstawową częścią algorytmu jest stałe wyszukiwanie w buforze najdłuższych zdań, które są już w oknie przesuwnym. Typowe długości okna i bufora odpowiednio kilka tysięcy bajtów i sto bajtów. 35

Kompresja danych LZ77 (Lempel-Ziv-1977) to metoda kompresji na poziomie merytorycznym informacji (poszukiwanie zdań) 36

Kompresja danych LZ77 okno 8b dane (bufor 4b) dane skompresowane 00000000 ABABCBABABCA 0000000A BABCBABABCA A 000000AB ABCBABABCA AB 000ABABC BABABCA AB(6,2,C) BABCBABA BCA AB(6,2,C)(4,3,A) CBABABCA (koniec danych) AB(6,2,C)(4,3,A)(2,2,A) (czyli okno, pełniące role słownika, nieustannie się modyfikuje) 37

Dekompresja danych LZ77 okno 8b dane skompresowane 00000000 AB(6,2,C)(4,3,A)(2,2,A) 000000AB (6,2,C)(4,3,A)(2,2,A) 000ABABC (4,3,A)(2,2,A) BABCBABA (2,2,A) CBABABCA (koniec danych skompresowanych) (czyli okno, pełniące role słownika, nieustannie się modyfikuje) 38

LZ77 zalety,wady - przy dobrej implementacji wydajniejsze od kompresji uzyskiwanej kodowaniem Huffmana - wolniejsze od kodowania Huffmana - w miarę szybkie odkodowywanie 39

kodowanie arytmetyczne -wykorzystanie ułamków bita -Literatura: http://www.zipworld.com.au/~isanta/uni/arithmetic.htm http://www.cs.cf.ac.uk/dave/multimedia/node213.html http://compressions.sourceforge.net/arithmetic.html 40