1   2   3   4   5   6   7   8
Ім'я файлу: ТЕОРІЯ АЛГОРИТМІВ.pdf
Розширення: pdf
Розмір: 934кб.
Дата: 04.08.2022
скачати
Алгоритм А1 (пряме обчислення e, f – чотири множення)
MultComplex1 (a, b, c, d; e, f)
e

a*c – b*d
ƒ←
a*d + b*c
Return (e,
ƒ
)
End.
2.
Алгоритм А2 (обчислення e, f за три множення)
MultComplex2 (a, b, c, d; e, f)
z1

c*(a + b)
z2

b*(d + c)
z3

a*(d – c)
e

z1 – z2
ƒ←
z1 + z3
Return (e,
ƒ
)
End.
ƒ
*
=4 операцій
ƒ
±
=2 операцій
ƒ

=2 операцій
ƒ
A1
=8 операцій
ƒ
*
=3 операцій
ƒ
±
=5 операцій
ƒ

=5 операцій
ƒ
A2
=13 операцій

49
Поопераційний аналіз цих двох алгоритмів не є важким (його результати наведені праворуч від запису відповідних алгоритмів).
За сукупною кількістю елементарних операцій алгоритм А2 поступається алгоритму А1, проте в реальних комп'ютерах операція множення вимагає більшого часу, ніж операція додавання.
Чи можна шляхом поопераційного аналізу відповісти на питання: за яких умов алгоритм А2 переважніше алгоритму А1?
Введемо параметри q і r, що встановлюють співвідношення між часом виконання операції множення, додавання і присвоювання для операндів дійсного типу.
Тоді можна привести часові оцінки двох алгоритмів за часом виконання операції складання/віднімання – t +:
t
*
= q*t
+
, q>1;
t

=r*t
+
, r<1.
Тоді приведені до t
+
часові оцінки мають вид:
Т
A1
= 4*q*t
+
+2*t
+
+2*r*t
+
=t
+
*(4*q+2+2*r);
Т
A2
= 3*q*t
+
+5*t
+
+5*r*t
+
=t
+
*(3*q+5+5*r).
Рівняння часів буде досягнуто при умові:
4*q+2+2*r = 3*q+5+5*r, звідси:
q = 3 + 3*r
і відповідно при q > 3 + 3*r алгоритм А2 буде працювати більш ефективно.
Таким чином, якщо середовище реалізації алгоритмів А1 і А2 – мова програмування, обслуговуючий його компілятор і комп'ютер, на якому реалізується завдання, є такими, що час виконання операції множення двох дійсних чисел більш ніж втричі перевищує час складання двох дійсних чисел,
(в припущенні, що r <<1, а це реальне співвідношення), то для реалізації більш кращий алгоритм А2.
Звичайно, виграш у часі дуже малий, якщо ми перемножуємо тільки два комплексних числа, проте, якщо цей алгоритм є частиною складної

50 обчислювальної задачі з комплексними числами, що вимагає суттєво значимого за часом кількості множень, то виграш у часі може бути відчутний.
Оцінка такого виграшу на одне множення комплексних чисел випливає з щойно проведеного аналізу:
∆ T = (q – 3 – 3 * r) * t +
5.5
Питання для самоконтролю
1)
Елементарні операції в псевдомові високого рівня.
2)
Аналіз трудомісткості основних алгоритмічних конструкцій.
3)
Побудова функції трудомісткості для підсумовування матриці.
4)
Побудова функції трудомісткості для задачі пошуку максимуму.
5)
Проблеми при переході від трудомісткості до часових оцінками.
6)
Методики переходу від функції трудомісткості до часових оцінок.
7) Можливості поопераційного аналізу алгоритмів на прикладі задачі множення комплексних чисел.

