Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції з ТСО(1-7).doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2.01 Mб
Скачать

Лекція 5

§5.1. Модеффікція РАМ. Програми, які не розгалужуються.

§5.2. Бітові обчислення.

§5.3. Операції з двійковими векторами.

§5.4. Дерева розв’язань.

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

§5.1. Програми, які не розгалужуються.

Для багатьох задач достатньо обмежитися розгляду класу РАМ-програм, у яких команди розгалуження використовуються лише для того, щоб повторити послідовність команд, причому число повторень пропорційно розміру входу n. У цьому випадку можна “розвернути“ програму для кожного розміру n, копіюючи команди, які повторюються необхідну кількість разів. В результаті послідовність програм, які не розгалужуються (програм без циклів), взагалі кажучи, зростаючої довжини – по одній програмі для кожного значення n.

Приклад 5.1. Розглянемо множення двох цілочислових матриць розміру

n n. В РАМ-програмі число виконання циклу не буде залежати від фактичних значень елементів матриці. Тому можна в значенні корисного спрощення вважати, що допускаються лише такі цикли, у яких перевірка кінця залежить лише від n, тобто від розміру задачі. Наприклад, звичайний алгоритм множення матриць містить цикли, які треба виконати точно n раз, при цьому від команд розгалуження вимагається лише порівняння параметрів циклу з n.

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

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

Усунувши необхідність в командах READ, JUMP, JGTZ й JZERO, ми залишаємося з командами LOAD, STORE, WRITE, HALT й арифметичними операціями із системи команд РАМ. Нам непотрібна команда HALT,оскільки на зупинку вказує кінець програми. Можна обійтися й без WRITE, призначивши в значенні вихідних змінних, певні визначені символічні адреса; виходом програми буде значення, котре приймається цими змінними на закінчення роботи програми.

На кінець, можна “вставити“ LOAD і STORE в арифметичні операції, замінюючи послідовність виду LOAD a

ADD b

STORE c ,на .

Увесь набір команд приграми, яка не розгалужується виглядає так:

,

де x, y i z – символічні адреса (або змінні), а і – постійна. Будь-яку послідовність команд LOAD, STORE й арифметичних операцій в суматорі можна замінити послідовністю, котра складається з п’яти виписаних вище команд.

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

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

Ємнісна складність послідовності програм рівна числу змінних, які приймають участь в програмі, знову як функція від n.

Визначення 4.1. У випадку, коли в значенні моделі обчислень беруться програми, які не розгалужуються, говорять, що дана задача має часову або ємнісну складність , якщо знайдеться послідовність програм для її розв’язання з часовою або ємнісною складністю не більшою для деякої константи с. ( читається так: “порядку кроків, програми, яка не розгалужується“. Індекс А знизу означає “арифметичний“ – це основна характеристика програм, які не розгалужуються.).