Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

172 Глава 4. Аналитические инструменты

4.2.5 Используя большое о примечание

Сделав случай из использования большого о примечания для анализа алгоритмов, позвольте нам, briefly обсуждают несколько проблем относительно его использования. Это считают плохим вкусом, в

общий, чтобы сказать «f (n)£ O (g (n))», так как большое об уже обозначает ««меньше, чем»

«или равный»» понятию. Аналогично, хотя распространенный, это не полностью правильно, чтобы сказать

«f (n) = O (g (n))» (с обычным пониманием «=» отношение), с тех пор нет никакого способа понять заявление «O (g (n)) = f (n)». Кроме того, это

полностью неправильно сказать «f (n)³ O (g (n))» или «f (n)> O (g (n))», начиная с g (n) в

большие об экспрессы верхняя граница на f (n). Лучше говорить,

«f (n) - O (g (n))».

Для более математически наклоненного, это также правильно, чтобы сказать,

«f (n)Î O (g (n))»,

поскольку большое о примечание, с технической точки зрения, обозначает целую коллекцию функций. В этой книге мы придерживаемся представления больших о заявлений, поскольку «f (n) - O (g (n))». Даже с этой интерпретацией, есть значительная свобода в том, как мы можем использовать арифметические операции с большим о примечанием, и с этой свободой прибывает определенное количество ответственности.

Некоторые слова предостережения

Несколько слов предостережения об асимптотическом примечании в порядке в этом пункте. Во-первых, обратите внимание на то, что использование больших об и связанных примечаний может быть несколько вводящим в заблуждение, должен постоянные множители они «скрываться» быть очень большим. Например, в то время как верно, что функция 10100n является O (n), если это - продолжительность алгоритма, являющегося по сравнению с тем, продолжительность которого 10n, регистрируют n, мы предпочитаем O (n, регистрируют n), алгоритм времени, даже при том, что линейно-разовый алгоритм асимптотически быстрее. Это предпочтение - то, потому что постоянным множителем, 10100, который называют «один гугол», как полагают много астрономов, является верхняя граница на числе атомов в заметной вселенной. Таким образом, у нас вряд ли когда-либо будет реальная проблема, у которой есть это число как его входной размер. Таким образом, используя большое о примечание, мы должны, по крайней мере, несколько помнить постоянных множителей и условия более низкоуровневые, которые мы «скрываем».

Наблюдение выше подъемов проблема того, что составляет «быстрый» алгоритм. Вообще говоря, любой алгоритм, бегущий в O (n регистрируют n) время (с разумным постоянным множителем), нужно считать эффективным. Даже O (n2) метод времени может быть достаточно быстрым в некоторых контекстах, то есть, когда n маленький. Но алгоритм, бегущий в O (2n) время, никогда нельзя почти считать эффективным.

4.2. Анализ алгоритмов 173

Показательная продолжительность

Есть известная история об изобретателе игры в шахматы. Он попросил только, чтобы его король заплатил ему 1 зерно риса для первого квадрата на правлении, 2 зерна для второго, 4 зерна для третьего, 8 для четвертого, и так далее. Это - интересный тест на программирование навыков, чтобы написать программу, чтобы вычислить точно число зерен риса, который должен был бы заплатить король. Фактически, любой C ++ программа, написанная, чтобы вычислить это число в единственном целочисленном значении, заставляет целое число overflow происходить (хотя машина во время выполнения, вероятно, не будет жаловаться).

Если мы должны чертить линию между эффективными и неэффективными алгоритмами, поэтому, естественно заставить это различие быть что между теми алгоритмами, бегущими в многочленное время и тех, которые бегут в показательное время. Таким образом, сделайте distinc-tion между алгоритмами с продолжительностью, которая является O (nc) для некоторого постоянного c> 1 и тех с продолжительностью, которая является O (миллиард) для некоторого постоянного b> 1. Как столько понятий мы обсудили в этой секции, это также должно быть взято с «зерном соли», для алгоритма, бегущего в O (n100) время, не должен, вероятно, считаться «эффективным». Несмотря на это, различие между многочленно-разовыми и показательно-разовыми алгоритмами считают прочной мерой tractability.

Чтобы подвести итог, асимптотические примечания больших о, большой Омеги и большой Теты предоставляют удобный язык нам, чтобы проанализировать структуры данных и алгоритмы. Как отмечалось ранее, эти примечания обеспечивают удобство, потому что они позволяют нам concen-trate на «большой картине», а не деталях низкого уровня.

Два примера асимптотического анализа алгоритма

Мы завершаем эту секцию, анализируя два алгоритма, которые решают ту же самую проблему, но имеют довольно различную продолжительность. Проблемой, которой мы интересуемся, является та вычисления так называемых средних чисел префикса последовательности чисел. А именно, учитывая множество X хранения n числа, мы хотим вычислить множество таким образом что [я]

среднее число элементов X [0]..., X [я], поскольку я = 0..., n- 1, то есть,

åij=0 X [j]

[Я] = i+1.

У вычислительных средних чисел префикса есть много применений в экономике и статистике. Например, учитывая ежегодную прибыль взаимного фонда, инвестор, как правило, хочет видеть среднюю ежегодную прибыль фонда в течение прошлого года, прошлых трех лет, прошлых пяти лет и прошлых десяти лет. Аналогично, учитывая поток ежедневных Веб-журналов использования, менеджер веб-сайта может хотеть отследить средние тенденции использования по различным периодам времени.