51
6. ТЕОРІЇ СКЛАДНОСТІ ОБЧИСЛЕНЬ І КЛАСИ
СКЛАДНОСТІ ЗАДАЧ
6.1 Теоретична межа трудомісткості завдання
Розглядаючи деяку задачу, що має алгоритми розв'язку, і аналізуючи один з алгоритмів її вирішення, можна отримати оцінку трудомісткості цього алгоритму в найгіршому випадку – A (D
A
) = O (g (D
A
)). Такі ж оцінки можна отримати і для інших відомих алгоритмів вирішення даної задачі. При дослідженні задачі аналізу алгоритмів виникає питання – а чи існує нижня межа для g(D
A
) і якщо «так», то чи існує алгоритм, що її вирішує з трудомісткістю для найгіршого випадку.
Тобто, яка оцінка складності самого «швидкого» алгоритму розв’язку даної задачі в найгіршому випадку? Очевидно, що це оцінка самої задачі, а не будь-якого алгоритму її рішення. Таким чином, визначення поняття теоретичної нижньої межі трудомісткості завдання в найгіршому випадку має вид:
F
min
= min {
Θ
(F
a
^
(D)) }
Якщо можливо на основі теоретичних міркувань довести існування і отримати функцію оцінки, то можна стверджувати, що будь-який алгоритм, який вирішує дану задачу працює не швидше, ніж з оцінкою Fmin в найгіршому випадку:
F
a
^
(D) =
Ω (F
min
)
Наведемо ряд прикладів:
1)
Задача пошуку максимуму в масиві A = (a
1
, ..., an) – для цього завдання, очевидно, повинні бути переглянуті всі елементи і Fmin = Q(n).
2)
Задача множення матриць – для цього завдання можна зробити припущення, що необхідно виконати деякі арифметичні операції з усіма вхідними даними, теоретичне обґрунтування якої-небудь іншої оцінки на сьогодні не відомо [5], що приводить нас до оцінки Fmin = Q(n
2
).
Відзначимо, що кращий алгоритм множення матриць має оцінку Q (n
2
,
34) [6].
Розбіжність між теоретичною межею і оцінкою кращого відомого алгоритму дозволяє припустити, що або існує, але ще не знайдений більш швидкий алгоритм множення матриць, або оцінка Q (n
2
, 34
) повинна бути доведена, як теоретична межа.

52
6.2 Класи складності задач
На початку 1960-х років, у зв'язку з початком широкого використання обчислювальної техніки для вирішення практичних задач, виникло питання про межі практичної застосовності даного алгоритму розв'язання задачі в сенсі обмежень на її розмірність. Які задачі можуть бути вирішені на ПК за реальний час?
Відповідь на це питання було дано в роботах Кобм (Alan Cobham, 1964), і
Едмондса (Jack Edmonds, 1965), де були введені
класи складності задач.
1)
Клас P (задачі з поліноміальною складністю)
Задача називається поліноміальною, тобто відноситься до класу P, якщо
існує константа k і алгоритм, що вирішує задачу з
F
a
(n) = O (n k
), де n – довжина входу алгоритму в бітах n = |D| [5].
Задачі класу P – це задачі, які вирішуються за реальний час.
Відзначимо переваги алгоритмів з цього класу:
• для більшості задач з класу P константа k менше 6;
• клас P інваріантний до моделі обчислень (для широкого класу моделей);
• клас P має властивість природної замкнутості (сума або добуток поліномів є поліном).
Таким чином, задачі класу P є уточнення визначення «практично вирішуваної» задачі.
2)
Клас NP (задачі, що перевіряються поліноміально)
Нехай деякий алгоритм дає рішення деякої задачі. Чи відповідає отримана відповідь поставленій задачі, і на скільки швидко можна перевірити правильність рішення?
Розглянемо, наприклад, задачу про суму:
Задано N чисел – А = (a
1
, ... an
) і число V.
Треба знайти вектор (масив) X = (x
1
, ..., xn), xi
є {0,1}, такий, що

a
i *
x
i
= V .
Тобто треба визначити, чи може бути представлено число V у вигляді суми будь-яких елементів масиву А.

53
Якщо деякий алгоритм визначає масив X, то перевірка правильності цього результату може бути виконана з поліноміальною складністю: перевірка

