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

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

4.2.1 Экспериментальные исследования

Если алгоритм был осуществлен, мы можем изучить его продолжительность, выполнив его на различных испытательных входах и делая запись фактического времени, проведенного в каждом выполнении. Для - tunately, такие измерения могут быть проведены точным способом при помощи системных вызовов, которые встроены в язык или операционную систему (например, при помощи часов () функция или запрос окружающей среды во время выполнения с профилированием позволенного). Такие тесты назначают определенную продолжительность на определенный входной размер, но мы интересуемся определением общей зависимости продолжительности на размере входа. В или - der, чтобы определить эту зависимость, мы должны выполнить несколько экспериментов на многих различных испытательных входах различных размеров. Тогда мы можем визуализировать результаты таких экспериментов, готовя выполнение каждого пробега алгоритма как вопрос с x-координатой, равной входному размеру, n, и y-координате, равной продолжительности, t. (См. рисунок 4.3.) От этой визуализации и данных, которые поддерживают его, мы можем выполнить статистический анализ, который стремится соответствовать лучшей функции входного размера к экспериментальным данным. Чтобы быть значащим, этот анализ требует, чтобы мы выбрали хорошие типовые входы и проверили достаточно из них, чтобы быть в состоянии предъявить звуковые статистические претензии о продолжительности алгоритма.

t (ms)

60

50

40

30

20

10

n

0 50 100

Рисунок 4.3: Результаты экспериментального исследования продолжительности алгоритма. Точка с координатами (n, t) указывает, что на входе размера n, продолжительность алгоритма - t миллисекунды (ms).

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

В то время как экспериментальные исследования продолжительности полезны, у них есть три главных

ограничения:

• Эксперименты могут быть сделаны только на ограниченном наборе испытательных входов; следовательно, они

не учтите продолжительность входов, не включенных в эксперимент (и

эти входы могут быть важными).

• Мы испытываем затруднения при сравнении экспериментальной продолжительности двух algo-

rithms, если эксперименты не были выполнены в тех же самых аппаратных средствах и

окружающая среда программного обеспечения.

• Мы должны полностью осуществить и выполнить алгоритм, чтобы изучить

продолжительность экспериментально.

Это последнее требование очевидно, но это - вероятно, самый трудоемкий аспект выполнения экспериментального анализа алгоритма. Другие ограничения im-

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

В остальной части этой главы мы развиваем общий способ проанализировать продолжительность алгоритмов что:

• Принимает во внимание все возможные входы.

• Позволяет нам оценивать относительную эффективность любых двух алгоритмов в пути

это независимо от окружающей среды аппаратного и программного обеспечения.

• Может быть выполнен, изучив описание высокого уровня алгоритма с -

фактически осуществляя его или управляя экспериментами на нем.

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

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

4.2.2 Примитивные операции

Как отмечено выше, экспериментальный анализ ценен, но у него есть свои ограничения. Если

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

Назначение стоимости к переменной

Вызывание функции выполнение арифметической операции (например, добавляя два числа) сравнение двух чисел индексация во множество после объектной ссылки возвращение из функции

Продолжительность 4.2. Анализ алгоритмов 165

Подсчет примитивных операций

Определенно, примитивная операция соответствует инструкции низкого уровня с экс-ecution время, которое постоянно. Вместо того, чтобы пытаться определить определенное время выполнения каждой примитивной операции, мы просто считаем, сколько примитивных операций выполнено и использует этот номер t в качестве меры продолжительности algo-rithm.

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

Алгоритм может бежать быстрее на некоторых входах, чем он делает на других того же самого размера. Таким образом мы можем хотеть выразить продолжительность алгоритма как функция входного размера, полученного, беря среднее число по всем возможным входам того же самого размера. К сожалению, такой анализ среднего случая типично довольно сложен. Это требует, чтобы мы определили распределение вероятности на наборе входов, который часто является трудной задачей. Рисунок 4.4 схематично показывает, как, в зависимости от входа distri-bution, продолжительность алгоритма может быть где угодно между временем худшего случая и временем лучшего случая. Например, что, если входы имеют действительно только типы "A" или "D"?

время среднего случая?

3 мс }

время лучшего случая 2 мс

1 мс

5 мс время худшего случая

4 мс

A B C D E F G

Входной случай

Рисунок 4.4: различие между лучшим случаем и время худшего случая. Каждый бар repre-центы продолжительность некоторого алгоритма на различном возможном входе.