Основы объектно-ориентированного программирования на языке C# book | Page 32

2 Oснови алгоритмiзацiı̈ Сумнiвiв, який з алгоритмiв ефективнiший, здається, не виникає. Для алгоритмiв, подiбних до щойно розглянутого (n крокiв для обробки n вхiдних значень), кiлькiсть крокiв є функцiєю вiд кiлькостi елементiв, що обробляються, – g(n). Не для кожного алгоритму таку функцiю можна легко обчислити. Для оцiнки швидкостi зростання дослiджуваноı̈ функцiı̈ порiвняємо ı̈ı̈ з функцiєю, дiя якоı̈ вже добре вiдома. При дослiдженнi поведiнки функцiй g(n) натурального n розглядатимемо такi функцiı̈ g(n), що зростають не швидше f (n), тобто iснує така пара додатних значень M i n 0 , що |g(n)| ≤ M |f (n)| для n ≥ n 0 . Таку залежнiсть позна- чають у математицi символом O: g(n) = O(f (n)). Iнодi символ O використовують у рiвняннях злiва i справа вiд знаку рiвностi, на- приклад f (n, O(r 1 (n)), ..., O(r k (n))) = g(n, O(s 1 (n)), ..., O(s m (n))). Та- кi рiвняння слiд розумiти таким чином: для кожного кортежу фун- кцiй (p 1 , ..., p k ), такого, що p 1 (n) = O(r 1 (n)), ..., p k (n) = O(r k (n)) iснує кортеж функцiй (q 1 , ..., q m ), такий, що q 1 (n) = O(s 1 (n)), ..., q m (n) = O(s m (n)) i для всiх n має мiсце f (n, p 1 (n), ..., p k (n)) = g(n, q 1 (n), ..., q m (n)). Слiд зауважити, що у рiвняннях, що включають символ O знак рiв- ностi має сенс однобiчноı̈ рiвностi: з O(g(n)) = O(f (n)) в загальному випадку не випливає, що O(f (n)) = O(g(n)). Укажемо кiлька важливих властивостей O–оцiнювання: 1. f (n) = O(f (n)); 2. cO(f (n)) = O(f (n)), де c – деяка константа; 3. O(f (n)) + O(f (n)) = O(f (n)); 4. O(O(f (n))) = O(f (n)); 5. O(f (n))O(g(n)) = O(f (n)g(n)); 6. O(cf ) = O(f ), де c – деяка константа; 7. O(f + g) дорiвнює домiнантi O(f ) i O(g). Можна сказати, що ефективнiсть алгоритму безпосереднього пiдсу- мовування n елементiв вiдповiдає лiнiйнiй складностi, оскiльки його швидкодiя, тобто кiлькiсть крокiв, згiдно iз властивiстю 1 становить O(n). Розглянемо таку задачу: для набору з n попарно нерiвних вiдрiзкiв пiдрахувати кiлькiсть усiх трiйок, з яких можна отримати невиро- дженi трикутники. 32