a
i *
x
i
= V вимагає не більше Q (N) операцій.
Формально:

D

D
A
, |D|=n поставимо у відповідність сертифікат S

S
A
,
такий, що | S | = O (n l
) і алгоритм As = As (D, S), такий, що він видає « 1 », якщо рішення правильно, і «0», якщо рішення невірно.
Тоді задача належить класу NP, якщо F (As) = O (n m
) [6].
Змістовно задача відноситься до класу NP, якщо її рішення за допомогою деякого алгоритму може бути швидко (поліноміально) перевірено.
6.3 Проблема P = NP
Після введення в теорію алгоритмів понять класів складності Едмондсом
(Edmonds, 1965
) була сформульована основна проблема теорії складності –
Чи вірно твердження P = NP?
Словесне формулювання проблеми має вигляд: чи можна всі задачі, вирішення яких перевіряється з поліноміальною складністю, вирішити за поліноміальний час? [5].
Очевидно, що будь-яка задача, що належить класу P, належить і класу
NP, оскільки вона може бути поліноміально перевірена – задача перевірки рішення може складатися просто в повторному рішенні задачі.
На сьогодні відсутні теоретичні докази як збігу цих класів (P = NP), так і
їх неспівпадання.
Припущення полягає в тому, що клас P є власною підмножиною класу
NP, тобто NP \ P не порожньо – рис 6.1.
Рис 6.1. Співвідношення класів P і NP
P
NP
NP \ P

0

54
6.4
Клас NPC (NPповні задачі)
Поняття NP – повноти було введено незалежно Куком (Stephen Cook,
1971) і Левіним (журнал «Проблеми передачі інформації», 1973, т. 9, вип. 3) і
ґрунтується на понятті зводимості однієї задачі до іншої [5].
Зводимість може бути представлена наступним чином: якщо ми маємо задачу 1 і алгоритм, що вирішує цю задачу і видає правильну відповідь для всіх вхідних даних, що складають задачу, а для задачі 2 алгоритм рішення невідомий, то, якщо можна переформулювати (звести) задачу 2 в термінах задачі 1, то можна вирішити задачу 2.
Таким чином, якщо задача 1 задана множиною конкретних проблем D
A1
, а задача 2 – множиною, і існує функція f s
(алгоритм), що зводить конкретну постановку задачі 2 (D
А2
) до конкретної постановки задачі 1 (D
А1
): f
s
(d
(2)
∈D
A2
) = d
(1)
∈D
A1
, то задача 2 зводиться до задачі 1.
Якщо при цьому F
A
(f s
) = O (n k
), тобто алгоритм зведення належить до класу P, то говорять, що задача 1 поліноміально зводиться до задачі 2 [5].
Прийнято говорити, що задача задається деякою мовою. Тобто якщо задача 1 задана мовою L1, а задача 2 – мовою L2, то поліноміальна зводимість визначається наступним чином:
L2
≤ p
L1.
Визначення класу NPC (NP-complete) або класу NP-повних задач вимагає виконання наступних двох умов: по-перше, задача має належати класу
NP (L
∈ NP),
і, по-друге, до неї поліноміально повинні зводитися всі задачі з класу
NP (L
x

P
L, для кожного L
x
∈ NP), що схематично представлено на рис 6.2.

55
Рис 6.2. Зводимість NP класу і NPC
Для класу NPC доведена наступна теорема:
Якщо існує задача, що належить класу NPC, для якої існує поліноміальний алгоритм розв’язку (F = O (n k
)), то клас P збігається з класом
NP, тобто P = NP [5].
Схема доказу полягає у зведенні будь-якої задачі з NP до даної задачі з класу NPC з поліноміальною трудомісткістю і вирішенні цієї задачі за поліноміальний час (за умовою теореми).
В даний час доведено існування сотень NP-повних задач [5,6], але ні для однієї з них поки не вдалося знайти поліноміального алгоритму рішення.
Крім того дослідники припускають наступне співвідношення класів, показане на рис 6.3.
P
≠ NP, тобто NP \ P ≠ 0, і задачі з класу NPC не можуть бути вирішені (сьогодні) з поліноміальною трудомісткістю.
Рис 6.3. Співвідношення класів P, NP, NPC
NP
NPC
NP
P
NPC

