Лекции / Асимптотическая_сложность_О_нотация_или_Big_O
.pdf
Data Structures and Algorithms
O - нотация
Но как этим пользоваться? Например если указанно, что сложность сортировки O(n2).
Это означает что время работы этого алгоритма возрастает медленнее чем функция g(n) = n2 умноженная на константу.
Это же позволяет оценить как увеличится (в самом худшем случае) время работы алгоритма при увеличении объема данных в определенное количество раз.
Рассмотрим пример такой оценки. Предположим что массив из 2000000 объектов на заданном ПК сортируется 50 ms. Нужно оценить как возрастет время если нужно сортировать массив из 8000000 элементов.
t=C t (n)t C |
C g(n) |
t1 |
|
C PC C g(n1 ) |
t |
|
n22 |
80000002 |
=50 16=800 ms |
t2 |
C PC C g(n2) |
t |
=50 |
||||||
PC |
PC |
|
2 |
1 |
n12 |
20000002 |
|
||
Именно поэтому константу С обычно и не указывают, она все равно сокращается при оценке увеличения времени.
Data Structures and Algorithms
Вычислительный эксперимент
Для проверки асимптотических оценок проведем вычислительный эксперимент.
Возьмем алгоритм сортировки с известной оценкой асимптотической сложности. Для примера возьмем алгоритм сортировки пузырьком (будет изучаться в этом курсе в дальнейшем). Сложность алгоритма сортировки пузырьком равна O(n2).
Замерим время его сортировки для массивов разного размера и проследим асимптотическое поведение. Для того что бы нивелировать влияние случайных колебаний каждый замер будем повторять много кратно и использовать усредненное значение.
Data Structures and Algorithms
Результаты вычислительного эксперимента |
|||||||||||
|
14000 |
|
|
|
|
|
|
|
|
|
|
|
12000 |
|
|
|
|
|
|
|
|
|
|
|
10000 |
|
|
|
|
|
|
|
|
|
|
|
8000 |
|
|
|
|
|
|
|
|
|
|
t(ns) |
6000 |
|
|
|
|
|
|
|
|
|
t(n) |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
4000 |
|
|
|
|
|
|
|
|
|
|
|
2000 |
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
|
0 |
10 |
20 |
30 |
40 |
50 |
60 |
70 |
80 |
90 |
100 |
|
|
|
|
|
|
n |
|
|
|
|
|
Для малых значений n время ведет себя отлично от параболы. |
|||||||||||
Data Structures and Algorithms
Результаты вычислительного эксперимента |
|||||||||||
|
700000 |
|
|
|
|
|
|
|
|
|
|
|
600000 |
|
|
|
|
|
|
|
|
|
|
|
500000 |
|
|
|
|
|
|
|
|
|
|
t(ns) |
400000 |
|
|
|
|
|
|
|
|
|
|
300000 |
|
|
|
|
|
|
|
|
|
t(n) |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
200000 |
|
|
|
|
|
|
|
|
|
|
|
100000 |
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
|
0 |
100 |
200 |
300 |
400 |
500 |
600 |
700 |
800 |
900 |
1000 |
|
|
|
|
|
|
n |
|
|
|
|
|
При увеличении значения n поведение функции t(n) приближается к параболе |
|||||||||||
Data Structures and Algorithms
Результаты вычислительного эксперимента |
|||||||||||
|
100000000 |
|
|
|
|
|
|
|
|
|
|
|
90000000 |
|
|
|
|
|
|
|
|
|
|
|
80000000 |
|
|
|
|
|
|
|
|
|
|
|
70000000 |
|
|
|
|
|
|
|
|
|
|
|
60000000 |
|
|
|
|
|
|
|
|
|
|
t(ns) |
50000000 |
|
|
|
|
|
|
|
|
|
|
40000000 |
|
|
|
|
|
|
|
|
|
t(n) |
|
|
|
|
|
|
|
|
|
|
|
||
|
30000000 |
|
|
|
|
|
|
|
|
|
|
|
20000000 |
|
|
|
|
|
|
|
|
|
|
|
10000000 |
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
|
0 |
1000 |
2000 |
3000 |
4000 |
5000 |
6000 |
7000 |
8000 |
9000 |
10000 |
|
|
|
|
|
n |
|
|
|
|
|
|
Чем больше n тем ближе поведение t(n) к своей асимптотической оценке |
|||||||||||
Data Structures and Algorithms
Результаты вычислительного эксперимента
Как видно из графиков при увеличении объема входных данных поведение t(n) приближается к поведению асимптотической оценки сложности этого алгоритма.
Data Structures and Algorithms
Список литературы
1) Лафоре Р. Структуры данных и алгоритмы в Java. Классика Computers Science. 2-е изд. —СПб.: Питер, 2013. — 704 с.:ISBN 978-5-496-00740-5. Стр.[166-181]
