Лекція 09. Засади кодування із захистом від помилок передачі
Курс “Теорія інформації та кодування”

У даній лекції будуть розглянуті принципи надлишкового завадозахисного кодування. Також ми детально познайомимося з двома популярними видами кодів - кодом Хеммінга для виправлення помилок в оперативній пам'яті серверів і декількома модифікаціями коду з перевіркою парності, які широко застосовуються на практиці.


Коди з перевіркою парності
Оцінювання здатності надлишкових кодів до корекції помилок
Поняття про лінійні коди
Код Хеммінга з виправленням поодиноких помилок

9.1 Коди з перевіркою парності

Перевірка парності «по рядках»
Приступимо до більш детального розгляду простих завадозахисні кодів з контролем парності. Нагадаємо, що тут контрольні розряди доповнюють кількість "1" в коді до парної. На рис.9.1 показаний приклад використання такого способу під час передачі одного байта даних:

Рисунок 9.1 Кодування з контролем парності по рядках

- при кодуванні в прикладі 1 контрольний розряд отримує значення 0, а прикладі 2 - значення 1 (в обох випадках підсумкове число 1 буде парним);

- при декодуванні за відсутності помилок зберігається парність кількості 1 і робиться висновок про правильність передачі (рядок 1);

- в разі помилки при передачі одного з розрядів коду парність кількості 1 порушується і декодер вважає, що блок коду прийнятий невірно (рядок 2). Аналогічною буде ситуація для 3-х помилок (рядок 4), а також для будь-якої непарної кількості помилок передачі;

- якщо відбулися одночасно дві помилки, то парність кількості 1 зберігається і декодер неправильно фіксує, що передача минула вірно (рядок 3). Така ж ситуація виникне при будь-якому парній кількості помилок передачі.

Відзначимо, що на практиці зазвичай ймовірність одночасної появи декількох помилок значно нижче, ніж для появи однієї. Так що в цілому при всій простоті реалізації код з контролем парності може бути досить ефективним, особливо, для контролю коротких блоків коду.

Найбільш широко такий код застосовується для контролю послідовної передачі байтів в мікросхемах так званих com-портів (комунікаційних портів). Зокрема, такі мікросхеми використовуються при передачі даних від клавіатури до настільного ПК.

Перевірка парності «в матриці»
Можливості коду парності можуть бути значно розширені, якщо його використовувати для контролю послідовності рядків (такий спосіб ще називають матричним). Приклад показаний на рис.9.2:

Рисунок 9.2 Матричний код із перевіркою парності

- при кодуванні розряди контролю парності додаються в кожен рядок коду, а також утворюють додаткову контрольну рядок, де кожен розряд забезпечує парність по стовпцю;

- при декодуванні для одиночної помилки можна визначити не тільки рядок, в якій вона знаходиться, але і номер помилкового розряду (за рахунок контролю за стовпцями). На практиці, це означає, що таку помилку можна виправити (інвертуємо значення виявленого спотвореного розряду);

- крім того в цій модифікації коду виявляються помилки будь якої парної кратності по рядку (вони фіксуються за рахунок порушення парності по стовпцях). Правда, помилки будуть пропущені декодером, якщо вони виявляться в вершинах умовного прямокутника на полі розрядів коду (в цьому випадку зберігається парність як по рядках, так і по стовпцях), однак на практиці такі ситуації виникають виключно рідко.

Таким чином, код з контролем «в матриці» дозволяє виправляти поодинокі помилки передачі, а також значно збільшує ймовірність виявлення помилок. Платою за це є необхідність працювати з усією послідовністю блоків коду як із цілим, що значно знижує оперативність обробки. На практиці такий спосіб широко застосовувався для стрічкових накопичувачів даних.

Відновлення пошкоджених блоків коду з використанням контролю парності
Ще одна важлива модифікація коду з контролем парності використовується для відновлення блоків пошкоджених даних. Необхідною умовою тут є передача поряд з інформаційними блоками також додаткового контрольного блоку, розряди якого створюються за принципом парності. У прикладі на рис.9.3:

Рисунок 9.3 Відновлення помилкового блоку даних за рахунок контролю парності

- при кодуванні за трьома вихідним блокам X1-X3 будується контрольний блок Y (доповнення до парності тут відповідає операція підсумовування по модую 2);
- при передачі одного з блоків відбувається одна або декілька помилок (у прикладі це помилка в блоці X3), що виявляється декодером;

