Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LB_1.doc
Скачиваний:
3
Добавлен:
09.09.2019
Размер:
206.85 Кб
Скачать

Тема: розробка алгоритму сортування та визначення його часу роботи.

Мета: навчитись аналізувати алгоритми сортування, розробляти їх та визначати час їхньою роботи.

Теоретичні відомості

1.1 Поняття алгоритму

Процес створення комп’ютерної програми для розв’язку певної інженерної задачі складається із наступних етапів:

  • формалізація сформованої задачі;

  • розробка алгоритму розв’язку задачі;

  • написання налагоджування і тестування програми;

  • отримання результату розв’язку задачі на ЕОМ.

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

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

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

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

Задача сортування даних

У багатьох алгоритмах сортування використовується як проміжний крок.

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

Вхід: послідовність чисел .

Вихід: послідовність упорядкованих чисел , для якої .

Для запису алгоритму будемо використовувати псевдокод, у якому оператори наближені до алгоритмічної мови. Процедуру сортування даних назвемо – sort.

sort

1 n=length(A)

2 for j=2 to n

3 key=A(j)

4 i=j-1

5 while i>0 and A(i)>key

6 A(i+1)=A(i)

7 i=i-1

8 if i=0 then break

9 end while

10 A(i+1)=key

12 end for

У процедурі sort прийняті наступні позначення:

  • оператор length визначає розмірність масиву А;

  • оператори, які розміщені між for і end for утворюють тіло циклу;

  • while оператор циклу, виконання якого визначається певною умовою; у процедурі sort це умови i>0 та A(i)>key, які зв’язані логічним оператором and;

  • у рядку 8 використаний умовний оператор if-then-else: якщо змінна i приймає значення нуль, то відбувається вихід із циклу while-end while за допомогою оператора break (відмітимо, що рядок 8 не є обов’язковим у тому випадку, коли певна алгоритмічна мова допускає нульовий індекс масиву);

  • індекс масиву пишеться у круглих дужках. Наприклад, A(i) є i-ий елемент у масиві A.

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

Приклад аналізу алгоритму

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

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

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

Як приклад визначення часу роботи алгоритму розглянемо процедуру sort.

Біля кожного рядка будемо записувати його вартість і число повторних виконань цього рядка. Для кожного від 2 до підрахуємо скільки разів буде виконуватись рядок 5 і позначимо це число через . Відмітимо, що рядки всередині циклу while-end while виконуються на один раз менше, ніж сама умова while i>0 and A(i)>key, оскільки остання перевірка виводить із циклу.

sort

вартість

число раз

1

n=length(A)

1

2

for j=2 to n

3

key=A(j)

4

i=j-1

5

while i>0 and A(i)>key

6

A(i+1)=A(i)

7

i=i-1

8

if i=0 then break

9

end while

10

A(i+1)=key

11

end for

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

.

Час роботи алгоритму sort залежить не тільки від , але й від того який саме масив розміру поданий на вхід алгоритму. Для алгоритму sort найбільш прийнятним є випадок коли початковий масив уже відсортований. Тоді цикл у рядку 5 завершиться зразу ж після першої перевірки, так що всі значення дорівнюють 1, і загальний час роботи алгоритму буде таким:

.

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

,

де коефіцієнти і визначаються вибраними значеннями .

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

.

У нашому випадку – , , і . Аналогічно знаходимо, що .

Таким чином, у найгіршому випадку час роботи алгоритму sort визначимо за формулою

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

.

Тепер час роботи алгоритму має вигляд квадратичної функції

, (1.1)

де ; ; .

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]