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

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

4.2.6 Рекурсивный алгоритм для вычислительных мощностей

Как более интересный пример анализа алгоритма, давайте рассмотрим проблему

из подъема номера x к произвольному неотрицательному целому числу, n. Таким образом, мы хотим вычислить функцию власти p (x, n), определенный как p (x, n) = xn. У этой функции есть непосредственное рекурсивное определение, основанное на линейной рекурсии:

p (x, n) = 1  p (x, n- 1) ioftne=w0ise x час

Это определение немедленно приводит к рекурсивному алгоритму, который использует O (n) функция

требования вычислить p (x, n). Мы можем вычислить функцию власти намного быстрее, чем это, однако, при помощи следующего альтернативного определения, также основанного на линейной рекурсии, которая использует согласовывающуюся технику:

 если n = 0

Чтобы иллюстрировать, как это определение работает, рассмотрите следующие примеры: p (x, n) =  x p (x, (n- 1)/2) 2, если n> 0 странный 1 p (x, n/2) 2 если n> 0 ровен

24 = 2 (4/2) 2 = (24/2) 2 = (22) 2 = 42 = 16 25 = 21 + (4/2) 2 = 2 (24/2) 2 = 2 (22) 2 = 2 (42) = 32 26 = 2 (6/2) 2 = (26/2) 2 = (23) 2 = 82 = 64 27 = 21 + (6/2) 2 = 2 (26/2) 2 = 2 (23) 2 = 2 (82) = 128

Это определение предлагает алгоритм Кодового Фрагмента 4.4. Власть алгоритма (x, n):

Вход: номер x и целое число n³ 0

Продукция: стоимость xn

если n = 0 тогда

возвратитесь 1

если n странный тогда

y¬ Власть (x, (n- 1)/2) возвращают x y y

еще

y¬ Власть (x, n/2)

возвратите y y

Кодовый Фрагмент 4.4: Вычисление функции власти, используя линейную рекурсию.

Чтобы проанализировать продолжительность алгоритма, мы замечаем, что каждый повторяется -

требование sive Власти функции (x, n) делит образца, n, два. Таким образом есть O (зарегистрируйте n), рекурсивные вызовы, не O (n). Таким образом, при помощи линейной рекурсии и согласовывающейся техники, мы уменьшаем продолжительность для вычисления функции власти от O (n) к O (зарегистрируйте n), который является большим улучшением.

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

4.2.7 Еще некоторые примеры анализа алгоритма

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

Постоянно-разовый метод

Чтобы иллюстрировать постоянно-разовый алгоритм, рассмотрите следующий C ++ функция, которая возвращает размер вектора STL, то есть, текущего числа клеток во множестве:

международная способность (константа vector<int>& прибытие)

возвратите arr.size ();

Это - очень простой алгоритм, потому что размер вектора сохранен как a

членская переменная в векторном объекте, таким образом, требуется только постоянно-разовый поиск, чтобы возвратить эту стоимость. Таким образом полная функция бежит в O (1) время; то есть, продолжительность этой функции независима от ценности n, размера множества.

Пересматривание метода для нахождения максимума во множестве

Для нашего следующего примера давайте пересмотрим простую проблему, изученную ранее, находя самую большую стоимость во множестве целых чисел. Мы предполагаем, что множество сохранено как вектор STL. Это может быть сделано в C ++ следующим образом:

интервал findMax (константа vector<int>& прибытие)

интервал макс. = прибытие [0];

для (интервал i = 1; я <arr.size (); я ++)

если (макс. <прибытие [я]) макс. = прибытие [я];

возвратитесь макс.;

Эта функция, которая составляет C ++ внедрение arrayMax al-

gorithm Раздела 4.2.3, сравнивает каждый из n элементов во входном множестве к текущему максимуму, и каждый раз, когда это считает элемент больше, чем текущая макси - мама, это обновляет текущий максимум, чтобы быть этой стоимостью. Таким образом это проводит постоянное количество времени для каждого из n элементов во множестве; следовательно, как с псевдо - кодовая версия arrayMax алгоритма, продолжительность этого алгоритма - O (n).