56
6.5 Приклади NP – повних задач
6.5.1 Задача про виконуваність схеми
Розглянемо схему з функціональних елементів «і», «або», «ні» з n бітовими входами і одним виходом, що складається не більше, ніж з O(n k
) елементів – рис 6.4.
Рис 6.4. Абстрактна функціональна схема
Будемо вважати під виконуючим набором значень з множини {0,1} на вході схеми, такий набір входів – значення x1, ..., xn, при якому на виході схеми буде значення «1».
Формулювання задачі – чи існує для даної схеми набір значень входу x1, ..., xn.
Задача належить класу NP – перевірка знайденого набору x1, ..., xn не складніше кількості функціональних елементів, і отже не більше ніж O(n k
).
Це була одна з перших задач, для якої було доведено її NP повнота, тобто будь-яка задача з класу NP поліноміально зводиться до задачі про здійснимість схеми [5].
Вирішення цієї задачі може бути отримано перебором всіх 2n можливих значень входу з подальшою перевіркою на відповідність умові ви- виконуючого набору. У найгіршому випадку доведеться перевірити всі можливі значення входу, що призводить до оцінки F
^
(n) = O(n
k
* 2
n
).
Для цієї, як і для всіх інших NP-повних задач, не відомий поліноміальний алгоритм вирішення.
n
O(n
k
)


57
6.5.2
Задача про суму
Вже розглянута задача про суму також є NP-повною. Відмітимо, якщо кількість доданків фіксована, то складність задачі є поліноміальної, так як:
• для 2-х доданків ⇒ С
N
2
=(N*(N-1))/(1*2) = O(N
2
);
• для 3-х доданків ⇒ C
N
3
=(N*(N-1)*(N-2))/(1*2*3) = O(N
3
).
В загальному випадку доведеться перебирати 2N різних варіантів, оскільки за біноміальною теоремою
(a+b)
N
=

c
N
k
* a
N-k
* b
k
, а при a=b=1,
маємо:
(1+1)
N
=

C
N
k
= 2
N
, отже,
F
A
(N, V) = O(N * 2
N
).
6.5.3
Задача про клік
Нехай дано граф G = G (V, E), де V – безліч з n вершин, а E – безліч ребер. Будемо розуміти під кліком максимальний за кількістю вершин повний підграф на графі в G.
Задача полягає у визначенні кліку в заданому графі G.
Оскільки в повному графі на m вершинах мається m*(m-1)/2 ребер, то перевірка, чи є даний граф повним, має складність O (m
2
).
Якщо ми розглядаємо підграф з m вершинами в графі G з вершинами (m
F(m, n) = O(m
2
* C
n m
) = O(m
2
* n m
).
Однак у загальному випадку доведеться перевіряти всі підграфи з кількістю вершин m = (2, n) на їх повноту і визначити максимальне значення m для якого в даному графі G існує повний підграф, що призводить до оцінки в найгіршому випадку:
F
^
(n) =

O( k
2
* C
n
k
)

O (n
2
* 2
n
)
k

58
6.6
Питання для самоконтролю
1)
Теоретична межа трудомісткості завдання.
2) Основні задачі теорії складності обчислень, поняття реально вирішуваних завдань.
3)
Поняття с класів складності задач, клас Р.
4)
Клас складності NP, поняття сертифіката.
5)
Проблема P = NP, та її сучасний стан.
6)
Зводимість мов і визначення класу NPC.
7)
Приклади NP – повних задач.
8)
Задача про клік та її особливості.

