Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

11.9.2. Аналіз складності алгоритму

Оцінимо складність алгоритму в термінах С(n), M(n), L(n), де L(n) – число прогонів файла F і n = SizeF.

1.Оцінка L(n).

L(n)= число розділень + число злиттів. Кожне розділення – виклик процедури Partition, а злиття - виклик Merge. Тому L(n) - подвоєне число повторень тіла циклу While. Звідси, оскільки змінна k, що керує циклом, кожний раз збільшується вдвічі, на L-тому кроку k = 2L, і, отже, L - найбільше число таке, що 2L < n, тобто L = [log2 n].

L(n) = 2[log2n]

2.Оцінка С(n).

Порівняння компонент за ключем відбуваються при злитті. Після кожного порівняння виконується процедура Step, яка записує одну компоненту в F. Тому при кожному злитті кількість порівнянь не перевищує n. Звідси C(n)  L(n)*n/2, тобто

С(n)  n [log2 n]

3.Оцінка M(n).

Процедури Partition і Merge пересилають компоненти файлів. Незалежно від значень ключів, виклик кожної з них або читає F, або записує F. Тому M(n) = nL(n), тобто

M(n) = 2n[log2 n]

Отримані оцінки дозволяють класифікувати алгоритм як ефективний алгоритм сортування послідовних файлів. Його також можна адаптувати до сортування масивів.

Алгоритм сортування злиттям може бути поліпшений кількома способами. Розглянемо лише деякі з них:

а. Помітимо (зауважимо), що процедура Partition носить допоміжний характер. Не аналізуючи клю­чів, вона просто формує файли F1 і F2 для злиття. Тому її можна вилучити, якщо проце­дуру Merge примусити формувати не F, а одразу F1 і F2. При цьому, звичайно, кількість файлів у програмі збільшується. Саме:

1.F розділимо на (F1, F2).

2.Визначимо допоміжні файли G1, G2

3.Основний цикл алгоритму:

Злиття (F1, F2) ===> (G1, G2);

Злиття (G1, G2) ===> (F1, F2);

(Непарні пари блоків зливаємо на 1-ий файл, парні - на 2-ий).

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

б. Зауважимо, що на початковій стадії роботи алгоритму розміри блоків малі. Їх можна сортувати в оперативній пам’яті, використовуючи представлення в виді масиву і швидкі алгоритми сортування масивів. Таким чином, треба змінити процедуру FirstPartition, визначив її як процедуру внутрішнього сортування k0-блоків при деякому (максимально можливому) значенні k0. Цикл While основної програми тепер можна починати з k = k0.

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

11.10. Задача корегування файла

Задача корегування файла є одною з основних задач обробки файлів. Розглянемо її формулювання:

Вихідні дані задачі – файл F, що корегується, файл корегувань G. Результат - відкорегований файл H. Будемо вважати, що файл F має тип OurFile. Тоді файл H має той же тип. Файл корегувань G складається з записів з варіантами:

Type

CorСomponent = record

Key: Integer;

job: (Include, Change, Exclude); {включити, змінити, вилучити}

Case job of

Include, Change: Data: String[20];

Exclude: ()

end

End;

CorFile = File of CorComponent;

Var

G : CorFile;

Це значить, що файл корегувань містить компоненти, які треба включити в основний файл, компоненти, які треба вилучити з файла і компоненти, зміст яких треба змінити (з врахуванням змісту як основного файла, так і файла корегувань).

Файл F вважаємо впорядкованим (за ключем), а файл G, взагалі кажучи, ні. Результатом повинен бути упорядкований відкорегований файл Н.

Розв’язок задачі звичайно містить два етапи:

а) Сортування файла корегувань G;

б) Узагальнене злиття файлів F, G у H.

На практиці файл G може бути невеликим. У цьому випадку застосовують внутрішнє сортування. Узагальнений алгоритм злиття робить всі три варіанта обробки файла F за один прогін.

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