Języki symboliczne, laboratorium 06 Zadanie 1. Zapisz do pliku listę

Transkrypt

Języki symboliczne, laboratorium 06 Zadanie 1. Zapisz do pliku listę
Języki symboliczne, laboratorium 06
Zadanie 1. Zapisz do pliku listę tysiąca najpopularniejszych słów w języku Polskim.
https://pl.wiktionary.org/wiki/Indeks:Polski_-_Najpopularniejsze_s%C5%82owa_11000_wersja_Jerzego_Kazojcia
Zadanie 2. Napisz dwie funkcje:
• Wczytującą listę słów z zadania 1., zwracającą listę stringów (pojedyncze słowa),
• Przyjmującą jako argument liczbę n oraz listę słów, zwracającą listę n słów losowo
wybranych z listy.
Napisz program który najpierw wczytuje listę słów, wybiera losową liczbę słów z tej listy, a
następnie wpisuje ją do pliku o nazwie np. „1000małp.txt”
https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files
Zadanie 3. Do programu z zadania 2. dodaj obsługę wyjątków rzucanych gdy:
• Nie uda się otworzyć pliku z listą słów - wyjątek FileNotFoundError,
• Nie uda się utworzyć pliku z zadania 2 – wyjątek PermissionError.
W razie wystąpienia błędu, program powinien wypisać informację o błędzie i zakończyć działanie.
Stwórz klasę wyjątku np. ZłyFormatException rzucanego gdy plik z listą słów jest w
nieprawidłowym formacie ([słowo][równa się][liczba][spacja]).
https://docs.python.org/3/tutorial/errors.html#exceptions
Zadanie 4. Napisz:
• Klasę węzła drzewa Huffmana, zawierającą:
◦ referencję na rodzica,
◦ referencję na lewego potomka,
◦ referencję na prawego potomka,
◦ kodowany symbol (jeśli węzeł nie koduje symbolu, pole ma wartość None),
◦ liczbę wystąpień.
• Klasę drzewa Huffmana, zawierającą:
◦ referencję na korzeń drzewa,
◦ metodę generującą zawartość drzewa, przyjmującą jako argument listę par (symbol,
liczbę wystąpień),
◦ metodę kodującą, wykorzystująca drzewo na którym jest wywołana do zakodowania
przesłanej wiadomości (listę złożoną z dozwolonych symboli), zwracającą listę złożoną
z 0 i 1,
◦ metodę odkodowującą, wykorzystującą drzewo na którym jest wywołana do
odkodowania przesłanej wiadomości (listy złożonej z 0 i 1), zwracającą listę symboli.
• Funkcje pomocnicze (metody prywatne w klasie drzewa Huffmana):
◦ Funkcja szukająca wierzchołka z podanym symbolem, przyjmująca symbol jako
argument,
◦ Funkcja wyliczająca kod, przyjmująca symbol jako argument,
◦ Funkcja otrzymująca kod jako argument, zwracająca kodowany symbol. Dodatkowo,
funkcja powinna zwracać liczbę bitów kodujących odkodowany symbol.
Szukanie wierzchołka z symbolem:
1. Przeszukiwanie drzewa wybranym algorytmem (na przykład DFS). Proszę zwrócić uwagę, że
drzewo w algorytmie Huffmana nie jest drzewem BST.
Wyznaczanie kodu mając dany symbol:
1. Znajdź wierzchołek z podanym symbolem,
2. Utwórz pustą listę, która będzie przechowywała kod symbolu,
3. Jeśli aktualny wierzchołek jest lewym potomkiem swojego rodzica, wstaw 0 na początek listy
z kodem,
4. Jeśli aktualny wierzchołek jest prawym potomkiem swojego rodzica, wstaw 1 ma początek
listy z kodem,
5. Przestaw aktualny wierzchołek na rodzica,
6. Gdy aktualny wierzchołek jest korzeniem, zwróć listę z punktu 2., zawierającą kod symbolu,
7. W przeciwnym razie wróć do punktu 3.
Wyznaczanie symbolu mając dany kod:
1. Zacznij od korzenia,
2. Jeśli kod nie ma więcej nieprzejrzanych bitów, zwróć symbol w aktualnie odwiedzanym
wierzchołku,
3. Jeśli aktualny wierzchołek ma jakiś symbol, zwróć go,
4. Jeśli kolejny bit kodu jest równy 0, przestaw aktualny wierzchołek na lewego potomka,
5. Jeśli kolejny bit kodu jest równy 1, przestaw aktualny wierzchołek na prawego potomka,
6. Przejdź do kolejnego bitu, wróć do punktu 2.
Generowanie drzewa Huffmana:
1. Posortuj listę par (klucz, liczba wystąpień) rosnąco po liczbie wystąpień,
2. Stwórz listę wierzchołków drzewa Huffmana, posortowaną rosnąco po liczbie wystąpień,
3. Dopóki w kolejce jest więcej niż 1 wierzchołek:
3.1 Weź dwa pierwsze wierzchołki z listy,
3.2 Stwórz nowy wierzchołek, którego częstość jest sumą liczby wystąpień wierzchołków
z punktu 3.1.
3.3 Dodaj wierzchołki z punktu 3.1. jako potomków wierzchołka z punktu 3.2.,
3.4 Umieść wierzchołek z punktu 3.2. na liście,
3.5 Posortuj wierzchołki w liście rosnąco po liczbie wystąpień,
4. Jeden element który został w kolejce jest korzeniem drzewa Huffmana.
Kodowanie wiadomości:
1 Stwórz pustą listę przechowującą zakodowaną wiadomość (lista bitów),
2 Dla każdego symbolu z kodowanej listy:
2.1 Znajdź wierzchołek drzewa z kodowanym symbolem,
2.2 Znajdź kod aktualnego wierzchołka,
2.3 Dopisz kod do listy z punktu 1.,
3 Zwróć listę z zakodowaną wiadomością.
Odkodowywanie wiadomości:
1 Stwórz pustą listę przechowującą odkodowaną wiadomość (lista symboli)
2 Dopóki lista bitów nie jest pusta:
2.1 Znajdź kodowany symbol,
2.2 Usuń z listy bitów pierwsze n elementów (n to liczba bitów kodujących znaleziony
symbol),
2.3 Dopisz symbol do listy z punktu 1.,
3 Zwróć listę z odkodowaną wiadomością.