Поиск в массиве записей.pptx
- Количество слайдов: 8
Поиск в массиве записей
Задача поиска требуемого элемента в массиве записей a[i], i = 0, . . , n-1 заключается в нахождении индекса i, удовлетворяющего условию a[i]. k = isk. Здесь поле записи k выступает в качестве ключа, isk – искомый ключ. После нахождения i обеспечивается доступ ко всем другим полям найденной записи a[i]. Линейный (последовательный) поиск используется, когда нет никакой дополнительной информации о разыскиваемых данных. Он представляет собой последовательный перебор массива до обнаружения требуемого ключа или до конца, если ключ не обнаружен:
• • • i=0; while (i<n && a[i]. k != isk) i++; if (i==n) < вывод(‘элемент не найден’)> else <вывод(‘индекс искомого элемента= ’, i)>;
Поиск с барьером. В линейном поиске на каждом шаге требуется вычислять сложное логическое выражение и увеличивать индекс. Уменьшить затраты на поиск можно упростив логическое выражение с помощью введения вспомогательного элемента – барьера, который предохраняет от выхода за пределы массива. Для этого в конец массива добавляется элемент с искомым ключом. Количество проверок на каждом шаге уменьшается (одна, а не две) т. к. нет необходимости проверки выхода за пределы массива – элемент с искомым ключом обязательно будет найден до выхода за пределы массива.
• • • a[n]. k = isk; i=0; while ( a[i]. k != isk ) i++; if (i==n) <вывод( ‘элемент не найден’ ) > else <вывод( ‘индекс искомого элемента= ’ , i) >;
Поиск делением пополам (бинарный поиск) используется, когда данные упорядочены по возрастанию ключа k, т. е. a[i]. k <= a[i+1]. k. Основная идея поиска – выбирается «средний» (m-й) элемент. Если a[m]. k < isk, то все элементы с индексами i<= m можно исключить из дальнейшего поиска, если a[m]. k >= isk, то можно исключить все элементы с индексами i > m:
• i=0; j=n-1; • while ( i < j ) • { • m = ( i+j ) / 2; • if ( a[m]. k < isk) i = m+1; • else j = m; • } • if (a[i]. k == isk) • <вывод( ‘индекс искомого элемента=’ , i) > • else <вывод( ‘элемент не найден’) > ;
В этом алгоритме отсутствует проверка на каждой итерации цикла совпадения ключа среднего элемента a[m]. k с искомым isk. На первый взгляд это кажется странным, однако тестирование показывает, что в среднем выигрыш от уменьшения количества проверок превосходит потери от нескольких «лишних» вычислений до выполнения условия i==j.
Поиск в массиве записей.pptx