У чому відмінність кодів. Передача інформації з технічних каналів зв'язку. Проблема стиснення даних

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

Константа - це та, яка не змінює своє значення під час виконання програми. Він представлений способом, описаним для кожної категорії. Змінні - це ті, які можуть змінювати їх значення під час виконання програми. Їх уявлення дається через зазвичай числові букви і символи, яким присвоєно значення.

Якщо оператор з'являється в розділі «Оголошення» модуля, змінна може використовуватися тільки в цій процедурі. Щоб ця змінна була доступна для всіх процедур проекту, спочатку повинна бути відкрита публічна інструкція, як показано в наступному прикладі. Ви можете оголосити кілька змінних в одній інструкції. Щоб вказати тип даних, ви повинні вказати тип даних для кожної змінної.

У восьмирозрядного таблиці символьної кодування (наприклад, ASCII) кожен символ кодується вісьмома бітами і, отже, займає в пам'яті 1 байт. У розділі 1.3 нашого підручника розповідалося про те, що частота народження різних букв (знаків) у тексті різна. Там же було показано, що інформаційний вага символів тим більше, чим менше його частота народження. З цією обставиною і пов'язана ідея стиснення тексту у комп'ютерній пам'яті: відмовитися від кодування всіх символів кодами однакової довжини. Символи з меншим інформаційним вагою, тобто часто зустрічаються, кодувати більш коротким кодом в порівнянні з рідше зустрічаються символами. При такому підході можна істотно скоротити обсяг загального коду тексту і, відповідно, місця, займаного їм у пам'яті комп'ютера.

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

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

Такий підхід відомий давно. Він використовується в широко відомої азбуки Морзе, кілька кодів якій наведено в табл. 3.1, де "точка" кодується нулем, а "тире" - одиницею.

Таблиця 3.1

Літера

Як видно з цього прикладу і табл. 3.1, частіше зустрічаються букви мають більш короткий код.

Додаток буде більш ефективним, якщо воно оголосить змінні явно і з певним типом даних. Явна оголошення всіх змінних зменшує частоту помилок, пов'язаних з помилками номенклатури і орфографічними помилками. Ця інструкція вимагає, щоб ви явно оголошували всі змінні в модулі. Майте на увазі, що цей параметр не змінює існуючий код, який ви написали. Фіксовані масиви і динамічні масиви повинні бути оголошені явно. Якщо ви використовуєте програму для управління об'єктами з іншої програми необхідно встановити посилання на бібліотеку типів іншої програми.

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

А як бути з комп'ютерної кодуванням, де використовується двійковий алфавіт? Одним з найпростіших, але дуже ефективних способів побудови кодів різної довжини, що не вимагають спеціального роздільник, є алгоритм Д.Хаффмена (D.A. Huffman, 1952 г.). За допомогою цього алгоритму будується двоичное дерево, яке дозволяє однозначно декодувати двійковий код, Що складається з символьних кодів різної довжини. Двійковим називається дерево, з кожної вершини якого виходять дві гілки. на мал.3.2 наведено приклад такого дерева, побудованого для алфавіту англійської мови з урахуванням частоти народження його букв. Отримані, таким чином, коди можна звести в таблицю.

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

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

Таблиця 3.2

Літера

код Хаффмена

За допомогою табл. 3.2 легко кодувати текст. Так, наприклад, рядок з 29 знаків

Синтаксис константного ідентифікатора однаковий для ідентифікатора змінної: він повинен починатися з літери або підкреслення і містити літерні, числові або підкреслюють символи. Константа не може змінити її значення через призначення або бути оголошена знову під час роботи скрипта.

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

WENEEDMOR ESNOWFORBE TTERSKIING перетворюється в код: 011101 100 1100 100 100 +110110001111101011100 ВОНО 1100 1110 011101 01001 1110 1011 011100 100 001001 100 10110110 110100011 1010 1010 1100 00001, який при розміщенні його в пам'яті побайтно набуде вигляду:

01110110 01100100 10011011 00011111 01011100 01101100 11100111 01010011 11010110 1110010000100110 01011011 01101000 11101010 10110000 001

Таким чином, текст, який займає в кодуванні ASCII 29 байт, в кодуванні Хаффмена займе лише 16 байт.

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

Додаткові коми в упорядкованих літералах

Літеральна сортування - це тип ініціалізатор об'єкта. Розділ «ініціалізатор об'єктів». Крім того, літерал, який використовується в функції, створюється кожен раз, коли викликається функція. Літературні ординати також є об'єктами масиву. У розділі Об'єкт масиву. Немає необхідності вказувати всі елементи впорядкованого литерала. Якщо в стовпці поміщаються дві коми, сортування створюється з пробілами для невказаних елементів. У наступному прикладі показана риба упорядкування.

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

