View
4.575
Download
4
Category
Preview:
Citation preview
Хороший, поганий, повільний
Види алгоритмів. Поняття складності алгоритму
Основи програмування мовою Python, лекція 8 Київ, 2015
Будь-яка задача має як мінімум 2 розв'язки
x = aa = bb = x
a = a+bb = a-ba = a-b
простіше
швидше
менше зміннихбільше змінних
повільніше
Простибоженко Солоха Ореївна 14 350 12312312312312 1965
Квітка Ганна Казимирівна 7 500 23423423423423 1978
Всі прізвища є вигаданими, будь-яке співпадіння з реальними особами є випадковим :-)
Лютий Краснояр Даромирович 8 900 34343434343434 1985
Мамай Милорада Любомирівна 8 600 53454756342109 1982
Безіменко Любомир Добромудрович 6 800 78328943905402 1976
Розбийніс Златозар Радиборович 8 600 74836732902100 1970
Яховайко Дарислава Гудимирівна 10 200 11567567567211 1971
Варіант №1
11
11
xNxM1
~ 4*N*M + M операцій
Варіант №2
~ 4*N*log2NM
~ 4*N*log2N + M операцій
4*N*M + M 4*N*log2N + M
4*N*M + M 4*N*log2N + M
4*N*M 4*N*log2N
M log2N
при M=6 ~ однакова кількість операцій
при M>6 2й варіант ефективніший
при M<6 1й варіант ефективніший
нехай N=64, тоді:
M
так як робиться 1 раз,швидкість несуттєва
1
<N1
Варіант №3
Обчислювальна складність —поняття теорії алгоритмів, що позначає функцію залежності обсягу роботи алгоритму від об'єму вхідних даних
f(n), де n – об'єм вхідних даних
3 прочитати дані поточного об'єкту прочитати дані "найкращого" об'єкту порівняти
1
0 або M в середньому М/2 порівнянь, для кожного необхідно ще прочитати поле, тобто 2*М/2 (якщо 1-ша умова хибна, сюди не потрапимо)
~4
0 або 1 (якщо умови хибні, сюди не потрапимо)
N повторів
f(n) = (4 + M)*N + 5
графік y = (4+M)*N
+5
3 прочитати дані поточного об'єкту прочитати дані "найкращого" об'єкту порівняти
1
0 або M в середньому М/2 порівнянь, для кожного необхідно ще прочитати поле, тобто 2*М/2 (якщо 1-ша умова хибна, сюди не потрапимо)
~4
0 або 1 (якщо умови хибні, сюди не потрапимо)
N повторів
f(n) = (4 + M)*N + 5f(n) = 3*N + 5 + M
графік y = 3*N+5+M
y = f(n) = (4+M)*N
+5
значить: функція, що залежить від n
f(n) ϵ O(n)
Асимптотична складність – поняття, що позначає рівень зростання обсягу роботи алгоритму з ростом об'єму вхідних даних
– лінійна
значить: функція, що залежить від n
y = f(n) = 5
f(n) ϵ O(k) – константна
f(n) ϵ O(log n) – логарифмічна
y = f(n) = log N
Бінарний пошук
20 21 23 30 38 44 55 64 66 77 79 82 90 9755<64
знайти 64:
< < < < < < < < < < < < <
64 66 77 79 82 90 9779>64
64 66 7766>64
64SUCCESS!!!f(n) = log2n
бінарний пошук на python
генерація випадкової відсортованої
послідовності
сам пошук
y = f(
n) = n
2
y =
f(n) =
n3
y =
f(n)
= n
4 поліноміальні:
f(n) ϵ O(n2)f(n) ϵ O(n3)f(n) ϵ O(n4) ...
2x4 + 5x3 + 3x2 + 4x
бульбашкове сортування
(bubble sort)
найпростіший код,
але найменш ефективне
для сортування послідовності
вимагає порядку n2 операцій
"швидке" сортування
(quicksort)
для сортування послідовності
вимагає порядку n*log2n операцій
реалізоване як вбудована функція
в більшості мов програмування
y =
f(n) =
2n
y =
f(n)
= 3
n
y =
f(n)
= 4
nекспоненціальні:
f(n) ϵ O(2n)f(n) ϵ O(3n)f(n) ϵ O(4n) ...
Підбор паролю
abcdefghijklmnopqrstuvwxyz
26n комбінацій
?????? (n=6)
266 = 308 915 776 = 308 916 секунд = 5 148.6 хвилин = 85.8 годин = 3.6 днів
2610 = 141 167 095 653 376 = 141 167 095 653 секунд = 2 352 784 927.5 хвилин = 39 213 082 годин = 1 633 878 днів = 4 000 років
?????????? (n=10)
Підбор паролю
abcdefghijklmnopqrstuvwxyz
26n комбінацій
?????? (n=6)
266 = 308 915 776 = 308 916 секунд = 5 148.6 хвилин = 85.8 годин = 3.6 днів
2610 = 141 167 095 653 376 = 141 167 095 653 секунд = 2 352 784 927.5 хвилин = 39 213 082 годин = 1 633 878 днів = 4 000 років
?????????? (n=10)• перебір з використанням словників
• імітація форми входу
• використання особистих даних для
відновлення паролю
та ін.
Задача про 8 ферзів
8х8 = 64 поля
4 426 165 368 комбінацій
розстановки ферзів
Не намагайтеся повторити це вдома
Як мінімум,
з перебору
слід виключити
зовсім безглузді варіанти
див. example8_1.py
Перша оптимізація
оскільки кожний ферзь
"пробиває" до кінця
вертикалі та горизонталі,
їх можна одразу
розподілити по 1 на лінії
і перебирати
лише 1 координату
див. example8_3.py
Перебір з поверненням (backtracking)
якщо на будь-якому
етапі перебору хоч 1 фігура
займає погану позицію,
всі наступні варіанти,
які її включають, також
будуть завідомо погані
тому ефективніше
повернутися на крок назад
і переставити цю фігуру,
одразу відкинувши ціле
сімейство поганих варіантів
див. example8_4.py
Ще одна оптимізація
початкову позицію
перших 4 фігур взагалі
легко розрахувати вручну
(0, 1) або (0, 0)
(1, 3) (1, 2)
(2, 5) (2, 4)
(3, 7) (3, 6)
див. example8_5.py
Евристичний алгоритм (евристика) — це алгоритм розв'язку задачі, який не має точного обґрунтування, але в більшості практичних випадків забезпечує прийнятну відповідь(за якістю та часом роботи).
Евристичний розв'язок
2
2
2
2
1
2
1
1
обрати фігуру, яка
"погано" стоїть,
знайти для неї найменш
потенційно небезпечне
поле та переставити
повторювати, поки
не знайдено розв'язок
див. example8_6.py
• чи є задача типовою?
• чи існує для неї точний відомий розв'язок?
• чи можна виявити закономірності і побудувати еврістичний алгоритм?
• спробуйте розв'язати задачу вручну
• невже її можна розв'язати лише перебором?
• точно???
• ну хоча б перебором із поверненням
• а розуміння, вироблене під час розв'язку вручну, допоможе зменшити кількість варіантів
• f(n) ϵ O(k) — константна складність
• f(n) ϵ O(n) — лінійна складність
• f(n) ϵ O(nk) — поліноміальна складність
• f(n) ϵ O(n2) — квадратична складність (частковий випадок)
• f(n) ϵ O(kn) — лінійна складність
• f(n) ϵ O(logkn) — логарифмічна складність
Складність алгоритму можна приблизно оцінити за кількістю циклів
Для вибору алгоритму порівнюють вищу межу або середню складність
Дякую за увагу!Над випуском працювали:
• Павлюченко Нікіта Сергійович
• Панібрат Марія Олексіївна
НТУУ "КПІ", 2015
Recommended