- за спільної обробки правильно переданих та контрольного блоків зміст пошкодженого блоку повністю відновлюється (в прикладі це забезпечується підсумовуванням за модулем 2 блоків X1, X2 Y);

- можливість виправлення декількох помилок в данном випадку забезпечується за рахунок врахування додаткового умови: відомо, що всі помилки зосереджені в одному блоці (рядку). В такому випадку контроль за стовпцями однозначно виявляє позиції помилкових розрядів.

На практиці такий спосіб використовується для резервування і відновлення блоків архівних файлів і навіть для відновлення вмісту окремих пошкоджених дисків в так званих RAID-масивів серверів (блоки з декількох дисків, що функціонують як єдиний пристрій). При цьому, зрозуміло, для фіксації пошкодження окремого довгого "рядка" можуть використовуватися значно потужніші коди, ніж розглянутий нами код з перевіркою парності. З ними ми познайомимося надалі.

Контрольні питання
1) Спираючись на рис.9.1, поясніть особливості коду з перевіркою парності по рядках
2) В чому полягають переваги і обмеження коду з перевіркою парності по рядку. Наведіть приклади його використання на практиці.
3) Спираючись на рис.9.2, поясніть особливості матричного коду з перевіркою парності
4) У чому полягають переваги та обмеження коду з перевіркою парності в матриці. Наведіть приклади його використання на практиці.
5) Спираючись на ріс.9.3, поясніть особливості коду з відновленням пошкоджених блоків на основі перевірки парності
6) У чому полягають переваги та обмеження коду з відновленням пошкоджених блоків на основі перевірки парності. Наведіть приклади його використання на практиці.


9.2 Оцінювання здатності надлишкових кодів до корекції помилок

Кодова відстань по Хеммінгу
Здатність коду виявляти і коригувати помилки багато в чому визначається параметром, який називають мінімальним кодовою відстанню по Хеммінгу. Важливо, що такий параметр може бути визначений для будь-якого коду, тобто він є універсальним (рис.9.4):

Рисунок 9.4 До поняття кодової відстані по Хеммінгу

- відстань d по Хеммінгу між двома кодовими блоками визначається як число незбіжних розрядів. З'ясувавши значення dij для всіх можливих пар блоків, можна знайти його мінімальну величину dmin. Таке значення є є атрибутом будь-якого коду;

- на рис.9.4 показані набори трьохрозрядних кодових блоків, для яких значення dmin. становлять 1 (безнадлишковий код), 2 (код з парною кількістю 1) і 3 (код з максимальною надмірністю). Як можна бачити, значення dmin визначає "слабкість" коду: саме в тих випадках, коли кодова відстань мінімальна, найімовірніше може відбутися помилка розпізнавання;

- неважко бачити, що при dmin = 1 (блок А) принципово неможливо виявити появу помилки передачі: кожне одержане значення блоку в принципі може бути вірним (всі такі значення дозволені). При цьому надмірність відсутня;

- для dmin = 2 (блок Б) до дозволених належить тільки половина можливих значень коду (в даному випадку - ті, для яких виконується умова парності кількості 1). При цьому одноразова помилка вже гарантовано виявляється, оскільки значення кодового блоку з набору дозволених переходить в заборонені;

- для dmin = 3 (блок В) всього четверта частина значень належить до дозволених. Така надмірність дозволяє не тільки розпізнавати, але і виправляти помилки. Справа в тому, що всі значення, що виникають внаслідок одноразової помилки, будуть «ближче» по кодової відстані до одного з дозволених значень. При цьому виникнення одноразової помилки набагато більш імовірно, ніж для помилок більшої кратності. Відповідно, виправлення зводиться до того, що отримане заборонене значення замінюється на найближчий за величиною d дозволене.

Таким чином, параметри здатності коду до корекції помилок прямо пов'язані з його мінімальним кодовою відстанню. Тут ми розглянули окремі приклади такого зв'язку. Перейдемо тепер до загальних форулам.

Формули для оцінки коректує здатності
Найбільш вживаними параметрами здатності коду до корекції є кратність гарантовано виявлених помилок rm і кратність гарантовано виправляє помилок sm. Рис.9.5 дозволяє формалізувати зв'язок цих параметрів з величиною мінімального кодового відстані dmin:

Рисунок 9.5 Оцінювання здатності кода до коекції помилок

- зліва на рис.9.5 показано вихідне дозволене значення коду, яке відповідає переданим даними. Внаслідок помилок при передачі можуть виникати заборонені значення, які розпізнаються кодом (на рисунку вони показані пунктиром). Помилка розпізнавання з'явиться, якщо в результаті спотворень при передачі виникне одне з дозволених значень коду, відмінних від вихідного (на рисунку праворуч);

- для розпізнання помилок передачі, досить, щоб отримане значення було хоча б на одиницю кодового відстані віддалене від дозволеного. Звідси випливає умова rm=dmin-1. У нашому прикладі значення dmin=5 досить, щоб розпізнавалися помилки аж до четвертої кратності (rm=4);

- для виправлення помилок передачі необхідно, щоб проміжний заборонений стан був ближче до вихідного, ніж до будь-якого іншого дозволеного стану. У нашому прикладі стан, що виникає в результаті дворазової помилки (sm=2) все ще ближче до вихідного стану, ніж до альтернативного, так що виправлення помилок можливе. Якщо розглянути випадок dmin = 6, то додатковий проміжний стан виявиться рівновіддаленим від вихідного і альтернативного, тож виправлення триразовою помилки буде все ще неможливо. Звідси випливає формула sm= ]dmin-1)/2[ (зворотніми квадратними дужками позначується відкидання дробової частини). Зокрема для випадків dmin=5 і dmin=6 ця формула дає однакові значення sm=2.

Практична оцінка здатності кодів до корекції помилок
Розглянемо особливості застосування отриманих формул, а також додаткові параметри здатності коду до корекції помилок (рис.9.6):

Рисунок 9.6 Приклади оцінювання здатності коду до корекції помилок

- як ми пам'ятаємо, код з перевіркою парності по рядку характеризується значенням dmin=2 і отже для нього rm=1 (гарантовано виявляються одноразові помилки), а sm=0 (виправлення помилок неможливо). Однак, нам відомо, що такий код дозволяє виявляти помилки будь непарної кратності;

- тут прояснюється важлива особливість отриманих вище формул: значення rm та sm характеризують нижню межу можливостей коду. Таким чином використання тільки цих значень не вичерпує характеристику коригуючої здатності коду;

- для коду з перевіркою по рядку і по стовпцю значення dmin визначається як добуток мінімальних кодових відстаней по рядку і стовпцю, таким чином тут dmin=4. Звідси випливає rm=3 і sm=1. Дійсно, такий код дозволяє виправляти одноразові помилки, а в ситуації з чотирикратної помилкою можливий "прокол", коли вона не однаружівается через те, що помилки "в вершинах прямокутника" зберігають парність по рядках і стовпцях. При цьому реальні можливості такого коду, як ми вже знаємо, можуть далеко перевершувати гарантовані обмеження;

- те саме відноситься до способу кодування з відновленням пошкоджених блоків, де при формальному значенні dmin= 4 (коли по рядках використовується контроль парності, а не більш потужні коди) можливе виправлення багатократних помилок. Тут знову-таки роль відіграють додаткові умови кодування (в даному випадку - допущення про знаходження всіх помилок в одному рядку).
Таким чином, для реальної оцінки коректує здатності потрібно враховувати конкретні правила кодування. У багатьох випадках реальна коригувальна здатність кодів може бути значно вищою за ту, яка обмежується мінімальним кодовою відстанню по Хеммінга.

Контрольні питання
1) Спираючись на рис.9.4, поясніть поняття кодового відстані по Хеммінга і мінімального кодового відстані.
2) Як в наведених прикладах виявляється зв'язок мінімального кодового відстані, надмірності і коректує здатності коду.
3) Поясніть як на рис.9.5 відображається виникнення помилок різної кратності.
4) Поясніть сенс формул для визначення гарантованої кратності помилок передачі, які виявляються і виправляються кодом.
5) Як пояснити, що при значенні rm = 1 код з перевіркою парності дозволяє виявляти наприклад помилки кратності 3 та 5.


9.3 Поняття про лінійні коди

Принципи побудови лінійних кодів
Для побудови надлишкових завадозахисні кодів широко використовується математичний апарат лінійної алгебри (ріс.9.7):

Рисунок 9.7 До уявлення про матеамтичний апарат лінійних кодів

