ZASTOSOWANIE METODY ZMNIEJSZONEJ CZĘSTOŚCI AKTUALIZACJI SŁOWNIKA W UNIWERSALNYM ALGORYTMIE KOMPRESJI LZW
|
|
- Milena Szydłowska
- 8 lat temu
- Przeglądów:
Transkrypt
1 STUDIA INFORMATICA 2010 Volume 31 Number 3(91) Roman STAROSOLSKI Politechnika Śląska, Instytut Informatyki ZASTOSOWANIE METODY ZMNIEJSZONEJ CZĘSTOŚCI AKTUALIZACJI SŁOWNIKA W UNIWERSALNYM ALGORYTMIE KOMPRESJI LZW Streszczenie. W niniejszej pracy przedstawiono badania nad zastosowaniem metody zmniejszonej częstości aktualizacji słownika w uniwersalnym algorytmie kompresji LZW. Wyniki badań wskazują, że w przeciętnym przypadku metoda ta pozwala na kilkudziesięcioprocentowe zwiększenie prędkości algorytmu LZW kosztem pogorszenia uzyskiwanych współczynników kompresji o kilka procent, a w przypadku niektórych plików zwiększeniu prędkości kompresji towarzyszy poprawa uzyskiwanych współczynników kompresji. Słowa kluczowe: uniwersalny algorytm kompresji, algorytm LZW, algorytm adaptacyjny, metoda zmniejszonej częstości aktualizacji słownika, drzewo trie, O(n) APPLICATION OF THE REDUCED DICTIONARY UPDATE FREQUENCY METHOD TO THE LZW UNIVERSAL DATA COMPRESSION ALGORITHM Summary. This paper presents research on application of the reduced dictionary update frequency method to the LZW universal data compression algorithm. The results show, that in the average case the above-mentioned method allows to increase compression speed by dozens of percents at the expense of worsening the ratio by a few percent, however, in a case of some files the speed increase is accompanied by the improvement in the compression ratio. Keywords: universal compression, LZW algorithm, adaptive algorithms, reduced dictionary update frequency method, trie structure, O(n)
2 6 R. Starosolski 1. Wprowadzenie W niniejszej pracy opisano badania nad zastosowaniem metody zmniejszonej częstości aktualizacji słownika w uniwersalnym algorytmie kompresji LZW. Metoda zmniejszonej częstości aktualizacji wcześniej badana była zarówno dla pewnego algorytmu kompresji statystycznej [1], jak i dla algorytmu LZW [2], jednak wspomniane badania dotyczyły jedynie bezstratnej kompresji obrazów. Dla danych obrazowych metoda pozwoliła na zwiększenie prędkości algorytmu kompresji opartego na kodowaniu LZW o kilkadziesiąt procent, kosztem nieznacznego, z praktycznego punktu widzenia, pogorszenia uzyskiwanych przez algorytm współczynników kompresji (tj. o kilka procent). Należy tutaj nadmienić, że w przypadku kompresji obrazów LZW był tylko jednym z kilku elementów bardziej złożonego algorytmu kompresji. Algorytmy uniwersalne (takim algorytmem jest LZW) przeznaczone są do kodowania dowolnych klas danych; choć pierwotnym obszarem ich zastosowania była kompresja tekstów, to stosowane są obecnie do danych wszelkiego typu, w tym nawet do danych multimedialnych. Algorytm LZW należy do klasy algorytmów słownikowych; ze względu na niewielką złożoność czasową algorytmy słownikowe stosowane są obecnie do kompresji danych przesyłanych sieciami komputerowymi, co pozwala na przesłanie większej ilości danych w jednostce czasu przez kanał transmisyjny o ograniczonej przepustowości, jak również do kompresji danych składowanych na nośnikach pamięci masowej. Celem opisywanych badań było sprawdzenie, czy metoda zmniejszonej częstości aktualizacji słownika zastosowana do algorytmu LZW sprawdzi się również w uniwersalnej kompresji danych. Układ dalszej części niniejszej pracy jest następujący: w punkcie 2 szczegółowo omówiono badany algorytm, tj.: podstawowy algorytm LZW, użytą strukturę danych słownika, metodę zmniejszonej częstości aktualizacji słownika, sposób implementacji podstawowych operacji realizowanych w algorytmie oraz złożoności obliczeniowe algorytmu. Punkt 3 zawiera opis przeprowadzonych badań, a punkt 4 krótko podsumowuje ich wyniki. 2. Algorytm kompresji 2.1. Algorytm LZW Algorytm LZW to zaproponowane w roku 1984 przez T.A. Welcha udoskonalenie zaprezentowanego w roku 1978 przez J. Ziva i A. Lempela algorytmu LZ78 [3]. Oba algorytmy podczas kompresji gromadzą informacje o kompresowanych danych w tzw. słowniku, stąd często określane są mianem słownikowych. Słownik to struktura zawierająca frazy (krótkie
3 Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym... 7 ciągi) znaków, które wystąpiły w już przetworzonej części kompresowanego ciągu. W algorytmie LZ78 pobiera się kolejne znaki kodowanego ciągu budując z nich pewną frazę. Po pobraniu kolejnego znaku i dodaniu go na końcu już zbudowanej frazy sprawdza się, czy słownik tę frazę zawiera. Jeżeli frazy nie ma w słowniku, to wyprowadzany jest indeks najdłuższej dopasowanej frazy i ostatnio pobrany znak. Na początku kompresji słownik jest pusty, a każdorazowo po zakodowaniu frazy i znaku wstawia się do słownika frazę, dla której operacja szukania zakończyła się niepowodzeniem i rozpoczyna się budowanie nowej frazy od frazy pustej. Modyfikacja zaproponowana przez Welcha polega na wstępnym wypełnieniu słownika jednoznakowymi frazami z wszystkimi znakami alfabetu. Dzięki tej modyfikacji wyprowadzane mogą być tylko indeksy fraz, a współczynniki kompresji uzyskiwane przez algorytm LZW są lepsze niż w przypadku algorytmu LZ78. Algorytm LZW można w uproszczeniu przedstawić za pomocą pseudokodu: Algorytm LZW zainicjalizuj słownik f := fraza pusta while (nie pobrano wszystkich znaków komunikatu) do pobierz znak s if (f s znajduje się w słowniku) then f := f s else wyprowadź indeks frazy f wstaw frazę f s do słownika f := s endif endwhile wyprowadź indeks frazy f Działanie algorytmu kompresji i dekompresji LZW zilustrowane zostanie na poniższym przykładzie. Przykład ten ilustruje również pewien szczególny przypadek powodujący, iż algorytm dekompresora nie jest trywialnym odtworzeniem operacji wykonywanych przez kompresor. Dekompresor po otrzymaniu kodu danej frazy, na wyjście wyprowadza odpowiednią frazę ze słownika, ale w stosunku do kompresora nowe frazy do słownika wstawiane są z opóźnieniem. Nowa fraza może być wstawiona do słownika dopiero po otrzymaniu kodu następnej frazy, gdyż składa się ona z frazy aktualnej i pierwszego znaku następnej frazy. Przykład. Algorytmem LZW kodujemy komunikat barbararabarbarbar. Wstępnie słownik wypełniamy frazami (w nawiasach podano indeksy fraz): a (0), b (1) i r (2). W pierwszej kolumnie tabeli 1 widnieje pozostała do zakodowania część komunikatu, poszczególne jej fragmenty rozdzielone znakami to odpowiednio: najdłuższy przedrostek znaleziony w słowniku, pierwszy znak, po pobraniu którego nie powiodła się operacja wyszukania w słowniku, oraz pozostała jeszcze niepobierana część komunikatu.
4 8 R. Starosolski Tabela 1 Kodowanie LZW koder dekoder znaki pozostałe fraza wstawiana kod kod wyprowadzana fraza wstawiana do zakodowania do słownika fraza do słownika b a rbararabarbarbar 1 ba (3) 1 b a r bararabarbarbar 0 ar (4) 0 a ba (3) r b ararabarbarbar 2 rb (5) 2 r ar (4) ba r arabarbarbar 3 bar (6) 3 ba rb (5) r a rabarbarbar 2 ra (7) 2 r bar (6) ar a barbarbar 4 ara (8) 4 ar ra (7) a b arbarbar 0 ab (9) 0 a ara (8) bar b arbar 6 barb (10) 6 bar ab (9) barb a r 10 barba (11) 10 barb barb (10) a r 4 4 ar barba (11) Wspomniany przypadek szczególny występuje tu w momencie (komórki podkreślone w tabeli 1), gdy dekoder otrzymuje indeks frazy 10, której jeszcze nie ma w słowniku. Taka sytuacja ma miejsce jedynie w przypadku, gdy dana fraza jest konkatenacją ostatnio zakodowanej frazy i pierwszego znaku ostatnio zakodowanej frazy. W przypadku gdy dekoder otrzymuje indeks frazy, która nie znajduje się w słowniku, należy do słownika wstawić frazę utworzoną przez konkatenację ostatnio wyprowadzonej frazy i pierwszego znaku tej frazy oraz wyprowadzić tak utworzoną frazę na wyjście Struktura słownika Zazwyczaj strukturę danych słownika konstruuje się z zastosowaniem funkcji mieszających znacznie przyspieszających proces wyszukiwania frazy. W tym przypadku należy wykonać jedną operację wyszukiwania w słowniku na każdy znak czytanego pliku. W opisywanym algorytmie do przechowywania fraz zastosowany został słownik w postaci uproszczonego drzewa trie. W literaturze, oprócz pochodzącego z języka angielskiego terminu drzewo trie [4] spotyka się również określenie drzewo wektorowe [5]. Struktura ta pozwala na zmodyfikowanie wyjściowego algorytmu LZW, przez co uzyskuje się zmniejszenie liczby wyszukiwań w słowniku z jednego dla każdego znaku kompresowanego ciągu do jednego na wyprowadzony indeks frazy. Średnio wyszukiwań będzie tyle razy mniej, ile wynosi średnia długość frazy. Frazy umieszczane w słowniku przez algorytm LZW mają jedną, istotną ze względu na strukturę danych słownika, cechę: jeżeli w słowniku jest zawarta dana fraza, to muszą się tam również znajdować wszystkie jej prefiksy. Cecha ta pozwala na uproszczenie struktury drzewa trie. Wystarczy stosować tylko jeden rodzaj węzła i nie trzeba uzupełniać alfabetu
5 Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym... 9 o znak koniec frazy. W konsekwencji każda z fraz przechowywanych w słowniku, niezależnie od swojej długości, wymaga takiej samej (stałej) liczby bajtów. A B AB BA ABA ABB BAB BAC ABAC ABBA BABA BACA Rys. 1. Uproszczone drzewo trie Fig. 1. Simplified trie structure W zastosowanym wariancie drzewa trie węzeł zawiera tablicę wskaźników do potomków o rozmiarze równym wielkości alfabetu (po jednej pozycji dla każdego znaku alfabetu). Fraza (klucz) znajduje się w drzewie, gdy, począwszy od korzenia, można w drzewie wyznaczyć ścieżkę taką, że n-ta gałąź tworząca ścieżkę wychodzi z pozycji tablicy wskaźników znajdującej się pod indeksem odpowiadającym n-temu znakowi klucza. Na przykład drzewo trie z rys. 1, skonstruowane dla alfabetu {A, B, C}, zawiera frazy:, A, AB, ABA, ABAC, ABB, ABBA, B, BA, BAB, BABA, BAC i BACA. Przez pojemność słownika rozumieć będziemy maksymalną liczbę fraz, które jednocześnie mogą znajdować się w słowniku. Pojemność słownika powinna być potęgą dwójki, gdyż indeksy fraz są kodowane z użyciem kodu binarnego stałej długości. Słowo kodowe dla frazy ma długość log 2 (q) bitów, gdzie q jest liczbą fraz aktualnie przechowywaną w słowniku. Jeżeli ograniczymy pojemność do 2 16, a węzły drzewa trie umieścimy w tablicy, to wskaźniki będzie można zastąpić 16-bitowymi indeksami (które będą jednocześnie indeksami fraz) i uniknąć wielokrotnych alokacji pamięci. Złożoność pamięciowa tak zdefiniowanej struktury słownika wynosi 2 S v, gdzie S jest rozmiarem alfabetu, którego znaki tworzą frazy przechowywane w słowniku, a v to pojemność słownika. Złożoność pamięciowa słownika dla alfabetu o 256 znakach wynosi zatem 512 v. Ze względu na zastosowanie opisanej w następnym punkcie metody adaptacji, rzeczywisty rozmiar struktury danych słownika jest nieznacznie większy (521 v). Rozmiar
6 10 R. Starosolski słownika wynosi więc od około 0.25 MB dla słownika o pojemności 512 fraz do około 32 MB dla słownika zdolnego pomieścić fraz. Słownik po inicjalizacji zawiera frazę pustą. Fraza ta umieszczona jest w węźle o indeksie 0 i jest korzeniem drzewa trie. Ponieważ żadna inna fraza nie jest jej prefiksem, to wartość 0 w tablicy potomków węzła można traktować nie jako krawędź prowadzącą do węzła 0, ale jako brak krawędzi. Słownik po inicjalizacji zawiera również 256 jednoznakowych fraz (o indeksach 1 256). Dysponując takim słownikiem, można zmodyfikować wyszukiwanie w słowniku. Przyjmijmy następujące oznaczenia: niech f oznacza frazę, s znak, s i znak o wartości i, a f s konkatenację frazy f i znaku s. Zamiast sprawdzania, czy f s znajduje się w słowniku, sprawdzamy, czy fraza f, która, jak wiemy, znajduje się w słowniku, jest przedrostkiem frazy f s. Fraza f znajduje się już w słowniku, ponieważ albo została znaleziona podczas poprzedniego wyszukiwania, albo jeżeli nie była znaleziona w poprzednim wyszukiwaniu, to ma długość jednego znaku i z definicji jest obecna w słowniku dla algorytmu LZW od momentu inicjalizacji słownika. Sprawdzenie, czy fraza f s i jest zawarta w słowniku, realizujemy badając, czy na pozycji i tablicy wskaźników w węźle odpowiadającym frazie f jest niepuste wskazanie. W przypadku znalezienia niepustego wskazania zapamiętujemy je, jako jednoznacznie wyznaczające frazę f s i. Dysponując takim słownikiem, dla pojedynczego znaku pliku wejściowego wykonujemy pojedyncze sprawdzenie elementu tablicy w węźle drzewa, podczas gdy dla zwykłego słownika dla pojedynczego znaku pliku wejściowego musimy wykonać wyszukiwanie całej dotychczas zbudowanej frazy Metoda zmniejszonej częstości aktualizacji słownika Słownik o określonej pojemności, w miarę postępowania kompresji, wypełnia się nowymi frazami aż zostanie całkowicie wypełniony. Mówimy, że do momentu wypełnienia słownika algorytm LZW jest adaptacyjny. W momencie gdy słownik jest pełny, można zaprzestać wstawiania nowych fraz, tj. zamrozić słownik. W tym przypadku dla reszty pliku algorytm będzie stały rozwiązanie takie będzie dobre tak długo, jak długo charakterystyka kompresowanych danych będzie pozostawała niezmienna. W praktyce, nawet dla pozornie jednorodnych zbiorów danych, takich jak na przykład tekst dużej powieści, algorytmy stałe uzyskują współczynniki kompresji istotnie gorsze od algorytmów adaptacyjnych. Można także powtórnie zainicjalizować słownik i budować go od nowa dla nowych danych. W algorytmie LZC [6], stosowanym przez kompresor compress systemu Unix, łączy się oba rozwiązania. Po wypełnieniu słownika zaprzestaje się wstawiania nowych fraz i monitoruje się chwilowy współczynnik kompresji. W razie pogorszenia się jego wartości wykonuje się powtórną ini-
7 Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym cjalizację słownika (operacja ta powoduje chwilowe znaczne pogorszenie współczynnika kompresji). W przyjętym rozwiązaniu struktura danych słownika jest bardzo duża (słownik wymaga ponad 500 bajtów na każdą frazę). Inicjalizacja tak dużej struktury jest czasochłonna. Wykonywana kilkakrotnie podczas kompresji spowolniłaby średnią prędkość przetwarzania i przyczyniła się do gwałtownych spadków prędkości chwilowej. Aby po wypełnieniu słownika kompresor nadal mógł się adaptować do charakterystyki przetwarzanych danych, zastosowano następujące rozwiązanie: po wstawieniu frazy do słownika, jeżeli słownik jest pełny, to jest z niego usuwana jedna fraza, która nie jest prefiksem żadnej innej. Od momentu pierwszego wypełnienia słownika kompresor może wstawiać nową frazę do słownika za każdym razem, gdy wyprowadza znalezioną frazę, lub mniej często. Po wstawieniu frazy do słownika losowana jest liczba zaniechań kolejnych operacji aktualizacji słownika: Zmodyfikowane kodowanie LZW po wypełnieniu słownika zainicjalizuj słownik f := fraza pusta czekaj := 0 while not eof(plik wejściowy) do pobierz znak s if f s znajduje się w słowniku then f := f s else wyprowadź kod frazy f if czekaj = 0 then wstaw frazę f s do słownika usuń ze słownika jedną frazę czekaj := random(zakres) else dec(czekaj) endif f := s endif endwhile Metoda ta pozwala, przez dobranie zakresu losowanych wartości, na zwiększenie prędkości kompresji kosztem wolniejszej adaptacji do charakterystyki kompresowanych danych. W przypadku algorytmu kompresji statystycznej [1] wykazano, że ww. metoda pozwala również na zrównoleglenie algorytmu z natury sekwencyjnego [7]. Poczynając od momentu wypełnienia słownika przez częstość aktualizacji słownika rozumieć będziemy stosunek liczby fraz, po zakodowaniu których następuje aktualizacja słownika do liczby zakodowanych fraz. Pełna częstość aktualizacji słownika (100%) oznacza, że wstawianie frazy do słownika następuje każdorazowo po zakodowaniu frazy. Jeżeli losowana liczba zaniechań kolejnych operacji aktualizacji słownika znajduje się w przedziale [0, j] i ma rozkład równomierny, to wyrażona w procentach częstość aktualizacji słownika φ wynosi
8 12 R. Starosolski 2 φ = 100% j 2 Zastosowana metoda adaptacji kompresora wymaga szybkiego wyszukiwania i usuwania fraz niebędących prefiksami innych fraz, czyli będących liśćmi drzewa trie. Ze względu na wymagania metody adaptacji strukturę danych słownika uzupełniono o tablicę liści, a w węzłach drzewa trie umieszczono dodatkowe pola zawierające: licznik potomków, wskaźnik na rodzica, wskaźnik do tablicy liści i ostatni znak frazy przechowywanej w węźle. Frazy umieszczane w słowniku podczas inicjalizacji (fraza pusta i 256 jednoznakowych fraz) muszą być traktowane jako frazy nieusuwalne, nawet jeśli są liśćmi drzewa trie. Fraza pusta jest prefiksem wszystkich fraz w słowniku. Fraza ta nie zostanie usunięta, jeżeli w słowniku znajdują się inne frazy, a ponieważ usuwanie fraz następuje dopiero po wypełnieniu słownika, to nie ma niebezpieczeństwa usunięcia frazy pustej. Inaczej rzecz się ma z jednoznakowymi frazami znajdującymi się w słowniku LZW po inicjalizacji. Ponieważ po wypełnieniu słownika jednoznakowe frazy mogą nadal być liśćmi drzewa trie, należy uniemożliwić usunięcie tych fraz. Można by to osiągnąć przez modyfikację algorytmu polegającą na przykład na sprawdzaniu, czy fraza, którą chcemy umieścić w tablicy liści, nie jest frazą jednoznakową. Struktura danych słownika pozwala na zabezpieczenie fraz przed usunięciem bez modyfikacji algorytmu. Występujący w węźle licznik potomków służy do sprawdzania, czy fraza jest liściem drzewa trie. Jeżeli liczniki potomków w węzłach odpowiadających jednoznakowym frazom otrzymają podczas inicjalizacji wartość 1 (zamiast 0), to jednoznakowe frazy nigdy nie zostaną umieszczone w tablicy liści. Podczas inicjalizacji słownika niewykorzystane pozycje w tablicy węzłów są wypełniane w następujący sposób: elementy tablicy wskaźników na potomków węzła i licznik potomków otrzymują wartość 0, wartości w pozostałych polach węzła są nieistotne, nie musi być im nadana żadna konkretna wartość Operacje na strukturze słownika Na strukturę danych słownika składają się zatem tablica węzłów, tablica liści i kilka zmiennych sterujących. Składniki te wraz z krótkim komentarzem zostały przedstawione w poniższym pseudokodzie: Struktura danych słownika poj_słow pojemność słownika index typ: 16-bitowa liczba całkowita bez znaku, do przechowywania indeksów fraz, oraz licznika potomków węzła byte typ: 8-bitowa liczba całkowita bez znaku, do przechowywania znaków słow : array[0..poj_słow-1] of tablica węzłów drzewa trie record kraw : array[0..255] of index; tablica krawędzi wychodzących l_kraw : index; licznik potomków
9 Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym liść : index; rodzic : index; znak : byte; end; pozycja w tablicy liści nieistotna, gdy l_kraw 0 wskaźnik na rodzica ostatni znak frazy w tym węźle słow_pełny : boolean; znacznik przyjmujący podczas inicjalizacji słownika wartość false przyjmuje wartość true po wypełnieniu słownika wolny_wiersz : index; dla słow_pełny=false pierwsza wolna pozycja w tablicy węzłów dla słow_pełny=true jedyna wolna pozycja w tablicy węzłów liście : array[0..poj_słow-1] of index; tablica liści liść_ostatni : index; indeks ostatniego elementu w tablicy liści (liczba liści 1) liść_usuń : index; indeks (w tablicy liści) węzła do usunięcia Wyszukiwanie frazy f s realizowane jest teraz przez odwołanie pośrednie do tablicy. Przypisanie f := s realizowane jest jako f := s + 1, gdyż jednoznakowe frazy zawierające znaki o wartościach umieszczone są w tablicy przechowującej słownik pod indeksami odpowiednio 1 256: Kodowanie po wypełnieniu słownika zainicjalizuj słownik f := 0 f := fraza pusta czekaj := 0 while not eof(plik wejściowy) do pobierz znak s if słow[f].kraw[s] <> 0 then jeżeli f s znajduje się w słowniku f := słow[f].kraw[s] f := f s else wyprowadź kod frazy f if czekaj = 0 then wstaw_frazę(f, s) usuń_frazę() czekaj := random(zakres) else dec(czekaj) endif f := s + 1 f := s endif endwhile Procedury wstaw_frazę i usuń_frazę ilustrują podstawowe operacje wykonywane w algorytmie LZW na słowniku. Procedura wstaw_frazę (pseudokod poniżej) wstawia frazę f s do słownika. Nowa fraza wstawiana jest do tablicy przechowującej słownik na pozycję o indeksie wolny_wiersz. Wartość zmiennej wolny_wiersz nie jest w procedurze wstaw_frazę aktualizowana. Wyznaczenie nowej wartości dla tej zmiennej jest istotne tylko dla niewypełnionego słownika. W węźle o indeksie wolny_wiersz procedura wstaw_fraze() nadaje wartości następującym polom: rodzic, znak i liść. Pozostałe pola powinny zawierać wartość 0 nadaną podczas inicjalizacji bądź pozostawioną po usunięciu węzła.
10 14 R. Starosolski Procedura wstawiania frazy f s do słownika procedure wstaw_frazę(f : index, s : byte) begin inc(słow[f].l_kraw) słow[f].kraw[s] := wolny_wiersz słow[wolny_wiersz].rodzic := f słow[wolny_wiersz].znak := s wstaw nową krawędź do węzła f wstaw liść if słow[f].l_kraw = 1 then jeżeli rodzic był liściem liście[słow[f].liść] := wolny_wiersz to nowy liść zastępuje słow[wolny_wiersz].liść = słow[f].liść rodzica w tablicy liści else jeżeli rodzic nie był liściem inc(liść_ostatni) to wstaw liść do tablicy liści liście[liść_ostatni]=wolny_wiersz słow[wolny_wiersz].liść=liść_ostatni endif end Usunięcie pojedynczej frazy z pełnego słownika realizowane jest przez procedurę usuń_frazę (pseudokod poniżej). Tablica liści przeglądana jest z użyciem zmiennej liść_usuń. Jeżeli usunięty zostanie ostatni liść w tablicy (o indeksie liść_ostatni), to do następnego wywołania procedury usuń_frazę() wartość zmiennej liść_usuń będzie większa o 1 od indeksu ostatniego liścia liść_ostatni. Nie stanowi to problemu, gdyż w takiej sytuacji pierwszą czynnością wykonywaną po ponownym wywołaniu procedury będzie dekrementacja zmiennej liść_usuń. Po zakończeniu działania procedury usuń_frazę() zmienna wolny_wiersz zawiera indeks jedynego wolnego miejsca w tablicy przechowującej słownik. Po wykonaniu tej procedury słownik już nie jest pełny. W momencie pierwszego wypełnienia słownika znacznikowi słow_pelny nadawana jest wartość true. Ponieważ od tego momentu procedura usuń_frazę() jest w algorytmie LZW wywoływana zawsze bezpośrednio po procedurze wstaw_frazę(), to nie ma konieczności dodatkowego nadawania wartości zmiennym stanu struktury danych słownika. W momencie wywoływania procedury wstaw_frazę() wartość true znacznika słow_pelny oznacza, że w słowniku jest miejsce na jedną i tylko jedną frazę. Po usunięciu węzła nie ma potrzeby wyzerowania elementów tablicy wskaźników na potomków węzła ani licznika potomków. Pola te zawierają wartość 0, gdyż usuwany węzeł był liściem. Procedura usuwania pojedynczej frazy z wypełnionego słownika procedure usuń_frazę() var rodzic : indeks; rodzic usuwanego liścia begin if liść_usuń > 0 then wyznacz liść do usunięcia dec(liść_usuń) else liść_usuń := liść_ostatni endif
11 Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym wolny_wiersz := liście[liść_usuń] indeks zwalnianej pozycji w słowniku rodzic := słow[wolny_wiersz].rodzic znajdź rodzica usuwanego liścia słow[rodzic].kraw[słow[wolny_wiersz].znak] := 0 usuwamy krawędź dec(słow[rodzic].l_kraw) z węzła rodzica if(słow[rodzic].l_kraw) <> 0 then jeżeli rodzic nie jest liściem, to usuwamy liść wsta- wiając w jego miejsce ostatni liść z tablicy liści liście[liść_usuń] := liście[liść_ostatni] słow[liście[liść_ostatni]].liść := liść_usuń dec(liść_ostatni) else rodzic jest liściem, zastępuje byłego potomka w tablicy liści liście[liść_usuń] := rodzic słow[rodzic].liść := liść_usuń endif end 2.5. Złożoności obliczeniowe algorytmu Na złożoność pamięciową algorytmu ma wpływ pojemność słownika, nie zależy ona natomiast od rozmiaru kompresowanego pliku. W zrealizowanej implementacji, dla 8-bitowego alfabetu i słowników o pojemności do 2 16 fraz, każda fraza w słowniku wymaga 521 bajtów, zatem złożoność pamięciową M kompresora można opisać wzorem M = 521 v bajtów gdzie v oznacza pojemność słownika. Algorytm charakteryzuje się liniową złożonością czasową. W trakcie kompresji przechowuje się dotychczas zbudowaną frazę f. Kolejny znak s ciągu wymaga pojedynczego sprawdzenia, czy w słowniku jest fraza f s. Jeżeli fraza f s znajduje się w słowniku, to znak s dołączamy na koniec frazy f. Jeżeli frazy f s nie ma, to wyprowadzany jest indeks frazy f i rozpoczyna się budowanie nowej frazy f od jednoznakowej frazy zawierającej tylko znak s. W algorytmie LZW po wyprowadzeniu indeksu frazy wstawia się frazę f s do słownika. Jeżeli po wstawieniu nowej frazy słownik jest pełny, to usuwana jest z niego jedna fraza niebędąca prefiksem żadnej innej (o długości przynajmniej 2 znaków). Po wypełnieniu słownika kompresor może wstawiać nową frazę do słownika za każdym razem, gdy wyprowadza znalezioną frazę lub z mniejszą częstością. Po wstawieniu frazy do słownika losowana jest liczba zaniechań kolejnych operacji aktualizacji słownika. Złożoność czasową T kompresora słownikowego można opisać wzorem T(n) = n (c F + c K / l f + φ c U / l f ) = O(n) gdzie c F to przypadający na pojedynczy znak ciągu, koszt wyszukania w słowniku frazy oraz modyfikacji frazy, c K to koszt zakodowania frazy, l f to średnia długość wyprowadzanej frazy, φ to częstość aktualizacji słownika, a c U to koszt pojedynczej aktualizacji słownika. W przypadku struktury danych słownika zbudowanej na podstawie uproszczonego drzewa trie umieszczonego w tablicy wyszukanie w słowniku frazy f s, gdy znany jest indeks
12 16 R. Starosolski frazy f realizowane jest za pomocą dwóch odwołań do tablicy. Modyfikacja frazy, tj. wydłużenie jej o s, jeżeli znaleziono f s, bądź inicjalizacja w przeciwnym razie, to pojedyncza operacja przypisania. Zakodowanie frazy w zrealizowanej implementacji wymaga kilku operacji przypisania. Kodowanie wykonujemy dla każdej wyprowadzonej frazy. Oznaczony przez c U koszt pojedynczej aktualizacji słownika (wstawienia jednej frazy i skasowania jednej frazy) wymaga kilkakrotnie więcej odwołań do tablicy i przypisań niż c F. W zależności od wartości parametru φ aktualizację słownika wykonujemy dla każdej wyprowadzonej frazy lub rzadziej. Należy zwrócić uwagę, że podczas dekompresji nie dokonuje się wyszukiwania w słowniku, co powoduje, iż algorytm LZW jest asymetryczny. Dekompresja dla algorytmu LZW ma mniejszą złożoność czasową od kompresji. Znacznie mniejsza jest również złożoność pamięciowa. Ponieważ słownik nie musi umożliwiać szybkiego wyszukiwania fraz, nie potrzebujemy drzewa trie. Złożoność pamięciowa słownika dla dekompresora jest rzędu O(v (c + log 2 ( S ) / 8 )) gdzie S jest rozmiarem alfabetu, a v to pojemność słownika. 3. Badania 3.1. Implementacja algorytmu Zrealizowana w języku C implementacja algorytmu zbudowana została z wykorzystaniem wspomnianej we wprowadzeniu implementacji algorytmu LZW użytej w algorytmie kompresji obrazów [2]. Implementacja umożliwia kompresję ze słownikiem o pojemności do fraz. Po wstawieniu frazy do słownika, jeżeli słownik jest pełny, to usuwana jest z niego jedna fraza niebędąca prefiksem żadnej innej oraz losowana jest liczba zaniechań kolejnych operacji aktualizacji słownika. W zrealizowanej implementacji aktualizacja słownika mogła następować po wyprowadzeniu 100%, 66.6%, 40.0%, 22.2%, 11.8%, 6.06%, 3.08%, 1.55%, lub 0.778% fraz Procedura badawcza Badania przeprowadzono na komputerze wyposażonym w procesor AMD Athlon (2.0 GHz) i system operacyjny Windows XP. Implementację omawianego algorytmu skompilowano kompilatorem języków C/C++ środowiska MS Visual Studio Otrzymano aplikację jednowątkową. Pomiary wykonywano następująco: przeprowadzano jednokrotną kompresję, dla której czasu nie mierzono, a następnie kompresowano ten sam plik wielokrot-
13 Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym nie (nie mniej niż 10 razy i nie krócej niż przez 1 sekundę), mierzono łączny czas tych przebiegów i dzielono go przez liczbę przebiegów. Czas kompresji mierzony był jako suma czasów zwracanych po zakończeniu procesu przez system operacyjny: czasu wykonywania kodu procesu kompresji i czasu wykonywania kodu procedur jądra systemu wywołanych przez proces (kernel time + user time). Prędkość kompresji wyrażamy w megabajtach na sekundę [MB/s], gdzie 1 MB = 2 20 bajtów. Współczynnik kompresji wyrażamy w bitach na znak [bpc]: 8 e / n, gdzie e oznacza rozmiar skompresowanego pliku, n rozmiar nieskompresowanego pliku. Należy zwrócić uwagę, że współczynnik kompresji wyrażony w bitach na znak jest tym lepszy, im jego wartość mniejsza Wyniki badań Do eksperymentów użyto zestawu 12 dużych i różnorodnych plików testowych Silesia Corpus. Zestaw opracowany został przez dr. Sebastiana Deorowicza i dostępny jest pod adresem gdzie znajduje się również dokładny opis poszczególnych plików zawartych w zestawie. W badaniach brano pod uwagę przede wszystkim uśrednione wyniki dla wszystkich plików z zestawu, dla wybranych konfiguracji kompresora zaprezentowane zostaną również wyniki dla poszczególnych plików. Pomiary współczynnika i prędkości (tabele 2 i 3 oraz rys. 2) kompresji przeprowadzono dla wszystkich dostępnych częstości aktualizacji słownika i ze wszystkimi dostępnymi w zrealizowanej implementacji pojemnościami słownika, będącymi potęgami dwójki: 512, 1024, 2048, 4096, 8192, i fraz. Zastosowanie metody zmniejszonej częstości aktualizacji słownika pozwoliło na znaczne zwiększenie prędkości kompresji. Dla danej pojemności słownika, w porównaniu do prędkości uzyskanej przy pełnej częstości aktualizacji, możliwe jest zwiększenie prędkości kompresji o od ponad 100% do ponad 200% przez zastosowanie minimalnej dostępnej częstości aktualizacji słownika (0.778%). Przyspieszenie odbywa się kosztem pogorszenia średniego współczynnika kompresji o od 8.7% do 20.4%. Z praktycznego punktu widzenia pogorszenie współczynnika o kilkanaście procent wydaje się zbyt duże, by mogło być uznane za nieistotne. Można zauważyć, że dla dużych częstości aktualizacji poprawa prędkości jest proporcjonalna do wzrostu średniego współczynnika kompresji; zmniejszanie częstości poniżej pewnego progu skutkuje natomiast w coraz mniejszej poprawie prędkości i coraz większym wzroście współczynnika, zatem lepszym wyborem będzie częstość aktualizacji większa od minimalnej. Jeżeli wybierzemy częstości aktualizacji, dla których pogorszenie współczynnika nie przekroczy 5% w porównaniu do wyników pełnej częstości aktualizacji, to uzyskamy zwiększenie prędkości o od 72% do 98%. Wydaje się, że w wielu praktycznych zastosowaniach
14 18 R. Starosolski kompresji, np. do transmisji danych przesyłanych siecią komputerową, taki koszt uzyskania prawie dwukrotnego zwiększenie prędkości kompresji (tj. pogorszenie współczynnika o niecałe 5%) jest nieznaczny lub nawet może być uznany za nieistotny. Tabela 2 Średni współczynnik kompresji [bpc] częstość pojemność słownika aktualizacji % % % % % % % % % Tabela 3 Średnia prędkość kompresji [MB/s] częstość pojemność słownika aktualizacji % % % % % % % % % Porównując za sobą wyniki dla różnych pojemności słownika, można zauważyć, że pojemności słownika 512 i 1024 fraz pozwalają uzyskać podobne prędkości i gorsze współczynniki kompresji niż w przypadku słownika 2048 fraz. Prędkości kompresji dla słowników o pojemnościach ponad 4096 fraz są znacznie mniejsze od prędkości uzyskanej dla słownika 4096 fraz (prawdopodobnie przyczyną różnic jest architektura komputera, na którym wykonywano badania, np. rozmiar i sposób wykorzystania przez algorytm pamięci cache procesora). W przypadku dużych pojemności słownika (zwłaszcza dla pojemności fraz) zastosowanie zmniejszonej częstości aktualizacji powoduje znacznie większe pogorszenie współczynnika kompresji niż w przypadku mniejszych pojemności słownika prawdopodobnie duży słownik aktualizowany z niewielką częstością nie jest w stanie wystarczająco szybko zaadaptować się do zmieniającej się charakterystyki kompresowanych danych. W efekcie, zastosowanie mniejszego słownika, np fraz i częstości aktualizacji 40%, daje lepszy
15 współczynnik [bpc] Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym współczynnik i lepszą prędkość niż zastosowanie ośmiokrotnie większego słownika aktualizowanego z częstością 0.778%. Pojemność słownika prędkość [MB/s] Rys. 2. Wyniki kompresji dla różnych pojemności i częstości aktualizacji słownika Fig. 2. Compression speed and ratio for various dictionary sizes Tabela 4 Współczynnik kompresji dla słownika 4096 fraz [bpc] plik rozmiar częstość aktualizacji [MB] 100% 40.0% 11.8% 3.08% 0.778% dickens mozilla mr nci ooffice osdb reymont samba sao webster xml x-ray W tabelach 4 i 5 przedstawiono wyniki uzyskane dla poszczególnych plików z zestawu danych testowych przez kompresor ze słownikiem 4096 fraz i kilkoma częstościami aktualizacji. Jak widać, wyniki kompresji oraz efekty zastosowania metody zmniejszonej częstości
16 20 R. Starosolski aktualizacji słownika zależą od rodzaju danych, które kompresujemy. Występują znaczne różnice w prędkości kompresji różnych plików, różnice te nie wynikają jedynie z rozmiaru plików, jednak w każdym przypadku, stosując metodę zmniejszonej częstości aktualizacji, można uzyskać znaczne zwiększenie prędkości kompresji. Dla kilku plików (mozilla, oofice, samba, xml) zastosowanie metody zmniejszonej częstości aktualizacji słownika pogarsza współczynnik kompresji znacznie bardziej, niż w przypadku średniego współczynnika dla całego zestawu. W przypadku paru innych (osdb, x-ray) metoda zmniejszonej częstości aktualizacji poprawia współczynnik kompresji (jednocześnie znacznie poprawiając prędkość kompresji). Tabela 5 Prędkość kompresji dla słownika 4096 fraz [MB/s] plik rozmiar częstość aktualizacji [MB] 100% 40.0% 11.8% 3.08% 0.778% dickens mozilla mr nci ooffice osdb reymont samba sao webster xml x-ray Podsumowanie W niniejszej pracy opisano badania nad zastosowaniem metody zmniejszonej częstości aktualizacji słownika w uniwersalnym algorytmie kompresji LZW. Struktura słownika algorytmu zbudowana została na podstawie uproszczonego drzewa trie. Wyniki badań przeprowadzonych na obszernym zestawie danych testowych wskazują, że ww. metoda pozwala na kilkudziesięcioprocentowe zwiększenie prędkości algorytmu LZW kosztem pogorszenia o kilka procent uzyskiwanych przez algorytm współczynników kompresji. Efekty zastosowania metody są różne dla różnych plików; w przypadku niektórych plików uzyskano znaczne zwiększenie prędkości kompresji, któremu towarzyszyła jednoczesna poprawa uzyskiwanych współczynników kompresji. Podziękowanie. Praca niniejsza powstała w wyniku projektu badawczego nr BK-219- /RAu2/2009 zrealizowanego w Instytucie Informatyki Politechniki Śląskiej.
17 Zastosowanie metody zmniejszonej częstości aktualizacji słownika w uniwersalnym BIBLIOGRAFIA 1. Starosolski R.: Simple Fast and Adaptive Lossless Image Compression Algorithm. Software Practice and Experience, 2007, Vol. 37(1), s , DOI /spe Starosolski R.: Fast and adaptive lossless grayscale image compression using the LZW algorithm. Archiwum Informatyki Teoretycznej i Stosowanej, 1999, Vol. 11, Nr 2, s Ziv J., Lempel A.: Compression of individual sequences via variable rate coding. IEEE Transactions on Information Theory, Sept. 1978, Vol. 24(5), s Drozdek A., Simon D. L.: Struktury danych w języku C. WNT, Warszawa Reingold E. M., Nievergelt J., Deo N.: Algorytmy kombinatoryczne. PWN, Warszawa Thomas S., Orost J.: Compress (version 4.0) program and documentation Starosolski R.: Parallelization of an adaptive compression algorithm using the reduced model update frequency method. Theoretical and Applied Informatics, 2007, Vol. 19(2), s Recenzent: Dr inż. Bożena Wieczorek Wpłynęło do Redakcji 26 listopada 2009 r. Abstract This paper presents research on application of the reduced dictionary update frequency method to the LZW universal data compression algorithm. Previously, the effects of applying this method were analyzed for dictionary and statistical natural and medical lossless image compression algorithms. For image data, the method allowed to significantly increase the compression speed without worsening of the compression ratio significantly. In this paper, we describe in detail the key operations on the dictionary structure and report complexities of our variant of the LZW algorithm. The dictionary structure of the LZW algorithm was implemented using the modified trie, which is feasible for the reduced dictionary update frequency method, since it permits to quickly remove certain individual phrases from the dictionary. Practical experiments were performed using diverse set of files from the Silesia Corpus. The results obtained for various types of data show that in the average case the reduced dictionary update frequency method allows increasing of the compression speed by dozens of percents
18 22 R. Starosolski at the expense of worsening the ratio by a few percents, however, in a case of some files the speed increase is accompanied by the improvement in the compression ratio. Adres Roman STAROSOLSKI: Politechnika Śląska, Instytut Informatyki, ul. Akademicka 16, Gliwice, Polska, roman.starosolski@polsl.pl.
AKD Metody słownikowe
AKD Metody słownikowe Algorytmy kompresji danych Sebastian Deorowicz 2009 03 19 Sebastian Deorowicz () AKD Metody słownikowe 2009 03 19 1 / 38 Plan wykładu 1 Istota metod słownikowych 2 Algorytm Ziva Lempela
Temat: Algorytm kompresji plików metodą Huffmana
Temat: Algorytm kompresji plików metodą Huffmana. Wymagania dotyczące kompresji danych Przez M oznaczmy zbiór wszystkich możliwych symboli występujących w pliku (alfabet pliku). Przykład M = 2, gdy plik
ALGORYTMY BEZSTRATNEJ KOMPRESJI DANYCH
STUDIA INFORMATICA 2003 Volume 24 Number 1 (52) Roman STAROSOLSKI Politechnika Śląska, Instytut Informatyki ALGORYTMY BEZSTRATNEJ KOMPRESJI DANYCH Streszczenie. W artykule, po omówieniu podstawowych pojęć
Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski
Algorytmy i struktury danych Wykład 5: Drzewa Dr inż. Paweł Kasprowski pawel@kasprowski.pl Drzewa Struktury przechowywania danych podobne do list ale z innymi zasadami wskazywania następników Szczególny
Przetwarzanie i transmisja danych multimedialnych. Wykład 5 Kodowanie słownikowe. Przemysław Sękalski.
Przetwarzanie i transmisja danych multimedialnych Wykład 5 Kodowanie słownikowe Przemysław Sękalski sekalski@dmcs.pl Politechnika Łódzka Katedra Mikroelektroniki i Technik Informatycznych DMCS Przemysław
Przykładowe B+ drzewo
Przykładowe B+ drzewo 3 8 1 3 7 8 12 Jak obliczyć rząd indeksu p Dane: rozmiar klucza V, rozmiar wskaźnika do bloku P, rozmiar bloku B, liczba rekordów w indeksowanym pliku danych r i liczba bloków pliku
mgr inż. Grzegorz Kraszewski SYSTEMY MULTIMEDIALNE wykład 4, strona 1. GOLOMBA I RICE'A
mgr inż. Grzegorz Kraszewski SYSTEMY MULTIMEDIALNE wykład 4, strona 1. KOMPRESJA ALGORYTMEM ARYTMETYCZNYM, GOLOMBA I RICE'A Idea algorytmu arytmetycznego Przykład kodowania arytmetycznego Renormalizacja
Sortowanie bąbelkowe
1/98 Sortowanie bąbelkowe (Bubble sort) prosty i nieefektywny algorytm sortowania wielokrotnie przeglądamy listę elementów, porównując dwa sąsiadujące i zamieniając je miejscami, jeśli znajdują się w złym
Programowanie dynamiczne
Programowanie dynamiczne Patryk Żywica 5 maja 2008 1 Spis treści 1 Problem wydawania reszty 3 1.1 Sformułowanie problemu...................... 3 1.2 Algorytm.............................. 3 1.2.1 Prosty
ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.
POLITECHNIKA WARSZAWSKA Instytut Automatyki i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 204/205 Język programowania: Środowisko programistyczne: C/C++ Qt Wykład 2 : Drzewa BST c.d., równoważenie
Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie)
Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie) Wprowadzenie Haszowanie jest to pewna technika rozwiązywania ogólnego problemu słownika. Przez problem słownika rozumiemy tutaj takie
Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych
Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2014/15 Znajdowanie maksimum w zbiorze
0-0000, 1-0001, 2-0010, 3-0011 itd... 9-1001.
KODOWANIE Jednym z problemów, z którymi spotykamy się w informatyce, jest problem właściwego wykorzystania pamięci. Konstruując algorytm staramy się zwykle nie tylko o zminimalizowanie kosztów czasowych
Kompresja danych Streszczenie Studia Dzienne Wykład 10,
1 Kwantyzacja wektorowa Kompresja danych Streszczenie Studia Dzienne Wykład 10, 28.04.2006 Kwantyzacja wektorowa: dane dzielone na bloki (wektory), każdy blok kwantyzowany jako jeden element danych. Ogólny
Ćwiczenie nr 4: Kodowanie arytmetyczne, range coder
Algorytmy Kompresji Danych Laboratorium Ćwiczenie nr 4: Kodowanie arytmetyczne, range coder 1. Zapoznać się z opisem implementacji kodera entropijnego range coder i modelem danych opracowanym dla tego
< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >
Typy indeksów Indeks jest zakładany na atrybucie relacji atrybucie indeksowym (ang. indexing field). Indeks zawiera wartości atrybutu indeksowego wraz ze wskaźnikami do wszystkich bloków dyskowych zawierających
Kodowanie Huffmana. Platforma programistyczna.net; materiały do laboratorium 2014/15 Marcin Wilczewski
Kodowanie Huffmana Platforma programistyczna.net; materiały do laboratorium 24/5 Marcin Wilczewski Algorytm Huffmana (David Huffman, 952) Algorytm Huffmana jest popularnym algorytmem generującym optymalny
Definicja pliku kratowego
Pliki kratowe Definicja pliku kratowego Plik kratowy (ang grid file) jest strukturą wspierająca realizację zapytań wielowymiarowych Uporządkowanie rekordów, zawierających dane wielowymiarowe w pliku kratowym,
Porządek symetryczny: right(x)
Porządek symetryczny: x lef t(x) right(x) Własność drzewa BST: W drzewach BST mamy porządek symetryczny. Dla każdego węzła x spełniony jest warunek: jeżeli węzeł y leży w lewym poddrzewie x, to key(y)
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 5 Podstawy programowania 2 Temat: Drzewa binarne Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny Drzewa są jedną z częściej wykorzystywanych struktur danych. Reprezentują
Kodowanie Shannona-Fano
Kodowanie Shannona-Fano Kodowanie Shannona-Fano znane było jeszcze przed kodowaniem Huffmana i w praktyce można dzięki niemu osiągnąć podobne wyniki, pomimo, że kod generowany tą metodą nie jest optymalny.
Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych
Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2013/14 Znajdowanie maksimum w zbiorze
Kodowanie i kompresja Tomasz Jurdziński Studia Wieczorowe Wykład Kody liniowe - kodowanie w oparciu o macierz parzystości
Kodowanie i kompresja Tomasz Jurdziński Studia Wieczorowe Wykład 13 1 Kody liniowe - kodowanie w oparciu o macierz parzystości Przykład Różne macierze parzystości dla kodu powtórzeniowego. Co wiemy z algebry
Sortowanie - wybrane algorytmy
Sortowanie - wybrane algorytmy Aleksandra Wilkowska Wydział Matematyki - Katedra Matematyki Stosowanej Politechika Wrocławska 2 maja 2018 1 / 39 Plan prezentacji Złożoność obliczeniowa Sortowanie bąbelkowe
Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.
Sortowanie Dane wejściowe: ciąg n-liczb (kluczy) (a 1, a 2, a 3,..., a n 1, a n ) Dane wyjściowe: permutacja ciągu wejściowego (a 1, a 2, a 3,..., a n 1, a n) taka, że a 1 a 2 a 3... a n 1 a n. Będziemy
Według raportu ISO z 1988 roku algorytm JPEG składa się z następujących kroków: 0.5, = V i, j. /Q i, j
Kompresja transformacyjna. Opis standardu JPEG. Algorytm JPEG powstał w wyniku prac prowadzonych przez grupę ekspertów (ang. Joint Photographic Expert Group). Prace te zakończyły się w 1991 roku, kiedy
Zadanie projektowe nr 1
Zadanie projektowe nr 1 Badanie efektywności operacji dodawania (wstawiania), usuwania oraz wyszukiwania elementów w podstawowych strukturach danych Należy zaimplementować oraz dokonać pomiaru czasu działania
Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.
Drzewa binarne Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0 i T 1 są drzewami binarnymi to T 0 T 1 jest drzewem binarnym Np. ( ) ( ( )) Wielkość drzewa
Wykład 5. Kompresja danych
Wykład 5 Kompresja danych 1 Metody kompresji - przegląd Co to jest kompresja danych Definicje Kompresja bezstratna i stratna Kody o stałej i zmiennej długości Entropia i warunek Shannon a Metody kodowania
Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe
Algorytmy i złożoności Wykład 3. Listy jednokierunkowe Wstęp. Lista jednokierunkowa jest strukturą pozwalającą na pamiętanie danych w postaci uporzadkowanej, a także na bardzo szybkie wstawianie i usuwanie
Modyfikacja algorytmów retransmisji protokołu TCP.
Modyfikacja algorytmów retransmisji protokołu TCP. Student Adam Markowski Promotor dr hab. Michał Grabowski Cel pracy Celem pracy było przetestowanie i sprawdzenie przydatności modyfikacji klasycznego
Algorytmy i struktury danych. wykład 5
Plan wykładu: Wskaźniki. : listy, drzewa, kopce. Wskaźniki - wskaźniki Wskaźnik jest to liczba lub symbol który w ogólności wskazuje adres komórki pamięci. W językach wysokiego poziomu wskaźniki mogą również
Podstawowe pojęcia. Teoria informacji
Kodowanie i kompresja informacji - Wykład 1 22 luty 2010 Literatura K. Sayood, Kompresja danych - wprowadzenie, READ ME 2002 (ISBN 83-7243-094-2) Literatura K. Sayood, Kompresja danych - wprowadzenie,
Sortowanie topologiczne skierowanych grafów acyklicznych
Sortowanie topologiczne skierowanych grafów acyklicznych Metody boolowskie w informatyce Robert Sulkowski http://robert.brainusers.net 23 stycznia 2010 1 Definicja 1 (Cykl skierowany). Niech C = (V, A)
Wprowadzenie do informatyki i użytkowania komputerów. Kodowanie informacji System komputerowy
1 Wprowadzenie do informatyki i użytkowania komputerów Kodowanie informacji System komputerowy Kodowanie informacji 2 Co to jest? bit, bajt, kod ASCII. Jak działa system komputerowy? Co to jest? pamięć
Sortowanie przez scalanie
Sortowanie przez scalanie Wykład 2 12 marca 2019 (Wykład 2) Sortowanie przez scalanie 12 marca 2019 1 / 17 Outline 1 Metoda dziel i zwyciężaj 2 Scalanie Niezmiennik pętli - poprawność algorytmu 3 Sortowanie
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Algorytmy i złożoność obliczeniowa. Wojciech Horzelski
Algorytmy i złożoność obliczeniowa Wojciech Horzelski 1 Tematyka wykładu Ø Ø Ø Ø Ø Wprowadzenie Poprawność algorytmów (elementy analizy algorytmów) Wyszukiwanie Sortowanie Elementarne i abstrakcyjne struktury
Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne
Algorytmy i struktury danych Drzewa: BST, kopce Letnie Warsztaty Matematyczno-Informatyczne Drzewa: BST, kopce Definicja drzewa Drzewo (ang. tree) to nieskierowany, acykliczny, spójny graf. Drzewo może
Język ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Maciej Piotr Jankowski
Reduced Adder Graph Implementacja algorytmu RAG Maciej Piotr Jankowski 2005.12.22 Maciej Piotr Jankowski 1 Plan prezentacji 1. Wstęp 2. Implementacja 3. Usprawnienia optymalizacyjne 3.1. Tablica ekspansji
Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:
Sortowanie Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania: podać strukturę danych dla elementów dynamicznego skończonego multi-zbioru S, względem którego są wykonywane następujące
Podstawy Informatyki. Metody dostępu do danych
Podstawy Informatyki c.d. alina.momot@polsl.pl http://zti.polsl.pl/amomot/pi Plan wykładu 1 Bazy danych Struktury danych Średni czas odszukania rekordu Drzewa binarne w pamięci dyskowej 2 Sformułowanie
ZESZYTY NAUKOWE NR 6(78) AKADEMII MORSKIEJ W SZCZECINIE
ISSN 1733-8670 ZESZYTY NAUKOWE NR 6(78) AKADEMII MORSKIEJ W SZCZECINIE Wojciech Maleika I N Ż Y N I E R I A R U C H U M O R S K I E G O 2 00 5 Badanie bezstratnych metod kompresji danych opisujących kształt
Kwantyzacja wektorowa. Kodowanie różnicowe.
Kwantyzacja wektorowa. Kodowanie różnicowe. Kodowanie i kompresja informacji - Wykład 7 12 kwietnia 2010 Kwantyzacja wektorowa wprowadzenie Zamiast kwantyzować pojedyncze elementy kwantyzujemy całe bloki
AiSD zadanie drugie. Gliwiński Jarosław Marek Kruczyński Konrad Marek Grupa dziekańska I5. 10 kwietnia 2008
AiSD zadanie drugie Gliwiński Jarosław Marek Kruczyński Konrad Marek Grupa dziekańska I5 10 kwietnia 2008 1 Wstęp W nowym zadaniu porównywano efektywność kilku operacji na dwóch różnie zorganizowanych
SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści
SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, 2017 Spis treści O autorze 9 Wprowadzenie 11 Lekcja 1. Zrozumieć SQL 15 Podstawy baz danych 15 Język SQL
Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to
Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to wprowadzili J. Hartmanis i R. Stearns. Najczęściej przez zasób rozumie się czas oraz pamięć dlatego
Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 2 Podstawy programowania 2 Temat: Zmienne dynamiczne tablica wskaźników i stos dynamiczny Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Tablice wskaźników Tablice
Drzewa czerwono-czarne.
Binboy at Sphere http://binboy.sphere.p l Drzewa czerwono-czarne. Autor: Jacek Zacharek Wstęp. Pojęcie drzewa czerwono-czarnego (red-black tree) zapoczątkował Rudolf Bayer w książce z 1972 r. pt. Symmetric
Algorytmy i struktury danych
Algorytmy i struktury danych Proste algorytmy sortowania Witold Marańda maranda@dmcs.p.lodz.pl 1 Pojęcie sortowania Sortowaniem nazywa się proces ustawiania zbioru obiektów w określonym porządku Sortowanie
Kompresja Kodowanie arytmetyczne. Dariusz Sobczuk
Kompresja Kodowanie arytmetyczne Dariusz Sobczuk Kodowanie arytmetyczne (lata 1960-te) Pierwsze prace w tym kierunku sięgają początków lat 60-tych XX wieku Pierwszy algorytm Eliasa nie został opublikowany
Zadanie 1. Potęgi (14 pkt)
2 Egzamin maturalny z informatyki Zadanie 1. otęgi (14 pkt) W poniższej tabelce podane są wartości kolejnych potęg liczby 2: k 0 1 2 3 4 5 6 7 8 9 10 2 k 1 2 4 8 16 32 64 128 256 512 1024 Ciąg a=(a 0,
Kody Huffmana. Konrad Wypyski. 11 lutego 2006 roku
Kody Huffmana Konrad Wypyski 11 lutego 2006 roku Spis treści 1 Rozdział 1 Kody Huffmana Kody Huffmana (ang. Huffman coding) to jedna z najprostszych i najłatwiejszych w implementacji metod kompresji bezstratnej;
prowadzący dr ADRIAN HORZYK /~horzyk e-mail: horzyk@agh tel.: 012-617 Konsultacje paw. D-13/325
PODSTAWY INFORMATYKI WYKŁAD 8. prowadzący dr ADRIAN HORZYK http://home home.agh.edu.pl/~ /~horzyk e-mail: horzyk@agh agh.edu.pl tel.: 012-617 617-4319 Konsultacje paw. D-13/325 DRZEWA Drzewa to rodzaj
Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.
Drzewa binarne Każdy węzeł w drzewie posiada pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste. Uporządkowanie. Zakładamy, że klucze są różne. Klucze leżące
Algorytm. a programowanie -
Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik
Zasady programowania Dokumentacja
Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika
Algorytmy zachłanne. dr inż. Urszula Gałązka
Algorytmy zachłanne dr inż. Urszula Gałązka Algorytm zachłanny O Dokonuje wyboru, który w danej chwili wydaje się najkorzystniejszy. O Mówimy, że jest to wybór lokalnie optymalny O W rzeczywistości nie
Wstęp do programowania. Różne różności
Wstęp do programowania Różne różności Typy danych Typ danych określa dwie rzeczy: Jak wartości danego typu są określane w pamięci Jakie operacje są dozwolone na obiektach danego typu 2 Rodzaje typów Proste
Autor: Joanna Karwowska
Autor: Joanna Karwowska Wygodniejszym i wydajniejszym sposobem przechowywania i korzystania z dużej ilości danych zapisanych na serwerze jest współpraca z relacyjną bazą danych. 2 1. Utworzyć bazę danych.
Wstęp Statyczne kody Huffmana Dynamiczne kody Huffmana Praktyka. Kodowanie Huffmana. Dawid Duda. 4 marca 2004
4 marca 2004 Podstawowe oznaczenia i definicje Wymagania wobec kodu Podstawowa idea Podsumowanie Podstawowe oznaczenia i definicje Podstawowe oznaczenia i definicje: alfabet wejściowy: A = {a 1, a 2,...,
Def. Kod jednoznacznie definiowalny Def. Kod przedrostkowy Def. Kod optymalny. Przykłady kodów. Kody optymalne
Załóżmy, że mamy źródło S, które generuje symbole ze zbioru S={x, x 2,..., x N } z prawdopodobieństwem P={p, p 2,..., p N }, symbolom tym odpowiadają kody P={c, c 2,..., c N }. fektywność danego sposobu
Zaawansowane algorytmy i struktury danych
Zaawansowane algorytmy i struktury danych u dr Barbary Marszał-Paszek Opracowanie pytań praktycznych z egzaminów. Strona 1 z 12 Pytania praktyczne z kolokwium zaliczeniowego z 19 czerwca 2014 (studia dzienne)
Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.
Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji. Maria Górska 9 stycznia 2010 1 Spis treści 1 Pojęcie algorytmu 3 2 Sposób
Programowanie w VB Proste algorytmy sortowania
Programowanie w VB Proste algorytmy sortowania Sortowanie bąbelkowe Algorytm sortowania bąbelkowego polega na porównywaniu par elementów leżących obok siebie i, jeśli jest to potrzebne, zmienianiu ich
Tadeusz Pankowski www.put.poznan.pl/~tadeusz.pankowski
: idea Indeksowanie: Drzewo decyzyjne, przeszukiwania binarnego: F = {5, 7, 10, 12, 13, 15, 17, 30, 34, 35, 37, 40, 45, 50, 60} 30 12 40 7 15 35 50 Tadeusz Pankowski www.put.poznan.pl/~tadeusz.pankowski
Bloki anonimowe w PL/SQL
Język PL/SQL PL/SQL to specjalny język proceduralny stosowany w bazach danych Oracle. Język ten stanowi rozszerzenie SQL o szereg instrukcji, znanych w proceduralnych językach programowania. Umożliwia
Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki
Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Turbo Pascal jest językiem wysokiego poziomu, czyli nie jest rozumiany bezpośrednio dla komputera, ale jednocześnie jest wygodny dla programisty,
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019
.. Podstawy Programowania 2 Drzewa bst - część druga Arkadiusz Chrobot Zakład Informatyki 12 maja 2019 1 / 39 Plan.1 Wstęp.2 Wyszukiwanie w BST Minimalny i maksymalny klucz Wskazany klucz.3.4 Zmiany w
CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu
CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu inż. Daniel Solarz Wydział Fizyki i Informatyki Stosowanej AGH 1. Cel projektu. Celem projektu było napisanie wtyczki
TEORETYCZNE PODSTAWY INFORMATYKI
1 TEORETYCZNE PODSTAWY INFORMATYKI 16/01/2017 WFAiS UJ, Informatyka Stosowana I rok studiów, I stopień Repetytorium złożoność obliczeniowa 2 Złożoność obliczeniowa Notacja wielkie 0 Notacja Ω i Θ Rozwiązywanie
Algorytmy i struktury danych
Algorytmy i struktury danych ĆWICZENIE 2 - WYBRANE ZŁOŻONE STRUKTURY DANYCH - (12.3.212) Prowadząca: dr hab. inż. Małgorzata Sterna Informatyka i3, poniedziałek godz. 11:45 Adam Matuszewski, nr 1655 Oliver
Nierówność Krafta-McMillana, Kodowanie Huffmana
Nierówność Krafta-McMillana, Kodowanie Huffmana Kodowanie i kompresja informacji - Wykład 2 1 marca 2010 Test na jednoznaczna dekodowalność Kod a jest prefiksem kodu b jeśli b jest postaci ax. x nazywamy
Liczby losowe i pętla while w języku Python
Liczby losowe i pętla while w języku Python Mateusz Miotk 17 stycznia 2017 Instytut Informatyki UG 1 Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak
Abstrakcyjne struktury danych - stos, lista, drzewo
Sprawozdanie Podstawy Informatyki Laboratoria Abstrakcyjne struktury danych - stos, lista, drzewo Maciej Tarkowski maciek@akom.pl grupa VII 1/8 1. Stos Stos (ang. Stack) jest podstawową liniową strukturą
Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].
ABAP/4 Instrukcja IF Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek]. [ELSEIF warunek. ] [ELSE. ] ENDIF. gdzie: warunek dowolne wyrażenie logiczne o wartości
Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)
Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013
PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.
PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy. 1. Instrukcję case t of... w przedstawionym fragmencie programu moŝna zastąpić: var t : integer; write( Podaj
Wstęp do programowania
Wstęp do programowania Złożoność obliczeniowa, poprawność programów Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk(Wydział Fizyki) WP w. XII Jesień 2013 1 / 20 Złożoność obliczeniowa Problem Ile czasu
Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz
Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania Zofia Kruczkiewicz Zakres Funkcje przetwarzające teksty (biblioteka ) - tworzenie własnych
- - Ocena wykonaniu zad3. Brak zad3
Indeks Zad1 Zad2 Zad3 Zad4 Zad Ocena 20986 218129 ocena 4 Zadanie składa się z Cw3_2_a oraz Cw3_2_b Brak opcjonalnego wywołania operacji na tablicy. Brak pętli Ocena 2 Brak zad3 Ocena wykonaniu zad3 po
Tabela wewnętrzna - definicja
ABAP/4 Tabela wewnętrzna - definicja Temporalna tabela przechowywana w pamięci operacyjnej serwera aplikacji Tworzona, wypełniana i modyfikowana jest przez program podczas jego wykonywania i usuwana, gdy
Kodowanie informacji. Przygotował: Ryszard Kijanka
Kodowanie informacji Przygotował: Ryszard Kijanka Komputer jest urządzeniem służącym do przetwarzania informacji. Informacją są liczby, ale także inne obiekty, takie jak litery, wartości logiczne, obrazy
Wstęp do programowania
Wieczorowe Studia Licencjackie Wrocław, 9.01.2007 Wstęp do programowania Wykład nr 13 Listy usuwanie elementów Poniżej prezentujemy funkcję, która usuwa element o podanej wartości pola wiek z nieuporządkowanej
Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD
Podstawy programowania Wykład: 9 Łańcuchy znaków 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Rodzaje plików Dane przechowywane w pliku mogą mieć reprezentację binarną (taką samą, jak
Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010
Algorytmy równoległe Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka Znajdowanie maksimum w zbiorze n liczb węzły - maksimum liczb głębokość = 3 praca = 4++ = 7 (operacji) n - liczność
OPERACJE NA PLIKACH. Podstawowe pojęcia:
OPERACJE NA PLIKACH Podstawowe pojęcia: plik fizyczny, zbiór informacji w pamięci zewnętrznej wykorzystywany do trwałego przechowywania danych lub jako przedłużenie pamięci operacyjnej w przypadku przetwarzania
Wykład 2. Drzewa zbalansowane AVL i 2-3-4
Wykład Drzewa zbalansowane AVL i -3-4 Drzewa AVL Wprowadzenie Drzewa AVL Definicja drzewa AVL Operacje wstawiania i usuwania Złożoność obliczeniowa Drzewa -3-4 Definicja drzewa -3-4 Operacje wstawiania
Podstawy Programowania
Podstawy Programowania Monika Wrzosek Instytut Matematyki Uniwersytet Gdański Matematyka 2017/18 Monika Wrzosek (IM UG) Podstawy Programowania 1 / 119 Sprawy organizacyjne E-mail: mwrzosek@mat.ug.edu.pl
1 Wprowadzenie do algorytmiki
Teoretyczne podstawy informatyki - ćwiczenia: Prowadzący: dr inż. Dariusz W Brzeziński 1 Wprowadzenie do algorytmiki 1.1 Algorytm 1. Skończony, uporządkowany ciąg precyzyjnie i zrozumiale opisanych czynności
2012-01-16 PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew
0-0-6 PLAN WYKŁADU Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew BAZY DANYCH Wykład 9 dr inż. Agnieszka Bołtuć INDEKSY - DEFINICJE Indeksy to pomocnicze struktury
Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer
Realizacja algorytmu przez komputer Wstęp do informatyki Wykład UniwersytetWrocławski 0 Tydzień temu: opis algorytmu w języku zrozumiałym dla człowieka: schemat blokowy, pseudokod. Dziś: schemat logiczny
Zadanie 1. Suma silni (11 pkt)
2 Egzamin maturalny z informatyki Zadanie 1. Suma silni (11 pkt) Pojęcie silni dla liczb naturalnych większych od zera definiuje się następująco: 1 dla n = 1 n! = ( n 1! ) n dla n> 1 Rozpatrzmy funkcję
Warsztaty dla nauczycieli
WPROWADZENIE Wyprowadzanie danych: Wyprowadzanie na ekran komunikatów i wyników umożliwia instrukcja wyjścia funkcja print(). Argumentami funkcji (podanymi w nawiasach) mogą być teksty, wyrażenia arytmetyczne
Wysokowydajna implementacja kodów nadmiarowych typu "erasure codes" z wykorzystaniem architektur wielordzeniowych
Wysokowydajna implementacja kodów nadmiarowych typu "erasure codes" z wykorzystaniem architektur wielordzeniowych Ł. Kuczyński, M. Woźniak, R. Wyrzykowski Instytut Informatyki Teoretycznej i Stosowanej
KODY SYMBOLI. Kod Shannona-Fano. Algorytm S-F. Przykład S-F
KODY SYMBOLI Kod Shannona-Fano KODOWANIE DANYCH, A.Przelaskowski Metoda S-F Kod Huffmana Adaptacyjne drzewo Huffmana Problemy implementacji Kod Golomba Podsumowanie Kod drzewa binarnego Na wejściu rozkład: