47506

Методи стиснення інформації

Другое

Информатика, кибернетика и программирование

Текст складається з досить обмеженої кількості символів. Український алфавіт наприклад складається з 33 літер та невеликої кількості спеціальних символів на кшталт коми тире апострофа и тд. Якщо враховувати всі 256 символів то для не буде різниці в стисканні тестового чи exe файлу. Файл довжиною в 100 байт що має 6 різних символів в собі.

Украинкский

2013-12-12

161.5 KB

6 чел.

Додаток до методичних вказівок

Методи стиснення інформації.

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

КЛЮЧ/повтор/повтор/повтор/

Де під ключем визначена ділянка 110, а символ повторення означає, що на його місці повинен бути той ключ, що й в попередньому. Якщо умовно сказати, що повторення визначається як 1, то вихідний фрагмент перетвориться в : 110111. В результаті з послідовності в 12 біт отримуємо послідовність з 6 біт.

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

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

Далі будуть розглянуті види методів та алгоритмів стиснення(упакування) даних, що необхідні для виконання курсового проекту.

Методи стиснення без втрат.

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

Точний зв'язок між ймовірностями та кодами встановлена в теоремі Шеннона  з кодування джерела, в якій сказано, що елемент Si, ймовірність появи якого дорівнює p(Sj), найвигідніше представляти як   бітами. Якщо при кодування розмір кодів завжди виходить рівним  бітам, то в цьому випадку довжина закодованої послідовності буде мінімальною для всіх можливих способів кодування. Якщо розподілення ймовірностей  незмінне, та ймовірності появи елементів незалежні, то можемо знайти середню довжину кодів як середнє зважене

       (1а)

Це значення також називається  ентропією розподілу ймовірностей F або ентропією джерела в заданий момент часу. Зазвичай ймовірність появи елемента є умовною, тобто залежить від якоїсь події. У цьому випадку при кодуванні чергового елемента Si розподіл ймовірностей F приймає одне з можливих значень , тобто , і, відповідно, .Можна сказати, що джерело знаходиться в стані k, якому відповідає набір ймовірностей  генерації всіх можливих елементів Si. Тому середню довжину кодів можна обчислити за формулою   

      (1б)

де pk – ймовірність того, що F отримає k-те значення, або ймовірність знаходження джерела в стані k.

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

Але в переважній більшості випадків справжня структура джерела не відома, тому необхідно будувати модель джерела, яка дозволила б в кожній позиції вхідної послідовності оцінити ймовірність p(Sj) появи кожного елемента Si алфавіту вхідної послідовності. У цьому випадку ми оперуємо оцінкою q(Si) ймовірності елемента Si. 

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

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

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

Існує 2n різних файлів довжини n біт, де n=0,1,2,…Якщо розмір кожного такого файлу в результаті обробки зменшиться хоч на 1 біт, то 2n вихідним файлам буде відповідати найбільше 2n-1 різних архівних файлів. Тоді принаймні одному архівному файлу буде відповідати декілька різних вихідних, та відповідно, його декодування без втрат інформації неможливе.

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

Канонічний алгоритм Хаффмана.

Використовує тільки частоту появи однакових байт . Стискаючи файл по цьому алгоритму перше , що необхідно зробити – це прочитати файл повністю та порахувати скільки разів зустрічається кожний символ з розширеного набору ASCII. Якщо враховувати всі 256 символів, то для не буде різниці в стисканні тестового чи exe файлу. Після підрахування частоти входження кожного символу, необхідно подивитись таблицю кодів ASCII та сформувати уявну компоновку  між кодами по зменшенню. Тобто не змінюючи місцезнаходження кожного символу з таблиці в пам’яті відсортувати таблицю посилань на них за зменшенням. Кожне посилання з останньої таблиці назвемо «вузлом». в подальшому будемо розміщувати вказівники. які будуть вказувати на цей вузол.

Розглянемо приклад.

Файл довжиною в 100 байт, що має 6 різних символів в собі. Підрахували вхід кожного з символів в файл та отримали наступне:

Символ

A

B

C

D

E

F

Кількість входжень

10

20

30

5

25

10

Беремо ці числа та будемо називати їх частотою входу для кожного символу. Розмістимо таблицю наступним чином:

Символ

C

E

B

F

A

D

Кількість входжень

30

25

20

10

10

5

З останньої таблиці візьмемо символи з найменшою частотою. В нашому випадку це D(5) та один з символів  F або A (10), беремо А.

Сортуємо з вузлів D та А новий вузол, частота входу для якого буде дорівнювати сумі цих двох:

Частота         30    10     5     10     20     25

Символу        C     A     D      F      B      E

                       |     |

                         \     /

                          -----

                            15  = 5 + 10  

Номер в рамці – сума частот символів D та А. Тепер знову шукаємо два символи з найменшими частотами входу. Виключаючи з розгляду D та А й розглядаючи замість них новий вузол с сумарною частотою входу. Найнижча частота тепер у F та нового вузла. Знов зробимо операцію злиття вузлів:

Частота         30    10     5     10     20     25

Символу        C     A     D      F      B      E

                          |        |        |

                          \        /       |

                               -----         |   

                                 15         |

                                    \           /

                                    ---------

                                          |

                                     25  = 10 + 15

Розглядаємо таблицю знову для наступних двох символів (В та Е). В тому самому режимі продовжуємо, доки все дерево не сформовано, тобто поки все не приведеться до одного вузла.

  Частота         30    10     5     10     20     25

  Символу          C     A     D      F      B      E

                  |       |       |        |        |        |

                  |      \        /       |        |        |

                 |        -----         |        |        |

                  |         15          |        |         |

                  |         \             /       \          /

                  |           --------            ------

                  |               25                45   

                  \              /                     |

                -------------                    |

                            55                           |

                                    \   --------------      |

                                    ---| Root (100) |---/

                               --------------

Коли дерево зроблене, можна кодувати файл. Починати потрібно з кореня (Root). Кодуючи перший символ (лист дерева С) простежуємо вверх по дереву всі повороти гілок та якщо робимо лівий поворот. то запам’ятовуємо 0-й біт, та аналогічно 1-й біт для правого повороту. Так для С йдемо в ліво до 55( та запам’ятовуємо 0),потім знову в ліво (0) до самого символу. Код Хоффмана для нашого символу С  - 00. Для наступного символу (А) отримуємо – ліво, право. ліво, ліво, тобто послідовність 0100. Для інших символів отримуємо:

C  

00

( 2 біта )

A

0100

( 4 біта )

D

0101

( 4 біта )

F

011

( 3 біта )

B

10

( 2 біта )

E

11

( 2 біта )

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

Частота

Початкове значення

Ущільнені біти

Зменшено на

C 30

30 * 8 = 20

30 * 2 = 60

180

 A 10

10 * 8 = 80

10 * 3 = 30

50

D 5

5 * 8 = 40

5 * 4 = 20

20

F10

10 * 8 = 80

10 * 4 = 40

40

B 20

20 * 8 = 160

20 * 2 = 40

120

E 25

25 * 8 = 200

25 * 2 = 50

150

Початковій розмір файлу: 100 байт – 800 біт;

Розмір стиснутого файлу : 30 байт – 240 біт;

240 – 30% від 800, стиснення виходить на 70%.

Для того щоб розкодувати необхідно мати декодуючи дерево, так як дерева будуть різні для різних файлів. Таким чином необхідно зберігати дерево з файлом. Це збільшує вихідний файл. В нашому випадку в кожному вузлі знаходиться 4и байти вказівника, тому повна таблиця для 256 символів буде приблизно 1Кбайт довжиною.

Таблиця з прикладу має 5ть вузлів плюс 6 вершин (де знаходяться символи), всього 11. 4 байти  11 разів – 44. Якщо добавити після невелику кількість байтів для збереження місця вузла та іншу статистику – таблиця стане приблизно 50 байтів довжиною. Додамо до 30 байтів стисненої інформації, 50 байтів таблиці, отримуємо загальну довжину архівного файлу 80 байт. Але се одно отримуємо 20% стиснення інформації.

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

Отримаємо:

4 - 2 розрядних коди;

8 - 3 розрядних коди;

16 - 4 розрядних коди;

32 - 5 розрядних коди;

64 - 6 розрядних коди;

128 - 7 розрядних коди;

необхідно ще два 8ми розрядних коди.

У підсумку маємо 256 різних комбінацій якими можна кодувати байт, з яких лише 2 дорівнюють довжині в 8 біт. Якщо скласти число бітів то отримаємо  1554 біти або 195 байтів. Так максимум можна стискати 256 байт до 195, тобто на 33% на рівні байта.

Усі  підрахунки проводились  не для префіксних кодів Хаффмана, тобто кодів, які не можна ідентифікувати однозначно, наприклад, код А – 01010 та код В – 1010. Якщо отримувати ці коди по бітам, то отримавши біти 1010 не можливо виявити код це А чи В тому, що наступний біт може як початком наступного так і продовженням попереднього.

Для побудови префіксних  кодів використовується бінарне дерево.

Алгоритм Хаффмана потребує повторного зчитування вхідного файлу – перший для зчитування частоти входів символів, другий – для кодування.

Арифметичне стиснення.

Класичний варіант алгоритму.

Текст, що кодується, представляється у вигляді дробу, при цьому будується дріб таким чином, щоб текст був якнайкомпактнішим. Розглянемо побудову такого дробу в інтервалі [0, 1) (0-включений, 1- ні). Розбиваємо його на підінтервали з довжинами, рівними ймовірностям появи символів в потоці. Будемо називати їх діапазонами відповідних символів.

Нехай стискається текст «КОВ.КОРОВА» (КОВАРНАЯ КОРОВА). Ймовірності появи кожного символу в тексті ( за зменшенням) та відповідні до них діапазони:

Символ

Частота

Ймовірність

Діапазон

О

3

0.3

[0.0;0.3)

К

2

0.2

[0.3;0.5)

В

2

0.2

[0.5;0.7)

Р

1

0.1

[0.7;0.8)

А

1

0.1

[0.8;0.9)

1

0.1

[0.9;1.0)

Вважаємо, що ця таблиця відома в компресорі та декомпресорі. Кодування складається з зменшення робочого інтервалу. Для першого символу в якості робочого інтервалу задано [0,1). Розбиваємо його на діапазони у відповідності з заданими частотами символів. В якості наступного робочого інтервалу береться діапазон, відповідний поточному символу. Його довжина пропорційна ймовірності появи цього символу в потоці. Далі зчитуємо наступний символ. В якості початкового беремо робочий інтервал,  отриманий на попередньому кроці, та знову розбиваємо його у відповідності з таблицею діапазонів. Довжина робочого інтервалу зменшується пропорційно до ймовірності поточного символу, а точка початку зсувається вправо пропорційно початку діапазону для цього символу. новий побудований діапазон береться в якості робочого і тд.

Використовуючи похідну таблицю діапазонів, кодуємо текст:

Похідний робочий інтервал [0,1).

Символ «К» [0.3;0.5) отримуємо [0.3000;0.5000);

Символ «О» [0.0;0.3) отримуємо [0.3000;0.3600);

Символ «В» [0.5;0.7) отримуємо [0.3300;0.3420);

Символ «.» [0.9;1.0) отримуємо [0.3408;0.3420).

Графічно це можна зобразити наступним чином:

Таким чином, довжина інтервалу буде рівна добутку ймовірностей всіх символів, що зустрічаються, а його початок залежить від порядку слідування символів в потоці. Якщо позначити діапазон символу С як [a[c],b[c]), а інтервал для і-го кодує мого символу потоку як [li, hi), то алгоритм стиснення може бути записаний як:

l0=0; h0=1; i=0;

while(not DataFile.EOF()){

c = DataFile.ReadSymbol(); i++;

li = li-1 + a[c]·(hi-1 - li-1);

hi = li-1 + b[c]·(hi-1 - li-1);

};

Вертикальною лінією на рисунку позначено довільне число. що лежить в діапазоні [li, hi). Для послідовності «КОВ.», що складається з 4х символів, за таке число можна взяти 0.341. Його достатньо, щоб відновити початковий ланцюг, якщо відома початкова таблиця діапазонів.

Розглянемо роботу алгоритму для відновлення ланцюга. Кожний наступний інтервал вкладений в попередній. Тобто , якщо є число 0.341, то першим символом в ланцюзі може бути тільки «К», оскільки тільки його діапазон включає це число. в якості інтервалу береться діапазон «К» - [0.3; 0.5) та в ньму знаходяться діапазон [a[c],b[c]), що включає 0.341. Цей інтервал вибирається в  якості наступного робочого і тд. Алгоритм декомпресії буде мати вигляд:

l0=0; h0=1; value=File.Code();

for(i=1; i<=File.DataLength(); i++){

for(для всех cj){

 li = li-1 + a[cj]·(hi-1 - li-1);

 hi = li-1 + b[cj]·(hi-1 - li-1);

 if ((li  <= value) && (value < hi)) break;

};

DataFile.WriteSymbol(cj);

};

де value – прочитане з потоку число(дріб), а С – символи, що розпаковуються та записуються у вихідний потік. пр. використанні абетки з 256 символів Сі , внутрішній цикл виконується достатньо довго, однак його можна прискорити.

Оскільки b[cj+1]=a[cj] (згідно таблиці діапазонів), то li  для cj+1 дорівнює hi для cj , а послідовність hi для cj строго збільшується з збільшенням j. Тобто кількість операцій у внутрішньому циклі можна скоротити вдвічі, оскільки достатньо перевіряти тільки одну межу інтервалу. Також, якщо мало символів, то, відсортувавши їх за зменшенням ймовірностей, зменшуємо число ітерацій циклу. Першими перевірятися символи з найбільшою ймовірністю, в прикладі з ймовірністю 1\2 будемо виходити з циклу вже на другому символі з шести. Якщо кількість символів велика, існують інші методи прискорення пошуку символів( наприклад, бінарний пошук).

Ще швидше буде працювати алгоритм, що оперує двійковими дробами. Дріб задається як

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

Розглянутий алгоритм може стискати інформацію тільки коротких ланцюгів із-за обмежень розрядності усіх змінних. Реальний алгоритм працює з цілими числами та оперує дробами, чисельник та знаменник якого є цілими числами ( наприклад, знаменник =10000h = 65536). При цьому з втратою точності борються, відстежуючи зближення то li  та  hi та помножуючи чисельник та знаменник дробу, що їх представляє, на якесь число (найчастіше на 2). З переповненням можна боротися, записуючі старші біти в то li  та  hi в файл, тоді, коли вони предстануть змінюватись( тобто не приймають участі в уточненні інтервалу). Таблиця діапазонів буде виглядати наступним чином:

J

Символ (cj)

Частота

b[cj ]

0

0

1

О

3

3

2

К

2

5

3

В

2

7

4

Р

1

8

5

А

1

9

6

""

1

10

Алгоритм стиснення, використовуючи цілочисельні операції. Мінімізація втрат за точністю буде завдяки тому, що довжина цілочисельного інтервалу завжди не менше половини всього інтервалу. Коли li  або  hi наближаються до середини інтервалу, залишаючись при цьому по різні боки від його середини, то також збільшується інтервал бо записуються біти умовно, тобто реально ці біти виводяться у вихідний пізніше, коли стає відомо їх значення. Процедура зміни значень li  та  hi  називається нормалізацією, а вивід відповідних бітів – переносом. Знаменник дробу в приведеному нижче алгоритмі буде дорівнювати 10000h = 65536, тобто максимальне значення h0=65536.

l0=0; h0=65535; i=0; delitel= b[clast]; // delitel=10

First_qtr = (h0+1)/4;    // = 16384

Half = First_qtr*2;     // = 32768

Third_qtr = First_qtr*3;// = 49152

bits_to_follow =0;      // Сколько битов сбрасывать

while(not DataFile.EOF()) {

c = DataFile.ReadSymbol();  // Читаем символ

j = IndexForSymbol(c); i++; // Находим его индекс

li = li-1 + b[j-1]*(hi-1 - li-1 + 1)/delitel;

hi = li-1 + b[j  ]*(hi-1 - li-1 + 1)/delitel - 1;

for(;;) {          // Обрабатываем варианты

 if(hi < Half)    // переполнения

  BitsPlusFollow(0);

 else if(li >= Half) {

  BitsPlusFollow(1);

  li-= Half; hi-= Half;

 }

 else if((li >= Third_qtr)&&(hi < First_qtr)){

  bits_to_follow++;

  li-= First_qtr; hi-= First_qtr;

 } else break;

 li+=li; hi+= hi+1;

}

}    

          // Процедура переноса найденных битов в файл

void BitsPlusFollow(int bit)

{

CompressedFile.WriteBit(bit);

for(; bits_to_follow > 0; bits_to_follow--)

 CompressedFile.WriteBit(!bit);

}

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

l0=0; h0=65535; delitel= b[clast];

First_qtr = (h0+1)/4;     // = 16384

Half = First_qtr*2;      // = 32768

Third_qtr = First_qtr*3; // = 49152

value=CompressedFile.Read16Bit();

for(i=1; i< CompressedFile.DataLength(); i++){

freq=((value-li-1+1)*delitel-1)/(hi-1 - li-1 + 1);

for(j=1; b[j]<=freq; j++);   // Поиск символа

 

li = li-1 + b[j-1]*(hi-1 - li-1 + 1)/delitel;

hi = li-1 + b[j  ]*(hi-1 - li-1 + 1)/delitel - 1;

for(;;) {          // Обрабатываем варианты

 if(hi < Half)    // переполнения

  ; // Ничего

 else if(li >= Half) {

  li-= Half; hi-= Half; value-= Half;

 }

 else if((li >= Third_qtr)&&(hi < First_qtr)){

  li-= First_qtr; hi-= First_qtr;

  value-= First_qtr;

 } else break;

 li+=li; hi+= hi+1;

 value+=value+CompressedFile.ReadBit();

}

DataFile.WriteSymbol(c);

};

Для того щоб оцінити ступінь стиснення арифметичним методом конкретного рядка, необхідно знайти мінімальне число N, таке, щоб довжина робочого інтервалу при стиснені останнього символу ланцюга була не менше 1/2N . Цей критерій означає, що в середині інтервалу заздалегідь знайдеться хоча б одне число, в двійковому представленні якого після N-го знаку будуть тільки 0. Довжина інтервалу дорівнює добутку ймовірностей всіх символів.


 

А также другие работы, которые могут Вас заинтересовать

10663. Решение задач линейного программирования 708 KB
  Лабораторная работа 13 Решение задач линейного программирования. Цель работы. Научиться решать одну из задач оптимизации: исходя из конкретной ситуации составить совокупность линейных ограничений в виде системы неравенств а также функцию цели. Для этой фун
10664. Решение задач нелинейного программирования 325.5 KB
  Лабораторная работа 14 Решение задач нелинейного программирования. Цель работы. Научиться решать одну из задач оптимизации: исходя из конкретной ситуации составить совокупность линейных или нелинейных ограничений в виде системы неравенств ...
10665. Разработка комбинационных схем 145 KB
  Лабораторная работа №1 Разработка комбинационных схем Цель работы – приобретение навыков по составлению таблиц истинности записи логических функций минимизации логических функций и составлению комбинационных схем из простейших логических элементов. Кратки
10666. Исследование логических элементов 1.35 MB
  Лабораторная работа №2 Исследование логических элементов Цель: исследование поведения основных логических элементов при подаче на них двоичных потенциальных сигналов. Общие положения 1. Описание универсального стенда В стенде размещаются бло...
10667. Исследование комбинационных устройств и знакового индикатора 3.01 MB
  Лабораторная работа №3 Исследование комбинационных устройств и знакового индикатора Цель: исследование мультиплексора демультиплексора дешифратора знакового индикатора. Работа выполняется на сменной плате П4. Общие положения. Совместно мультиплексор и...
10668. Исследование регистров. Описание сменных плат П2 и П3 1.02 MB
  Исследование регистров Цель: исследование режимов работы регистров составленных из триггеров или выполненных на ИМС. В работе ис пользуются сменные платы П1 и П2. Описание сменных плат П2 и П3 С помощью сменной платы П2 исследуются рег
10669. Моделирование структуры системы (Диаграмма классов) 776.5 KB
  Практическая работа №2 Моделирование структуры системы Диаграмма классов Цель работы: изучение диаграммы классов ее основных элементов классов атрибутов операций обязанностей. Изучение отношений между элементами углубленное изучение отношения ассоциации имя...
10670. Моделирование динамики системы: временной аспект и структурная организация (Диаграмма взаимодействия) 230 KB
  Практическая работа № 34 Моделирование динамики системы: временной аспект и структурная организация Диаграмма взаимодействия Цель работы: изучение диаграмм взаимодействия: последовательностей и кооперации их семантическая эквивалентность. Типичные приемы модел...
10671. Моделирование динамики системы: потоки управления (Диаграмма состояний) 703 KB
  Практическая работа №5 Моделирование динамики системы: потоки управления Диаграмма состояний Цель работы: изучение понятий автомат состояние переход диаграммы состояний. Приобретение основных навыков построения диаграмм состояний в программной среде StarUML. Для