- код як послідовність двійкових розрядів математично може бути представлений в двох різних формах (рис.9.7A). По-перше, це вектор X, в якому все розряди x1 ... xn незалежні і можуть оброблятись паралельно. По-друге, це многочлен f(x), де всі розряди мають власну вагу, що пов'язана з їх позицією. В такому випадку розряди коду можуть оброблятися тільки у взаємозв'язку, а тому — саме послідовно. Вибір форми для опису конкретних кодів визначається вимогами до їх застосування (зокрема, операції з векторами швидше, а використання поліномів надає коду масштабованість);

- лінійні перетворення включають тільки операції підсумовування і множення на постійні коефіцієнти (рис.9.7Б). Для двійкових змінних такі коефіцієнти можуть мати значення 0 або 1. Крім того для підсумовування використовується операція додавання по модулю 2. Використання такої операції дозволяє отримувати всі результати в межах одного розряду;

- в подальшому ми будемо розглядати в основному так звані "систематичні" коди (рис.9.7B), у яких інформаційні та контрольні розряди розділені: в загальному випадку послідовність з n кодових розрядів включає k інформаційних і m контрольних (останні утворюють так званий "хвостовик"). Такий код часто позначають парою параметрів n, k. Наприклад, запис 7,4 означає, що довжина кодових блоків n = 7, при цьому k = 4 розряду в блоці - інформаційні (залишилися m=3 розряду контрольні). В практиці кодування застосовуються також несистематичні коди, для яких інформаційні та контрольні розряди можуть чергуватись. Однак розгляд саме систематичних кодів дозволяє спростити аналіз математичного апарату.

Утворюючі матриці лінійних кодів
Важливою перевагою лінійних кодів є можливість їх компактного завдання за допомогою так званих утворюючих матриць (рис.9.8):

Рисунок 9.8 Утворюючі матриці лінійних кодів

- в загальному вигляді утворю юча матриця G коду n,k включає k рядків, яким відповідають n-розрядні вектора X1 - Xk. Всі ці вектори довжиною n повинні бути лінійно незалежними (тобто, жоден з них не може бути отримана лінійними перетвореннями з інших рядків). Крім того всередині матриці G має забезпечуватися задане значення dmin;

- важлива властивість утворючої матриці в тому, що всі 2k дозволених значення коду можуть бути отримані лінійними перетвореннями її рядків. Таким чином матриця G компактно задає весь код. У прикладі на рис 9.8 для коду парності 5,4 матриця GA включає 4 рядки X1 - X4, з яких лінійними комбінаціями виходять ще 12 які залишилися. При збільшенні значення k ефективність такого способу зростає. Наприклад, якщо інформаційна частина блоку включає 1 байт (k = 8), то матриця з 8 рядків визначає всі 256 дозволених значень коду;

- вид утворючої матриці задає і додаткові властивості коду. Так, матриці GB і GC подібні за структурою (задають код 7,4) і забезпечують значення dmin = 3. Проте, властивості кодів, які вони визначають, значно різняться. Зокрема код Хеммінга (матриця GB) орієнтований на виправлення помилок в оперативній пам'яті комп'ютера, які в силу її організації з високою імовірністю будуть поодинокими. Циклічний код (матриця GC) націлений на виявлення "пачок" помилок в сусідніх розрядах, які можуть виникати при передачі по лініях зв'язку. В останньому випадку всі рядки матриці можуть бути отримані з першого рядка шляхом її циклічного зсуву. Це означає, що властивості коду визначаються лише одним першим рядком. Його опис у вигляді полінома має вигляд g (x) = x3 + x + 1. Такий многочлен, як і матриця, називається утворюючим.

Спираючись на описаний математично апарат, ми можемо тепер детально розглянути ряд популярних завадозахисні кодів.

Процедури кодування та декодування
Загальні підходи до процедур кодування та декодування надлишковими завадозахисні кодами відображає ріс.9.9:

Рисунок 9.9 До процедур кодування та декодування

- кодування зводиться до визначення контрольних розрядів ("хвостовика"), які б разом з інформаційною частиною забезпечували приналежність всього кодового блоку до дозволених (тобто таких, що узгоджуються із утворюючою матрицею). Наприклад, для коду парності хвостовик включає всього один розряд xk+1 і його значення повинно приводити весь блок до умови, коли в ньому парне число 1 (математично це означає, що значення xk + 1 визначається як сума mod2 для k інформаційних розрядів);