Це впорядкування має два елементи зі значеннями і порожній елемент. Якщо остання кома вставлена ​​в кінець списку елементів, кома ігнорується. У наступному прикладі довжина сортування дорівнює трьом. Всі інші коми в списку вказують на новий елемент.

Тільки остання кома ігнорується. Цілі числа можуть бути виражені в десяткового, шістнадцятковій і вісімковій. Литеральное десяткове ціле складається з послідовності цифр без нуля на початку. Октальной цілі числа можуть включати тільки 0 цифр. Деякі приклади цілих чисел.

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

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

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

Нижче наведено приклад литерала. Крім того, ви можете використовувати числовий або строковий літерал для імені властивості або вкладеного об'єкта всередині іншого. Наступний приклад використовує ці параметри. Літеральна рядок - це нуль або більше символів, взятих в подвійні або одинарні лапки. Рядок повинен бути розділена лапками того ж типу; тобто або одинарні лапки, або дві подвійні лапки. Нижче наведені приклади строкових літералів.

Короткопро головному

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

Ідея способу стиснення тексту: довжина коду символу зменшується зі зменшенням його інформаційного ваги, тобто зі збільшенням частоти виникнення в тексті.

Використання спеціальних символів в рядках

На додаток до звичайних символів ви також можете включати спеціальні символи в рядки, як показано в наступному прикладі. Для символів, не зазначених в таблиці 1, попередня зворотна коса риса ігнорується, але це використання застаріло і його слід уникати.

Ви можете вставити мітку лапки всередині рядка, вказавши її зворотну косу риску. Це відомо як вихід з лапки. Щоб включити буквальну зворотну косу риску всередині рядка, ви повинні уникнути символу зворотної косої межі. Ви також можете уникнути розривів рядків, пропускаючи їх зворотну косу риску. Зворотна коса риска і розрив рядка видаляються з значення рядка.

Алгоритм стиснення по Хаффмену представляється у вигляді двійкового дерева.

Архіватори, що використовують алгоритм Хаффмена, будують своє двійкове дерево кодування для кожного тексту.

Запитання і завдання

    У чому відмінність кодів постійної і змінної довжини?

    За рахунок чого коди змінної довжини дозволяють "стискати" текст?

    Він охоплює мови Америки, Європи, Близького Сходу, Африки, Індії, Азії і Тихого океану, а також історичні сценарії і технічні символи. Він сподівається вирішити проблеми інтернаціоналізації багатомовних обчислень, такі як різні національні стандарти характеру. Проте, не всі сучасні або архаїчні сценарії підтримуються в даний час. Він використовує чисельне значення і ім'я для кожного символу.

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

    Закодуйте за допомогою ASCII-кодів і кодів Хаффмена наступний текст: HAPPYNEWYEAR. Підрахуйте в обох випадках необхідний обсяг пам'яті.

4. розкодує за допомогою двійкового дерева (см.рисунок) наступний код:

11110111 10111100 00011100 00101100 10010011 01110100 11001111 11101101 001100

Двійкове дерево алфавіту англійської мови, що використовується для кодування методом Хаффмена

Ви можете використовувати публічний оператор для оголошення загальнодоступних змінних рівня модуля. Якщо публічна змінна оголошується в стандартному модулі або модулі класу, її також можна використовувати у всіх проектах, що відносяться до проекту, в якому оголошена змінна. Приватні змінні можуть використовуватися тільки в тому ж модулі.

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

Перше правило побудови кодів зі змінною довжиною цілком очевидно. Короткі коди слід привласнювати часто зустрічається символам, а довгі рідкісним. Однак є інша проблема. Ці коди треба призначати так, щоб їх було можливо декодувати однозначно, а не двозначно. Маленький приклад прояснить це.

Розглянемо чотири символи і. Якщо вони з'являються в послідовності даних з однаковою ймовірністю (кожна), то ми їм просто дамо чотири двухбітовий коду 00, 01, 10 і 11. Всі ймовірності рівні, і тому коди змінної довжини НЕ стиснуть ці дані. Для кожного символу з коротким кодом знайдеться символ з довгим кодом і середнє число бітів на символ буде не менше 2. Надмірність даних з рівноімовірними символами дорівнює нулю, і рядок таких символів неможливо стиснути за допомогою кодів змінної довжини (або будь-яким іншим методом).

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

Увімкніть ім'я бібліотеки типів в оголошення змінної, як в цьому прикладі. Документацію до додатка. Ім'я - це слово, яке використовується для позначення значення, що міститься в змінної. Тип вказує, які дані можуть бути збережені змінної: - набір граничних значень; - Оператори та вбудовані функції, які можуть бути застосовані до елементів набору значень. Для змінних ми можемо розглядати як область пам'яті, яка використовується для зберігання невідомого значення. Крім того, розробник не повинен чітко вказувати місце зберігання даних. Він вказує тільки ім'я, пов'язане з цією областю пам'яті. Адреса для цього місця визначається так званим ім'ям. Наприклад, давайте створимо програму відстеження для продажу деякого товару. Ціна в день може бути різною, так як вона визначається ринковими умовами. Кількість проданих товарів також може бути різним. Іншими словами, ціна і кількість невідомі в майбутньому. Тому для їх подання будуть використовуватися змінні. Кожен раз, коли програма запускається, користувач надає значення для цих змінних. Змінні дозволяють виконувати обчислення, не знаючи фактичних значень заздалегідь. Змінні правила іменування змінні правила іменування досить вільні. Можна використовувати одну букву, і ім'я може бути довгим і описовим. Однак існують деякі обмеження:  почати з букви; Мати максимальну довжину 255 символів; містити тільки букви, цифри і символ підкреслення  бути унікальним в межах поля зору - процедура форми або модуля;  Не використовуйте зарезервовані слова. Автоматично перетворює рядкові і заголовні букви в імена, щоб вони відповідали останнього запису. В якості додаткового ради можна взяти до уваги наступне: використовувати досить описові імена, але в той же час максимально короткі, щоб прискорити запис і читання коду. Хоча підтримуються символи кирилиці, переважно не використовувати імена змінних через можливість проблем з переходом програм на деякі комп'ютерні системи. Змінна може зберігати число, текстовий рядок, копію об'єкта. Вимоги до пам'яті важливі для оптимізації створеного коду. Щоб зберегти системні ресурси, нам потрібно використовувати більш компактні змінні. Також згадуються суфікси декларації, використовувані в неявній декларації. Тип варіанту може містити будь-яку інформацію. Тому він підходить для ситуацій, коли змінна повинна приймати значення іншого типу. Також зручно, щоб змінні не оголошували, коли додаток або прототип швидко розробляються. Тому хороший стиль програмування передбачає оголошення змінних перед їх використанням. Можна бачити, що кілька змінних, розділених комою, можуть бути оголошені одним оператором. Тип змінної не потрібно. Якщо не вказано, приймається тип варіанту за замовчуванням. Зверніть увагу, що при оголошенні декількох змінних в одному рядку кожен повинен вказувати тип. Рядки фіксованою довжини мають сталу суму, що не залежить від інформації, що зберігається. Якщо для такого рядка присвоюється значення меншої довжини, відсутні символи заповнюються пробілами. Якщо довжина більше - надлишкові символи відкидаються. У разі неявного оголошення змінних, призначення значення може бути чи не бути зроблено. Присвоєння значення не може бути виконано поза процесом. Порушення вищевказаних вимог призводить до появи повідомлення про помилку. Це запобігає використанню змінної, яка була визначена, але випадково має неправильне ім'я при її використанні. Видимість змінних Кожна змінна і іменована константа в програмі мають свою власну область. Ця область визначає видимість змінної або іменованої константи в різних частинах програмного коду. Модулі - це файли з розширенням. Модуль модуля модуля глобального модуля Глобальні змінні видно для всіх процедур в формах і модулях у всьому проекті. У цьому випадку використовується термін «затінення». Кажуть, що глобальні змінні затьмарені локальними однойменними іменами. Якщо процедура виконується з іншої форми або модуля, буде використовуватися глобальна змінна. Тривалість змінних. Довжина існування змінної визначає, як довго ця змінна буде містити пам'ять. Коли процедура завершена, всі її локальні змінні видаляються з пам'яті, залишаючи місце для локальних змінних в наступній процедурі. Наступного разу, коли буде виконана одна і та ж процедура, його локальні змінні будуть заново створені, а їх значення будуть ініційовані 0 або символом нового рядка. У багатьох випадках корисно і навіть бажано форматувати локальні змінні при кожному виконанні процедури. Іноді, однак, необхідно зберігати значення цих змінних навіть після завершення процедури для використання при наступному виконанні тієї ж процедури. Це можна зробити, якщо змінні оголошені статичними. Статичні змінні зберігають свої значення при виході з процедури і відновлюють її в наступному прогоні. Оголошувати локальні змінні на рівні модуля форми для зберігання: ім'я та адреса компанії, кількість працюючих в ній, дату її створення, вага продукту, проданого за рік, його річний прибуток, незалежно від того, чи є він членом Асоціації компаній своїм кількість членів Правління. Використовуйте відповідні типи, що вимагають мінімального обсягу пам'яті. Демонстрація роботи з локальними і глобальними змінними і затінення. Якщо ця процедура не запущена, використовується значення за замовчуванням. Ця процедура демонструє використання глобальної змінної в разі, якщо вона не затінена локальними змінними, 6 з 6.

  • ТИП ДАНИХ І ДЕКЛАРАЦІЯ ДАНИХ.
  • Змінні мають ім'я і тип даних.
