Лабораторная работа №4 Сравнительный анализ алгоритмов поиска Цель работы: Изучение алгоритмов поиска элемента в массиве и закрепление навыков в проведении срав-нительного анализа алгоритмов. Постановка задачи 1. Изучить алгоритмы поиска: 1) в неупорядоченном массиве: а) линейный; б) быстрый линейный; 2) в упорядоченном массиве: а) быстрый линейный; б) бинарный; в) блочный. 2. Разработать и программно реализовать средство для проведения экспериментов по определению временных характеристик алгоритмов поиска. 3. Провести эксперименты по определению временных характеристик алгоритмов поиска. Результаты экспериментов представить в виде таблиц 4.1 и 4.2. Клетки таблицы 4.1 содержат максимальное количество операций сравне-ния при выполнении алгоритма поиска, а клетки таблицы 4.2 – среднее число операций сравнения. 4. Построить графики зависимости количества операций сра-внения от количества элементов в массиве. 5. Определить аналитическое выражение функции зависимости количества операций сравнения от количества элементов в массиве. 6. Определить порядок функций временной сложности алго-ритмов поиска. Таблица 4.1 Максимальное количество операций сравнения Алгоритмы поКоличество элементов в массиве иска (см.п.1) 50 100 150 200 250 300 350 400 450 1.а 1.б 2.а 2.б 2.в Таблица 4.2 Среднее количество операций сравнения Алгоритмы поКоличество элементов в массиве иска (см.п.1) 50 100 150 200 250 300 350 400 450 1.а 1.б 2.а 2.б 2.в ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Задача поиска заключается в том, чтобы определить наличие элемента, равного заданному. в массиве Во многих программах поиск требует наибольших временных затрат, так что замена плохого поиска на хороший, часто ведет к существенному увеличению скорости работы программы. Выбор алгоритма поиска зависит от характера организованности масси-ва. Алгоритмы поиска в неупорядоченных массивах Алгоритм 1.а линейного поиска Работа алгоритма заключается в том, что элементы масси-ва, начиная с первого, последовательно сравнивается с искомым элементом. Сравнение элементов продолжается до тех пор, пока не будут просмотрены все элементы или очередной элемент мас-сива не равен искомому. Алгоритм 1.б быстрого линейного поиска Любой алгоритм поиска содержит блок проверки на окончание массива. В алгоритме линейного поиска эта проверка осущест-вляется каждый раз перед обращением очередному элементу. Однако проверка на окончание массива может осуществляться не при каждом сравнении. Для этого в конец массива включается (N+1)-й элемент, равный искомому. Тогда проверка на окончание массива осуществляется лишь при совпадении очередного элемен-та с искомым. Если этот элемент находится внутри массива, то поиск заканчивается удачно и элемент считается найденным. Ес-ли же этот элемент оказался (N+1)-ым, то искомого элемента вмассиве нет. Анализ алгоритмов линейного поиска Для отыскания искомого элемента с использованием алгоритмов линейного поиска в худшем случае придется просмот-реть все N элементов массива, следовательно порядок функции ВС будет O(N). В лучшем случае, когда искомый элемент равен первому элементу массива, число сравнений не зависит от количества элементов в массиве и порядок функции ВС будет O(N). Оценим среднее время алгоритма, при этом будем исходить из следующего: пусть Pi – вероятность того, что будет осуществляться поиск элемента со значением ki; n предположим, что P 1, i т.е. элемент со значением ki не будет i=1 отсутствовать (в массиве обязательно есть элемент, поиск которого осуществляется). Среднее время ( t ), как следует из алгоритма, пропорционально среднему числу операций сравнения ( с ) и равно t ~ с = 1 P1 2 P2 ... N PN . Если ключи имеют одинаковую вероятность P1=P2=...PN=P, а также учитывая, что p p ... p 1 , n ( N 1) N N 1 P О( N ) , NP=1, P=1/N, тогда t (1 2 ... N ) P 2 2 т.е. при линейном поиске в среднем необходимо просмотреть половину массива. Для экспериментального определения среднего числа сравне-ний необходимо найти суммарное число сравнений при поиске всех элементов массива и разделить на количество элементов. Алгоритмы поиска в упорядоченных массивах Алгоритм 2.а быстрого линейного поиска Применяя алгоритм быстрого линейного поиска для поиска элемента в упорядоченном массиве, поиск можно прекратить, если очередной элемент массива будет больше искомого. Это будет означать, что искомого элемента в массиве нет. В случае поиска элемента, который есть в массиве, этот алгоритм аналогичен алгоритму быстрого линейного поиска в неупорядо-ченном массиве. Алгоритм 2.б бинарного поиска Принцип, лежащий в основе алгоритма бинарного поиска (и некоторых других алгоритмов), состоит в том, что иногда уда-ётся последовательно уменьшать объём задачи до такой степени, что её решение в конце концов становится тривиальным. Главный шаг при бинарном поиске – взять элемент из середины массива и, если он не равен искомому, то в зависимости от его значения ту или другую половину массива из рассмотрения. Повторное выполнение этого шага быстро сокращает размер области поиска. Алгоритм бинарного поиска. 1. Определить середину массива. 2. Если элемент, находящийся в середине массива, совпада-ет с искомым, поиск завершен. 3. Если ключ из середины массива больше искомого, приме-нить бинарный поиск к первой половине массива. 4. Если ключ из середины массива меньше искомого, бинар-ный поиск необходимо применить ко второй половине массива. 5. Пункт 1-4 повторять, пока размер области поиска не уменьшается до нуля. Если это произойдет – ключа в массиве нет. Анализ алгоритма бинарного поиска Порядок функции ВС алгоритма бинарного поиска равен O(log2N). Это объясняется тем, что на каждом шаге поиска вдвое уменьшается область поиска. До того, как она станет равной одному элементу, произойдет не более log2N таких уменьшений, т.е. выполняется не более log2N шагов алгоритма.В лучшем случае, когда искомый элемент находится в середине массива, число сравнений не зависит от количества элементов в массиве и порядок функции ВС будет O(N). Определим среднее число шагов при поиске элементов в массиве из N элементов. Для этого подсчитаем суммарное число шагов S при поиске каждого элемента массива. Исходя из алго-ритма, не более чем N/2 элементов ищется за log2N шагов,N/4 элементов – за (log2N)-1 шагов, и т.д. Отсюда S=((N/2)*log2N)+((N/4)*((log2N)-1)+…+1. Среднее число шагов равно S/N, что составляет O(log2N). Алгоритм 2.в блочного поиска Блочный поиск состоит в том, что массив, упорядоченный по возрастанию, разбивается на определённое число блоков. В про-цессе поиска искомый элемент последовательно сравнивается с последним элементом блоков. Если искомый элемент меньше последнего элемента очередного блока, то искомый элемент может находиться только внутри этого блока. Для поиска эле-мента в блоке можно применить линейный поиск. Анализ алгоритма блочного поиска Пусть массив состоит из N элементов и при поиске разби-вается на X равных блоков. Тогда в каждом блоке будет не более N/X элементов. В худшем случае, если искомый элемент окажется в последнем блоке, то для поиска блока потребуется просмотреть X элементов массива. Выполнить линейный поиск в блоке можно, просмотрев не более чем N/X элементов. Следовательно, общее число обрабатываемых элементов не превы- шает X+N/X. Эта величина зависит от числа блоков и будет ми-нимальна, когда её производная равна нулю, т.е. при X=N. Число записей в блоке так же равно N. При таком разбиении массива на блоки в худшем случае понадобиться обработать не более чем 2*N элементов массива, а в среднем N элементов. Содержание отчета. 1. Тема лабораторной работы. 2. Цель работы. 3. Листинг программы. 4. Результаты работы программы. 5. Графики зависимостей ФВС. 6. Выводы по работе.