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

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

Квадратно-разовый алгоритм

Наш первый алгоритм для средней проблемы префикса, названной prefixAverages1, показывают в Кодовом Фрагменте 4.2. Это вычисляет каждый элемент отдельно, после определения.

Алгоритм prefixAverages1 (X):

Вход: множество n-элемента X из чисел. Продукция: множество n-элемента чисел, таким образом, что [я]

среднее число элементов X [0]..., X [я]. Позвольте A быть множеством n чисел.

поскольку я¬ 0 к n- 1 делаю

a¬0 для j¬ 0 я делаю

¬ + X [j]

[Я]¬ / (я + 1)

возвратите множество A

Кодовый Фрагмент 4.2: Алгоритм prefixAverages1.

Давайте проанализируем prefixAverages1 алгоритм.

• Инициализация и возвращение множества вначале и конец могут быть сделаны с

постоянное число примитивных операций за элемент и берет O (n) время.

• Есть два вложенных для петель, которыми управляют прилавки i и j, пере -

spectively. Тело внешней петли, которой управляет прилавок i, выполнено

n времена, поскольку я = 0..., n- 1. Таким образом заявления a = 0 и [я] = / (я + 1)

выполненные n времена каждый. Это подразумевает что эти два заявления плюс incre-

чеканя и тестирование прилавка i, внесите много примитивных операций, пропорциональных n, то есть, O (n) время.

• Тело внутренней петли, которой управляет прилавок j, выполнено

я + 1 раз, в зависимости от текущей стоимости внешней петли возражаю i. Таким образом,

заявление a = + X [j] во внутренней петле выполнено 1 + 2 + 3 + + n времена.

Вспоминая Суждение 4.3, мы знаем что 1 + 2 + 3 + + n = n (n + 1)/2,

который подразумевает, что заявление во внутренней петле вносит O (n2) время. A

подобный аргумент может быть сделан для примитивных операций, связанных с увеличиванием и тестированием прилавка j, которые также берут O (n2) время.

Продолжительность алгоритма prefixAverages1 дана суммой трех условий. Первым и вторым сроком является O (n), и третий срок - O (n2). Простым применением Суждения 4.9, продолжительность prefixAverages1 - O (n2).

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

Линейно-разовый алгоритм

Чтобы вычислить средние числа префикса более эффективно, мы можем наблюдать те два довода «против» -

secutive составляет в среднем [я- 1] и [я] подобны:

[Я- 1] = (X [0] + X [1] + + X [я- 1])/i

[Я] = (X [0] + X [1] + + X [я- 1] + X [я]) / (я + 1).

Если мы обозначаем с Сайом сумму префикса X [0] + X [1] + + X [я], мы можем вычислить

средние числа префикса как [я] = Сай / (я + 1). Легко отслеживать текущий префикс

суммируйте, просматривая множество X с петлей. Мы теперь готовы представить Алгоритм prefixAverages2 в Кодовом Фрагменте 4.3.

Алгоритм prefixAverages2 (X):

Вход: множество n-элемента X из чисел. Продукция: множество n-элемента чисел, таким образом, что [я]

среднее число элементов X [0]..., X [я]. Позвольте A быть множеством n чисел.

s¬0

поскольку я¬ 0 к n- 1 делаю

s¬ s + X [я] [я]¬ s / (я + 1)

возвратите множество A

Кодовый Фрагмент 4.3: Алгоритм prefixAverages2.

Анализ продолжительности алгоритма prefixAverages2 следует:

• Инициализация и возвращение множества вначале и конец могут быть сделаны с

постоянное число примитивных операций за элемент, и берет O (n) время.

• Инициализация переменной s вначале берет O (1) время.• Есть сингл для петли, которой управляет прилавок i. Тело

петля выполнена n времена, поскольку я = 0..., n- 1. Таким образом, заявления s = s + X [я]

и [я] = s / (я + 1) выполнен n времена каждый. Это подразумевает что эти два

заявления плюс увеличивание и тестирование прилавка я вношу много примитивных операций, пропорциональных n, то есть, O (n) время.

Продолжительность алгоритма prefixAverages2 дана суммой трех условий.

Первым и третьим сроком является O (n), и второй срок - O (1). Простым применением Суждения 4.9, продолжительность prefixAverages2 - O (n), который намного лучше, чем квадратно-разовый алгоритм prefixAverages1.