- декодування означає знаходження так званого "синдрому" помилки. У разі, коли необхідно просто виявити помилку, синдром може складатися з одного розряду. Наприклад, для коду парності синдром z визначається як сума по модулю 2 всіх n отриманих розрядів коду yi. Якщо z=1 (умову парності порушено), це вказує на помилку передачі. Якщо потрібно виправлення, синдром повинен вказати на номери помилкових розрядів. Наприклад, для коду Хеммінга 7,4, який виправляє одноразові помилки, синдром включає 3 розряду і може мати 23 = 8 значень. Сім з них відповідають помилкам в кожному з 7 розрядів блоку, а восьме значення вказує на правильну передачу;

- при кодуванні і декодуванні можуть використовуватися різні математичні процедури, вимоги до яких визначаються сферою застосування коду. Так, для виправлення помилок в оперативній пам'яті комп'ютера доцільно використовувати швидкі операції з векторами, а при послідовній передачі коду по лініях зв'язку - більш повільні, але масштабовані операції з многочленами.

Контрольні питання
1) Використовуючи рис.9.7, поясніть, які існують форми математичного опису коду. Які їх переваги та обмеження.
2) Які коди називають лінійними. Поясніть загальний вигляд лінійних перетворень і їх особливості для двійкових змінних.
3) Поясніть загальну структуру блоку систематичного коду. Чому в даному курсі розглядається саме такий клас кодів.
4) Поясніть поняття утворючої матриці лінійного коду. Яка її загальна структура.
5) Спираючись на рис.9.8, поясніть особливості утворюючих матриць наведених тут кодів. Як за допомогою утворючої матриці можна отримати всі дозволені значення коду.
6) Спираючись на рис.9.9, поясніть поняття кодування і декодування для надлишкових систематичних завадозахисні кодів.


9.4 Код Хеммінга з виправленням поодиноких помилок

Загальна характеристика коду Хеммінга
Код Хеммінга, як ми вже знаємо, використовується для виправлення одноразових помилок в оперативній комп'ютерної пам'яті. На практиці це рішення використовується для серверів, які повинні мати підвищену надійність порівняно із звичайними комп'ютерами. Особливості реалізації такого коду характеризує рис.9.10:

Рисунок 9.10 Загальна характеристика коду Хеммінга

- виходячи з вимоги високої швидкості обробки для коду Хеммінга застосовуються математичний апарат, орієнтований на вектори. Крім того, з урахуванням організації оперативної пам'яті (розряди кодового слова зберігаються тут незалежно) можна виходити з припущення, що помилки в основному поодинокі. Звідси випливає умова sm=1, а значить - dmin= 3. З того ж припущення випливає умова для визначення кількості контрольних розрядів: воно повинно забезпечувати кодування n = k + m можливих позицій помилок, а також тієї ситуації, коли помилки відсутні. Наприклад, якщо k = 32, то буде потрібно m = 6 контрольних розрядів (26 = 64> 32 + 6);

- в основу процедур кодування та декодування покладена умова ортогональності перевірочної матриці коду U. Матриця U будується як ортогональна утворюючій матриці G (умовою ортогональності є рівність нулю скалярних творів всіх рядків цих матриць - см. рис.9.10). Оскільки всі дозволені значення коду Х повинні відповідати утворюючій матриці, вони також будуть ортогональні перевірочній матриці U;

- процедура кодування зводиться до знаходження m контрольних розрядів ("хвостовика") виходячи з m рівнянь ортогональності шуканого вектора X до матриці U - см. рис.9.10. Процедура декодування реалізується через перевірку ортогональности отриманого коду Y до тієї ж перевірочної матриці U. При цьому в розрядах, де ортогональність порушена, замість нульових ми отримали поодинокі значення розрядів zj. У сукупності код Z складе "синдром" помилки, який вказує на позицію спотвореного розряду.

Побудування коду Хеммінга 7,4
Для кращого розуміння розглянемо приклад побудови коду Хеммінга 7,4, включаючи конкретні процедури кодування та декодування (рис.9.11):

Рисунок 9.11 Побудування коду Хеммінга 7,4

- при побудуванні утворюючою матриці G лінійна незалежність рядків забезпечується "діагнальним" розташуванням 1 в лівій квадратної частини матриці. При цьому умова dmin=3 забезпечується вибором значень в правій частині матриці;

