Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
217
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

1.7. Анализ программ

Пусть у нас есть программа (большая и сложная), которая работает медленнее, чем хотелось бы. Как обнаружить части программы, тонкая настройка которых привела бы к заметному ускорению ее работы?

Можно посмотреть на программу и найти подпрограммы, в которых много вычислений или циклов и попытаться усовершенствовать их.

Но лучше сначала отобрать часто используемые подпрограммы и попробовать улучшить их.

Один из способов поиска состоит в том, чтобы ввести набор глобальных счетчиков, по одному на каждую подпрограмму. При начале работы все счетчики обнуляются. Затем в каждую подпрограмму первой строкой вставляется команда увеличения счетчика на 1. В конце работы набор счетчиков укажет, сколько раз происходил вызов каждой подпрограммы.

Всегда эффективнее улучшить работу наиболее часто вызываемых подпрограмм.

Счетчики можно использовать и на уровне подпрограмм. В этом случае необходимо установить счетчики в каждой значимой точке (вхождения в цикл, ветвления, if then/ else).

В конце работы установленные счетчики будут содержать информацию о количестве выполнения каждого блока подпрограммы. Затем можно исследовать возможность улучшить те части подпрограммы, которые выполняют максимальный объем работы.

1.8. Вопросы для самоконтроля

  1. Понятие трудоемкости алгоритма в формальном базисе.

  2. Обобщенный критерий оценки качества алгоритма.

  3. Расположить в порядке возрастания следующие функции: 2n , log2n, n2, (log2n)2 , n!, (n-n2+5n3), n3 , , n, 2n-1log2 n

  4. Система обозначений в анализе алгоритмов - худший, лучший и средний случаи.

  5. Классификация алгоритмов по виду функции трудоемкости.

  6. Примеры количественных и параметрически–зависимых алгоритмов.

  7. Обозначения в асимптотическом анализе функций.

  8. Трудоемкость рекурсивных алгоритмов.

  9. Пусть непосредственное (нерекуррентное) вычисление решает некоторую задачу за n2 операций. Рекурсивному алгоритму при решении той же задачи требуется nlog2 n операций для разбиения на 2 равные части входных данных и log2 n – для объединения двух решений. Какой из двух алгоритмов более эффективен?

2. Алгоритмы поиска и выборки

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

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

Списки могут быть неотсортированными или отсортированными по значению ключевого поля. В неотсортированном списке порядок записи случаен, а в отсортированном списке они идут в порядке возрастания ключа.

В задаче поиска нас интересует процесс просмотра списка в поисках некоторого конкретного элемента, называемого целевым.

В задаче выборки требуется найти элемент, удовлетворяющий некоторым условиям (например, пятый по величине элемент, седьмой с конца, элемент со средним значением и т.п.).