59
7. ПРИКЛАД ПОВНОГО АНАЛІЗУ АЛГОРИТМУ
ВИРІШЕННЯ ЗАДАЧІ ПРО СУМУ
7.1
Формулювання задачі
і
асимптотична оцінка
Словесно задача про суму формулюється як задача знаходження таких чисел з даної сукупності, які в сумі дають задане число. Класично завдання формулюється в термінах цілих чисел [5].
У термінах структур даних мови високого рівня завдання формулюється, як задача визначення таких елементів вихідного масиву S з N чисел, які в сумі дають число V (відзначимо, що задача належить до класу NPC).
Детальне формулювання:
Задано:
Масив S[i], i={1, N} і число V.
Необхідно: Визначити такі S
j
, що

S
j
= V
Тривіальне рішення визначається рівністю V=Sum, де Sum=∑ S
i
, умови
існування рішення мають вид:
Min {S[i], i=1,N}
≤ V ≤ Sum.
Отримаємо асимптотичну оцінку складності рішення даної задачі для алгоритму, що використовує прямий перебір всіх можливих варіантів.
Оскільки вихідний масив містить N чисел, то перевірці на рівність V підлягають такі варіанти рішень:
- V містить 1 доданок ⇒ СN1 = N варіантів;
- V містить 2 доданків ⇒ СN2 = (N * (N-1)) / (1 * 2) варіантів;
- V містить 3 доданків ⇒ CN3 = (N * (N-1) * (N-2)) / (1 * 2 * 3) варіантів;
-
І т.д. до перевірки одного варіанту з N доданками.
Оскільки сума біноміальних коефіцієнтів для ступеня N дорівнює
(1+1)
N
=
∑ C
N
k
= 2
N
і для кожного варіанту необхідно виконати підсумовування (з оцінкою O(N)) для перевірки на V, то оцінка складності алгоритму в гіршому випадку має вигляд:
F
^
A
(N, V) = O(N*2
N
)
(7.1)

60
7.2
Алгоритм
точного
рішення задачі
про суму
(метод
перебору
)
Визначимо допоміжний масив, що зберігає поточне поєднання вихідних чисел в масиві S, що підлягають перевірці на V – масив Х[j], елемент масиву дорівнює «0», якщо число S [j] не входить в V і дорівнює «1», якщо число S
[j] входить до V.
Рішення отримано, якщо
V =

S[j]*
Х[j].
Можуть бути запропоновані наступні дві реалізації механізму повного перебору варіантів:
• перебір за всілякими сполученням з k елементів по N. Тобто спочатку алгоритм намагається представити V як один з елементів масиву S, потім перебираються всі можливі пари, потім всі можливі трійки тощо;
• перебір за допомогою бінарного лічильнику, реалізованому в масиві Х.
Друга ідея алгоритмічно більш проста і зводиться до вирішення задачі про збільшення двійкового лічильника в масиві Хна «1»:
• при 00 ... 0111 збільшення на «1» призводить до скиду всіх правих «1» і установці в «1» наступного самого правого «0»;
• при 00 ... 1000, коли останній елемент лічильника дорівнює «0» збільшення на «1» призводить до переустановлення останнього елемента в масиві Х з «0» в «1».
Розглядаючи масив Х як інформацію про елементи масиву S, що підлягають підсумовуванню в даний момент, треба робити підсумовування і перевірку на рівність V, до тих пір, поки рішення не буде знайдено або ж безрезультатно будуть переглянуті всі можливі варіанти.
Таким чином, алгоритм точного рішення задачі про суму методом прямого перебору має у формальній системі мови високого рівня наступний вигляд:
TASKSUM(S,N,V;
Х,FL)
FL

false
i

1
repeat
Х[i]

0

61
i

i+1
Until i > N
Х[N]

1
Repeat
Sum

0
i

1
Repeat
Sum

Sum + S[i] *
Х[i]
i

i+1
Until i > N
if Sum = V
FL

true
Return (
Х,FL)
j

N
While
Х[j] = 1
Х[j] = 0
j

j-1
Х[j]

1
Until
Х[0] = 1
Return(
Х,FL)

1   2   3   4   5   6   7   8

скачати

© Усі права захищені
написати до нас