Текст написаний в злегка професійному стилі, і новачкам не потрібно його повністю розуміти.

Припустимо тепер, що ці чотири символи з'являються з різними можливостями, зазначеними в табл. 1.2, тобто з'являється в рядку даних в середньому майже в половині випадків, і мають рівні ймовірності, а виникає вкрай рідко. В цьому випадку є надмірність, яку можна видалити за допомогою змінних кодів і стиснути дані так, що буде потрібно менше 2 біт на символ. Насправді, теорія інформації говорить нам про те, що найменше число необхідних біт на символ в середньому дорівнює 1.57, тобто, ентропії цього безлічі символів.

імовірність

Табл. 1.2. Коди змінної довжини.

У табл. 1.2 запропонований код Code1, який присвоює самому часто зустрічається символу найкоротший код. Якщо закодувати даний за допомогою Code1, то середнє число біт на символ дорівнюватиме. Це число дуже близька до теоретичного мінімуму. Розглянемо послідовність з 20 символів

в якій чотири символи з'являються, приблизно, з зазначеними частотами. Цією рядку буде відповідати кодова рядок коду Code1 довжини 37 біт

яка для зручності розділена рисками. Нам знадобилося 37 бітів, щоб закодувати 20 символів, тобто, в середньому 1.85 біт / символ, що не дуже далеко від обчисленої вище середньої величини. (Читач повинен мати на увазі, що цей рядок вельми коротка, і для того щоб отримати результат, близький до теоретичного, необхідно взяти вхідний файл розміром кілька тисяч символів).

Однак, якщо ми тепер спробуємо декодувати цю двійкову послідовність, то негайно виявимо, що Code1 абсолютно не придатний. Перший біт послідовності дорівнює 1, тому першим символом може бути тільки, так як ніякий інший код в таблиці для Code1 починається не з 1. Наступний біт дорівнює 0, але коди для і все починаються з 0, тому декодер повинен читати наступний біт. Він дорівнює 1, однак коди для і обидва мають на початку 01. Декодер не знає, як йому вчинити. Чи то декодувати рядок як, тобто,, то чи як, тобто. Причому зауважимо, що подальші біти послідовності вже не допоможуть виправити становище. Код Code1 є двозначним. На відміну від нього, код Code2 з табл. 1.2 дає при декодуванні завжди однозначний результат.

Code2 має одну важливу властивість, яке робить його краще, ніж Code1, яке називається властивістю префікса. Це властивість можна сформулювати так: якщо деяка послідовність бітів обрана в якості коду якогось символу, то жоден код іншого символу не повинен мати на початку цю послідовність (не може бути префіксом, тобто, приставкою). Раз рядок «1» вже обрана в якості цілого коду для, то жоден інший код не може починатися з 1 (тобто, вони всі повинні починатися на 0). Раз рядок «01» є кодом для, то інші коди не повинні починатися з 01. Ось чому коди для і повинні починатися з 00. Природно, вони будуть «000» і «001».

Значить, вибираючи безліч кодів змінної довжини, необхідно дотримуватися два принципи: (1) слід призначати більш короткі коди частіше зустрічається символам, і (2) коди повинні задовольняти властивості префікса. Дотримуючись ці принципам, можна побудувати короткі, однозначно Декодовані коди, але не обов'язково найкращі (тобто, найкоротші) коди. На додаток до цих принципів необхідний алгоритм, який завжди породжує безліч найкоротших кодів (які в середньому мають найменшу довжину). Вихідними даними цього алгоритму повинні бути частоти (або ймовірності) символів алфавіту. На щастя, такий простий алгоритм існує. Він був придуманий Давидом Хаффманом і називається його іменем. Цей алгоритм буде описаний в § 1.4.

Слід зазначити, що не тільки статистичні методи компресії використовують коди змінної довжини при кодуванні індивідуальних символів. Чудовим прикладом служать арифметичні коди, про які буде розказано в § 1.7.

gastroguru © 2017