- перевірочна матриця U будується з умови ортогональності G при кількості рядків m=3 (для перевірки можна переконатися в ортогональности довільної пари рядків цих матриць). Насправді наведена на рис.9.11 матриця U - лише один з 8 варіантів матриць, які будуть ортогональні G, при цьому будь-який з них міг бути використаний при кодуванні. Однак обраний варіант має деякий додаткову зручність, яке ми оцінимо в подальшому;

- умови ортогональності довільного вектора X до матриці U визначаються, якщо підставити в рівняння ортогональности конкретні значення її елементів. Очевидно, що в рівняння увійдуть тільки ті значення xij, для яких відповідні uij=1 (множення xij на 0 дає нульовий результат);

- рівняння кодування вийдуть, якщо в рівняннях ортогональности невідомі значення контрольних розрядів x5-x7 виразити через відомі значення інформаційних розрядів x1-x4. Це можна зробити, зокрема, підсумовуючи рівняння ортогональности по модулю 2 так, щоб виключати деякі невідомі: наприклад, підсумувавши перше і друге рівняння ортогональности, можна отримати рівняння для розряду x5, першого і третього рівнянь - для розряду x6, а за сумою всіх трьох рівнянь ортогональності висловити значення x7;

- рівняння декодування за структурою відповідають рівнянням ортогональности. Тільки тепер замість вихідних розрядів xij в них братимуть участь отримані в результаті передачі yij. Оскільки останні можуть містити помилки, в правих частинах рівнянь виявляться вже не фіксовані 0, а змінні zj, значення яких утворюють синдром помилки.

Приклад кодування і декодування по Хеммінга
Приклад використання коду Хеммінга 7,4 показаний на рис.9.12:

Рисунок 9.12 Приклад кодування за Хеммінгом

- нехай інформаційні розряди x1 - x4 мають значення 1010;
- використовуючи рівняння кодування, отримаємо значення x5-x7 - 101;
- нехай тепер при передачі виникла помилка в розряді 3. Даний розряд присутній в рівняннях 2 і 3, тому під час декодування буде отримано код z1-z3 = 011;
- отримане значення вектора Z є двійковим кодом номера помилкового розряду 3, що дозволяє виправити помилку в даному розряді.

Відзначимо, що умова "синдром помилки дорівнює бінарного номеру помилкового розряду" в принципі не є обов'язковим. Важливо, що кожне значення синдром однозначно відповідає певному розряду. Однак, збіг з двійковим номером створює додаткову зручність. Його наявність визначається варіантом матриці U (саме тому в даному прикладі використана матриця, показана на рис.9.11).

Звернемо увагу, що значення Z = 011 буде отримано також при одночасному виникненні помилок в розрядах 1 і 2. При цьому код не тільки не виправить їх, але і внесе нову помилку (в розряді 6). Нагадаємо, що в силу організації оперативної пам'яті одночасні помилки в двох різних розрядах кодового слова відбуваються виключно рідко. У зв'язку з цим подібна ситуація при побудові коду не враховується.

Контрольні питання
1) Обгрунтуйте вимоги до коду Хеммінга, виходячи з області його застосування
2) Спираючись на рис.9.10, поясніть що означає термін «ортогональность» і як умова ортогональності використовується при побудові коду Хеммінга.
3) Використовуючи рис.9.11, підтвердіть ортогональность для довільної пари рядків матриць G і U для коду Хеммінга 7,4.
4) Поясніть, яким чином з виду перевірочної матриці U для коду Хеммінга 7,4 виходять рівняння ортогональности.
5) Поясніть як з рівнянь ортогональності виходять рівняння кодування з декодування.
6) Самостійно виконайте приклад кодування і декодування із застосуванням показаних на ріс.9.11 рівнянь. В якості інформаційних розрядів використовуйте двійкового коду свого номера в списку підгрупи виконання лабораторних.
О дисциплине ТИК
Почему «Теория информации и кодирования» - одна из самых интересных дисциплин, которые изучают будущие системщики и защитники информации?

В ней сочетаются золотая классика и самая актуальная современность computer-science.

продолжение
О сайте
Здесь вы найдете материалы, которые помогут в изучении дисциплины “Теория информации и кодирования” (ТИК) в том виде, как она преподается на кафедре ЭВМ ДИИТа.

На сайте размещены методические материалы:
  • электронный конспект лекций;
  • методическое обеспечение к лабораторным работам;
  • полезные ссылки.

продолжение
© 2008-2019 • Теория информации и кодирования
UP