Przeczytaj
Sposoby zapisów informacji
Komputery korzystają z systemu binarnego, tzn. każda wartość, znak lub obrazek są złożone z ciągów liczb w systemie dwójkowymsystemie dwójkowym.
O systemach liczbowych możesz przeczytać w e‑materiale Systemy liczboweSystemy liczbowe.
Kompresja danych
Kompresja jest to proces zmniejszania objętości, zagęszczenia lub wielkości czegoś. Można kompresować gazy, dane lub ciała stałe. W tym e‑materiale interesuje nas kompresja danych w informatyce, tzn. zmiana sposobu zapisu informacji, tak aby zmniejszyć redundancjęredundancję i tym samym objętość zapisanego zbioru.
Możemy zmniejszyć długość wiadomości na kartce przez zmianę sposobu kodowania.
Dany jest ciąg znaków, który nie zawiera cyfr.
Jeśli mamy ciąg znaków: „AAAAAAAAA”, możemy go zapisać w postaci: „9A” i dodać adnotację, że taki zapis oznacza dziewięć znaków „A”.
Miara względnego zmniejszenia rozmiaru reprezentacji danych generowanej przez algorytm kompresji danych (ang. compression rate, CR). Zwykle wyrażana jako wynik dzielenia rozmiaru nieskompresowanego przez rozmiar po skompresowaniu.
Dzięki temu udało nam się „skompresować” dziewięć znaków do dwóch, uzyskaliśmy stopień kompresji rzędu 4,5.
Stopień kompresji zapisuje się zgodnie z następującym wzorem:
Kompresja bezstratnaKompresja bezstratna polega na zmianie kodowania wiadomości w taki sposób, że nie tracimy żadnych informacji. Operacja ta jest w pełni odwracalna, ponieważ polega jedynie na zmianie sposobu kodowania.
Kompresja bezstratna oznacza głównie zmianę sposobu kodowania wiadomości.
Dana jest niezawierająca cyfr wiadomość: „AAAAAAAAAAAAAAAAAAAAAAAA”. Można skompresować ją poprzez zmianę kodowania do „24A” – co oznaczałoby, że została ona skrócona z 24 do 3 znaków.
Stopień kompresji wynosiłby więc: 24 : 3 = 8.
Przykładem kodu, którym posługujemy się na co dzień podczas korzystania z komputerów, jest kod ASCII (skrót ang. American Standard Code for Information Interchange) oraz jego rozszerzenia. Kod ASCII koduje tylko na 7 bitach wszystkie litery alfabetu łacińskiego, języka angielskiego, znaki interpunkcyjne i znaki kontrolne.
ASCII jest kodem 7‑bitowym, przy czym oryginalny standard nie definiuje roli ósmego bitu. Ósmy bit bywa wykorzystywany do kontroli parzystości lub do przechowywania dodatkowego atrybutu (np. podświetlenia). Najczęściej jednak ósmy bit służy rozszerzeniu podstawowego kodu ASCII o niezbędne znaki alfabetów narodowych, symbole matematyczne itp. Więcej na temat kodu ASCII znajdziesz w e‑materiale Reprezentacja tekstu w komputerzeReprezentacja tekstu w komputerze.
Co prawda zmiana sposobu kodowania jest niezbędna w kompresji, jednak sama nie powoduje oszczędności pamięci. Przykładowo przejście z kodu binarnego na kod Gray'a nie powoduje żadnej zmiany w ilości zajmowanej pamięci.
Kompresja przedstawiona w powyższym przykładzie, polega na zapisaniu informacji w inny sposób (w tym wypadku każdy zduplikowany znak występujący obok siebie możemy zastąpić liczbą, która oznacza, ile razy dany znak został powtórzony).
Polega na zmianie kodowania oraz na nieodwracalnym usunięciu części informacji. W kompresji stratnej niemożliwe jest odzyskanie informacji pierwotnej w postaci sprzed kompresji.
Algorytmy bezstratnej kompresji danych
Jest wiele algorytmów, które pozwalają bezstratnie kompresować dane. Przywołamy jedynie kilka z nich.
Kodowanie Shannona
Kodowanie Shannona to metoda kompresji bezstratnej polegająca na zliczeniu częstości występowania danego ciągu liter lub poszczególnych znaków w ciągu , a następnie posortowaniu ich w sposób nierosnący, zgodnie z prawdopodobieństwem ich wystąpienia .
Dla dwudziestoelementowego ciągu „AAABBBBBBCCCCDDDDDDD
” tworzymy zbiór znaków: . Następnie zliczamy wystąpienie każdego ze znaków:
Co pozwala nam policzyć prawdopodobieństwo wystąpienia każdego ze znaków (zbiór składa się z znaków):
Następnie sortujemy symbole wraz z częstościami nierosnąco:
Tworzymy sumy prawdopodobieństw kolejnych znaków:
Obliczamy teraz długości Shannona, czyli długość kodów w bitach. Posłużymy się następującym wzorem:
Podstawiając kolejne prawdopodobieństwa, uzyskamy następujące wartości:
Zamieniamy prawdopodobieństwa z postaci dziesiętnej na binarną (prezentujemy pięć pierwszych bitów po przecinku):
Na koniec bierzemy z postaci binarnej pierwsze bitów po przecinku – będzie to nasze słowo kodowe:
Wynikiem kodowania będzie następujący łańcuch znaków:
110 110 110 01 01 01 01 01 01 101 101 101 101 00 00 00 00 00 00 00Indeks dolny 22
Kodowanie Huffmana
Kodowanie Huffmana to kolejna metoda bezstratnej kompresji danych. Jest to kodowanie prefiksowe polegające na zliczeniu częstości występowania danego ciągu liter lub znaków, które następnie będą kodowane zgodnie ze swoją częstością występowania. Więcej na temat tego kodowania możesz przeczytać w e‑materiale Kodowanie HuffmanaKodowanie Huffmana.
Wiadomość „AAABBBBBBCCCCDDDDDDD
” po zastosowaniu kodowania Shannona przyjęłaby postać: 110 110 110 01 01 01 01 01 01 101 101 101 101 00 00 00 00 00 00 00Indeks dolny 22
i miałaby długość 47 bitów. Ta sama wiadomość zgodnie z kodowaniem Huffmana wyglądałaby następująco: 110 110 110 10 10 10 10 10 10 111 111 111 0 0 0 0 0 0 0 Indeks dolny 22
i miałaby długość 37 bitów.
Aby zdekompresować wiadomość zapisaną zgodnie z kodowaniem Shannona, należy dopasować metodą prób i błędów słowa kodowe do odpowiednich fragmentów wiadomości.
Aby zdekodować wiadomość zakodowaną zgodnie z kodowaniem Huffmana, możemy posłużyć się zbudowanym drzewem binarnymdrzewem binarnym i przechodzić po jego wierzchołkach zgodnie z kolejnymi bitami lub również próbować dopasowywać odpowiednie bity do słów kodowych.
Oczywiście możemy skonstruować drzewo również w kodowaniu Shannona, jednak posłużenie się nim byłoby działaniem dodatkowym, wymagającym kolejnych obliczeń.
Słownik
podtyp drzewa, w którym każdy wierzchołek ma nie więcej niż dwóch synów
kompresja, która pozwala po skompresowaniu odtworzyć dane wejściowe ze skompresowanej wiadomości
nadmiarowość danych w bazie danych, które nie są konieczne do prawidłowego jej działania
(inaczej: binarny) system liczbowy, którego podstawą jest liczba 2, a do zapisu potrzebne są w nim tylko dwie cyfry: 0 i 1