wtorek, 23 stycznia 2018

Kompresja stratna i bezstratna

Kompresja danych (ang. data compression) – polega na zmianie sposobu zapisu informacji tak, aby zmniejszyć redundancję i tym samym objętość zbioru. Innymi słowy chodzi o wyrażenie tego samego zestawu informacji, lecz za pomocą mniejszej liczby bitów.
Działaniem przeciwnym do kompresji jest dekompresja.



Kompresja stratna to taka, w której takie odzyskanie jest niemożliwe, jednak główne właściwości zostają zachowane. Np. jeśli kompresowany jest obrazek, nie widać znaczących różnic w stosunku do oryginału. Pomimo to może się już nie nadawać do dalszej przeróbki czy do wydruku, gdyż w tych zastosowaniach wymaga się zachowania innych właściwości.

Kompresja stratna przydaje się np. w telewizji przemysłowej, w której przesłanie wiele razy większego strumienia nieskompresowanego było by niemożliwe. Innym popularnym przykładem kompresji stratnej jest format MP3 szeroko stosowany do zapisania muzyki w postaci cyfrowej. Kolejny powszechny przykład to format jpg z którego korzysta większość cyfrowych aparatów fotograficznych do zapisu wykonanych zdjęć.

Kompresja bezstratna (ang. lossless compression) – ogólna nazwa metod kompresji informacji do postaci zawierającej zmniejszoną liczbę bitów, pod warunkiem, że metoda ta gwarantuje możliwość odtworzenia informacji z postaci skompresowanej do identycznej postaci pierwotnej.

Najważniejszym twierdzeniem o kompresji bezstratnej jest twierdzenie o zliczaniu.


Zalety kompresji danych: 
+ przesyłanie większej ilości danych w jednostce czasu,
+ przesyłanie tej samej ilości danych w krótszym czasie,
+ zmniejszenie rozmiarów danych przechowywanych na nośnikach.

Wady kompresji danych:
– przed użyciem danych należy je rozpakować,
– w pewnych sytuacjach dekompresja w czasie rzeczywistym lub quasi-rzeczywistym może pochłaniać sporo zasobów systemu komputerowego.

Programy do kompresji danych: 
►potocznie nazywane są „pakerami”, „archiwizatorami” lub „kompresorami”.
►należą do programów narzędziowych, przeznaczonych do umieszczania plików w archiwach i odtwarzania zapisanych w nich informacji.
►posiadają swoje własne formaty i algorytmy kompresji, przeznaczone dla różnego typu danych.
►Pliki możemy skompresować, używając popularnych programów, np. Winzip, Winrar, czy darmowym 7-Zip.
►W efekcie otrzymujemy plik o mniejszym rozmiarze, którego jednak w takiej postaci nie jesteśmy w stanie użyć go bezpośrednio.
►Kompresja z użyciem tego typu programów nie powoduje utraty danych –stąd nazwa KOMPRESJA BEZSTRATNA.




piątek, 5 stycznia 2018

Złożoność algorytmów

1. Złożoność algorytmów

Ilość zasobów niezbędnych do wykonania algorytmu można rozumieć jako jego złożoność. W zależności od rozważanego zasobu mówimy o złożoności czasowej czy też złożoności pamięciowej. Oczywiście w większości wypadków ilość potrzebnych zasobów będzie się różnić w zależności od danych wejściowych z zakresu danego zagadnienia.

2. Złożoność obliczeniowa algorytmów

Teoria złożoności obliczeniowej – dział teorii obliczeń, którego głównym celem jest określanie ilości zasobów potrzebnych do rozwiązania problemów obliczeniowych. Rozważanymi zasobami są takie wielkości jak czas, pamięć lub liczba procesorów.

Za twórców tej teorii uważani są Juris Hartmanis i Richard Stearns. Jako przykłady problemów t.z.o. można podać problem spełnialności, problem najkrótszej ścieżki, problem faktoryzacji oraz wiele innych, o których wiadomo, że są obliczalne. Kwestią obliczalności zajmuje się teoria obliczalności będąca drugą ważną gałęzią teorii obliczeń.

3. Pamięciowa złożoność obliczeniowa

Podobnie jak złożoność czasowa jest miarą czasu działania algorytmu, tak złożoność pamięciowa jest miarą ilości wykorzystanej pamięci. Jako tę ilość najczęściej przyjmuje się użytą pamięć maszyny abstrakcyjnej (na przykład liczbę komórek pamięci maszyny RAM) w funkcji rozmiaru wejścia. Możliwe jest również obliczanie rozmiaru potrzebnej pamięci fizycznej wyrażonej w bitach lub bajtach.

4. Czasowa złożoność algorytmów

