МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» Інститут комп'ютерних наук та інформаційних технологій Кафедра систем штучного інтелекту Лабораторна робота №7 Звіт з дисципліни: «Теорія інформації» Виконав: студент групи КН-207 Букін Сергій Викладач: Косаревич Р. Я. Львів – 2018 Завдання 1. Реалізувати програмно алгоритм кодування послідовностей символів на основі методу LZ78. 2. Здійснити кодування: а) власного прізвища записаного два рази без пропуску. б) довільного фрагмента тексту довжиною від 20 до 30 слів. в) випадково згенерованого набору символів у вигляді 20- 30 слів. Код програми import random import string def gen_dict(inp): d = {} i=0 while i < (len(inp)): if inp[i] != ' ': if inp[i] not in d.keys(): d[inp[i]] = f'(0 ,"{inp[i]}")' i += 1 else: if i != len(inp)-1: d[inp[i:i+2]] = f'({list(d.keys()).index(inp[i])+1} ,"{inp[i+1]}")' i += 2 else: d[inp[i]+'(eof)'] = f'({list(d.keys()).index(inp[i])+1} ,"(eof)")' i += 1 else: i += 1 return d print('*' * 50) print('task 1') print('*' * 50) s = '' with open("input.txt", "r+") as file: for line in file: s += line print(s) d = gen_dict(s) for k, v in d.items(): print(f'{k} {v}') print('*' * 50) print('task 2') print('*' * 50) s = '' with open("input1.txt", "r+") as file: for line in file: s += line print(s) d = gen_dict(s) for k, v in d.items(): print(f'{k} {v}') print('*' * 50) print('task 3') print('*' * 50) s = '' for _ in range(20): s += ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(6)) print(s) d = gen_dict(s) for k, v in d.items(): print(f'{k} {v}') Здійснити кодування: а) власного прізвища записаного два рази без пропуску. HetsyaninHetsyanin № 1 2 3 4 5 Символ B u k i n Мітка (0 ,"B") (0 ,"u") (0 ,"k") (0 ,"i") (0 ,"n") 6 Bu (1 ,"Bu") 7 ki (3 ,"ki") 8 n (5 ,"n") б) довільного фрагмента тексту довжиною від 20 до 30 слів. Forbidden to return to his own country, and dodging the everyday dangers of jail and deportation, Ravic manages to hang on. 1 F (0 ,"F") 12 tu (9 ,"u") 23 , (0 ,",") 2 o (0 ,"o") 13 rn (3 ,"n") 24 a (0 ,"a") 3 r (0 ,"r") 14 to (9 ,"o") 25 nd (8 ,"d") 4 b (0 ,"b") 15 h (0 ,"h") 26 do (6 ,"o") 5 i (0 ,"i") 16 is (5 ,"s") 27 dg (6 ,"g") 6 d (0 ,"d") 17 ow (2 ,"w") 28 in (5 ,"n") 7 de (6 ,"e") 18 n (8 ," ") 29 g (0 ,"g") 8 n (0 ,"n") 19 c (0 ,"c") 30 th (9 ,"h") 9 t (0 ,"t") 20 ou (2 ,"u") 31 e (0 ,"e") 10 o (2 ," ") 21 nt (8 ,"t") 32 ev (31 ,"v") 11 re (3 ,"e") 22 ry (3 ,"y") 33 er (31 ,"r") 34 y (0 ,"y") 43 an (24 ,"n") 52 av (24 ,"v") 35 da (6 ,"a") 44 d (6 ," ") 53 ic (5 ,"c") 36 y (34 ," ") 45 p (0 ,"p") 54 m (0 ,"m") 37 ng (8 ,"g") 46 or (2 ,"r") 55 ag (24 ,"g") 38 s (0 ,"s") 47 ta (9 ,"a") 56 es (31 ,"s") 39 of (2 ,"f") 48 ti (9 ,"i") 57 ha (15 ,"a") 40 j (0 ,"j") 49 on (2 ,"n") 58 . (0 ,".") 41 ai (24 ,"i") 50 , (23 ," ") 42 l (0 ,"l") 51 R (0 ,"R") в) випадково згенерованого набору символів у вигляді 20- 30 слів OS5FQMNJu4kkEekohmpEL0nHco77Y5g7x38doX8skvG6qCzxiqCLYcEl0KXaaw mP6D82EMfsoCehd1H9nGJtH9fSn7HNFAGTsSYkVWF8nycjjwcOF1xfLF3V 1 2 O (0 ,"O") S (0 ,"S") 5 3 4 F (0 ,"5") (0 ,"F") 5 6 7 8 Q (0 ,"Q") M (0 ,"M") N (0 ,"N") J (0 ,"J") 9 4 10 11 12 (0 ,"u") u (0 ,"4") k (0 ,"k") kE (11 ,"E") 13 14 15 16 17 18 19 e (0 ,"e") ko (11 ,"o") h (0 ,"h") 22 23 24 27 (0 ,"E") E (0 ,"L") L 0 (0 ,"H") H (0 ,"c") c (0 ,"o") o 7 7Y 5g (0 ,"0") (0 ,"n") n 25 26 (0 ,"p") p 20 21 (0 ,"m") m (0 ,"7") (25 ,"Y") (3 ,"g") 28 29 30 31 32 33 34 35 38 39 40 41 42 3 (0 ,"3") 8 (0 ,"8") (0 ,"d") d (24 ,"X") oX (30 ,"s") 8s (11 ,"v") kv (0 ,"G") G 6 36 37 (25 ,"x") 7x q C z x (0 ,"6") (0 ,"q") (0 ,"C") (0 ,"z") (0 ,"x") i (0 ,"i") qC (37 ,"C") 43 44 45 46 47 48 49 50 51 LY (19 ,"Y") cE (23 ,"E") l (0 ,"l") 0K (20 ,"K") X (0 ,"X") a (0 ,"a") aw (48 ,"w") mP (16 ,"P") 6D (36 ,"D") 82 52 53 54 55 56 57 (30 ,"2") EM (18 ,"M") f (0 ,"f") s (0 ,"s") oC (24 ,"C") eh (13 ,"h") 58 59 60 61 62 63 64 65 d1 H9 nG Jt fS n7 (31 ,"1") (22 ,"9") (21 ,"G") (8 ,"t") (54 ,"S") (21 ,"7") HN (22 ,"N") FA (4 ,"A") 66 67 68 69 70 71 72 73 GT sS Y kV W F8 (35 ,"T") (55 ,"S") (0 ,"Y") (11 ,"V") (0 ,"W") (4 ,"8") ny (21 ,"y") cj (23 ,"j") 74 75 76 77 78 79 80 j (0 ,"j") w (0 ,"w") cO (23 ,"O") F1 (4 ,"1") xf (40 ,"f") LF (19 ,"F") 3V (29 ,"V") Висновок: на даній лабораторній роботі я ознайомився з алгоритмом стиснення LZ78, навчився реалізовувати його програмно. Даний алгоритм доволі оптимальний для послідовностей, в яких з’являються часті повтори підпослідовностей, для послідовностей без повторень даний алгоритм не несе користі.