Przez czasową złożoność obliczeniową (ang. time computational complexity lub time complexity) rozumiemy ilość czasu niezbędnego do rozwiązania problemu w zależności od liczby danych wejściowych. Złożoność czasowa jest zatem pewną funkcją liczby danych wejściowych.

Złożoność czasową wyrażamy albo w jednostkach czasu, albo w liczbie operacji dominujących, które należy wykonać dla n danych, aby otrzymać rozwiązanie problemu. Operacja dominująca jest operacją, której wykonanie bezpośrednio wpływa na czas wykonania całego algorytmu. Podawanie złożoności czasowej w jednostkach czasu jest niewygodne, ponieważ wynik zależy od szybkości komputera, na którym dokonano pomiarów - trudno takie wyniki odnieść do innych komputerów, szczególnie wyposażonych w inne procesory, gdzie czas wykonania podobnych operacji może znacznie się różnić. Dlatego częściej złożoność czasową wyrażamy w liczbie operacji dominujących, gdyż każdy komputer, bez względu na swoje własności, operacje te musi wykonać. Dzięki temu wynik uniezależniamy od faktycznej szybkości komputerów.

wtorek, 2 stycznia 2018

Najważniejsze własności algorytmów, ich skończoność i poprawność

1. Najważniejsze własności algorytmów

Algorytm – w matematyce oraz informatyce to skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego zadania.Podstawowe cechy

Cechy algorytmów:
- poprawność (algorytm daje dobre wyniki),
- jednoznaczność (daje takie same wyniki przy takich samych danych),
- skończoność (wykonuje się w skończonej ilości kroków),
- sprawność (czasowa - szybkość działania i pamięciowa - "zasobożerność")

Sposoby prezentacji
Najbardziej przejrzystym sposobem prezentacji są schematy blokowe - narzędzia nakierowane na prezentację kolejnych czynności w projektowanym algorytmie.


2. Poprawność algorytmów
Co to znaczy, że algorytm działa poprawnie? Intuicja podpowiada nam, że chodzi tu o to, by dla dowolnych danych uzasadnić zgodność uzyskanych wyników z zamierzeniami. Aby jednak taką zgodność ustalić ponad wszelką wątpliwość, musimy jasno sformułować intencje, podać tzw. specyfikację algorytmu.

Specyfikacją algorytmu nazywać będziemy parę własności: <wp, wk>, gdzie wp jest warunkiem początkowym, a wk warunkiem końcowym. Intuicyjnie, warunek początkowy to ten, który mają spełniać dane początkowe, a warunek końcowy to ten, który ma być spełniony po wykonaniu algorytmu. Ogólnie, oba warunki powinny opisywać zależności między zmiennymi przed i po wykonaniu algorytmu.

3. Skończoność algorytmów
Algorytm jest skończony, jeżeli gwarantuje wyznaczenie wyniku w skończonej liczbie kroków.

ALGORYTM KTÓRY NIE JEST SKOŃCZONY NIE MOŻE ZOSTAĆ UZNANY ZA POPRAWNY.

środa, 27 grudnia 2017

Algorytmy sortowania

Sortowanie danych jest jednym z podstawowych problemów programowania komputerów, z którym prędzej czy później spotka się każdy programista. Poniżej są tylko nieliczne dziedziny, w których występuje potrzeba sortowania danych:
  • sport - wyniki uzyskane przez poszczególnych zawodników należy ułożyć w określonej kolejności, aby wyłonić zwycięzcę oraz podać lokatę każdego zawodnika.
  • bank - spłaty kredytów należy ułożyć w odpowiedniej kolejności, aby wiadomo było kto i kiedy ma płacić odsetki do banku.
  • grafika - wiele algorytmów graficznych wymaga porządkowania elementów, np. ścian obiektów ze względu na odległość od obserwatora. Uporządkowanie takie pozwala później określić, które ze ścian są zakrywane przez inne ściany dając w efekcie obraz trójwymiarowy.
  • bazy danych - informacja przechowywana w bazie danych może wymagać różnego rodzaju uporządkowania, np. lista książek może być alfabetycznie porządkowana wg autorów lub tytułów, co znacznie ułatwia znalezienie określonej pozycji.


Metoda sortowania przez wybór. 
Polega ona na wyszukaniu w ciągu liczby największej (lub najmniejszej - zależności od  przyjętego porządku), ustawieniu jej na początku ciągu, a następnie powtarzaniu tych czynności z pominięciem już uporządkowanych elementów. 
Metoda sortowania bąbelkowego. 
Polega na porównywaniu parami kolejnych liczb i przestawianiu ich, jeśli występują w niewłaściwej kolejności. 




Metoda sortowania pozycyjnego.
W algorytmie tym według porządku alfabetycznego metodą pozycyjną porównywane są litery umieszczone na tych samych pozycjach, począwszy od ostatniej litery w najdłuższym słowie (słowach).