- •Основные понятия структур
- •Концепция типа данных, простейшие типы данных, стандартные типы данных, органические типы (диапазоны)
- •Статические и полустатические структуры данных
- •2. 1. Массив.
- •2. 2. Запись, записи с вариантами.
- •2. 3. Стек.
- •5. Очередь
- •2. 7. Отображение
- •Динамические структуры данных
- •3.1. Односвязные списки, кольцевой список
- •3. 2. Двусвязный список, кольцевой двусвязный список
- •4. Рекурсивные алгоритмы
- •4. 1. Деревья, бинарные деревья, представление деревьев
- •4. 2. Основные операторы, используемые для работы с деревьями
- •4. 3. Алгоритм создания дерева бинарного поиска
- •4. 4. Прохождение бинарных деревьев
- •1. Прохождение в прямом порядке
- •3. Прохождение в обратном порядке
- •4. 5. Когда рекурсию использовать не нужно
- •4. 6. Рекурсивные программы, примеры
- •5. Поиск
- •5. 1. Линейный поиск
- •5. 2. Двоичный поиск
- •5. 3. Индексно-последовательный поиск
- •5. 3. Поиск в таблице
- •5. 4. Поиск прямой строки
- •Поиск по бинарному дереву
- •Алгоритм кнута, Морриса и Пратта
- •5. 6. Алгоритм Боуера и Мура
- •Сортировка. Необходимые определения и классификация сортировок. Сортировки прямого включения и выбора. Их эффективность Необходимые определения и классификация сортировок.
- •Сортировка методом прямого включения
- •Эффективность алгоритма сортировки прямого включения
- •Сортировка методом прямого выбора
- •Эффективность алгоритма сортировки прямого выбора
- •Сортировка прямого обмена. Её эффективность
- •Эффективность алгоритма сортировки прямого обмена
- •Улучшенные методы сортировки. Быстрая сортировка. Её эффективность.
- •Быстрая сортировка
- •Принцип работы быстрой сортировки
- •Пример работы быстрой сортировки
- •Блок-схема быстрой сортировки
- •Улучшенные методы сортировки. Сортировка шелла. Её эффективность. Сортировка шелла
- •Принцип работы сортировки шелла и необходимые расчёты для её реализации
- •Пример расчёта последовательности расстояний для малых массивов
- •Пример работы сортировки шелла
- •Принцип работы пирамидальной сортировки
- •Пример работы пирамидальной сортировки
- •Представление графов
- •Нахождение кратчайших путей между парами вершин
5. 2. Двоичный поиск
При отсортированных данных может использоваться двоичный метод поиска.
При таком поиске используется метод "разделяй и властвуй". Сначала производится проверка среднего элемента. Если его ключ больше ключа требуемого элемента, то делается проверка для среднего элемента из первой половины.
Если же нет, то делается проверка среднего элемента из второй половины. Этот процесс повторяется до тех пор, пока не будет, найден требуемый элемент или не будет больше элементов для проверки.
Например, для поиска числа 4 в массиве 1 2 3 4 5 6 7 8 9 сначала делается проверка среднего элемента, которым является число 5.
Поскольку этот элемент больше 4, поиск будет продолжен в первой половине массива, т.е. среди чисел 1 2 3 4 5. Здесь средним элементом является 3. Это значение меньше 4 и поэтому первая половина не будет больше рассматриваться и поиск продолжается среди чисел 4 5. На следующем шаге нужный элемент будет найден.
При двоичном поиске число сравнений в худшем случае равно log n. Для среднего случая это значение будет несколько лучше, а в лучшем случае оно равно единице.
Рассматриваемую функцию, которая реализует двоичный поиск для символьных массивов, можно использовать для поиска любой произвольной структуры данных, изменив блок сравнения и определение типа данного "DataItem".
Пример программы
function BSearch (item: DataArray; count:integer;
key:DataItem):integer;
var
low, high, mid: integer;
found:boolean;
begin
low:=1; high:=count;
found:=false; { не найден }
while (low<=high) and (not found) do
begin
mid:=(low+high) div 2;
if key<item[mid] then high:=mid-1
else if key>item[mid] then low:=mid+1
else found:=true; { найден }
end;
if found then BSearch:=mid
else BSearch:=0; { не найден }
end; { конец поиска }
5. 3. Индексно-последовательный поиск
При индексно-последовательном поиске организуется две таблицы:
таблица данных со своими ключами (упорядоченная по возрастанию)
таблица индексов, которая тоже состоит из ключей данных, но эти ключи взяты из основной таблицы через определенный интервал (рис. 5.3).
Сначала производится последовательный поиск в таблице индексов по заданному аргументу поиска. Затем проходим ключ, который оказался меньше заданного и устанавливаем нижнюю границу поиска в основной таблице - low, а затем - верхнюю – hil на которой (kind > key).
Например, key = 101.
Поиск идет не по всей таблице, а от low до hi.
рис. 26 – индексно-последовательный поиск
Эффективность индексно-последовательного поиска
Если считать равновероятным появление всех случаев, то эффективность поиска можно рассчитать следующим образом:
Например, m = n/р, где т - размер индекса; р - размер шага, тогда
Q = (n+1)/2 + (р+1)/2 = (n/р+1)/2 + (р+1)/2 = n/2р+р/2+1
Продифференцируем Q по р и приравняем производную к нулю:
dQ/dp=(d/dp) (n/2p+p/2+]) = -n/2р2 + 1/2 = 0
Следовательно р2 = n; Ропт =
Подставив ропт в выражение для Q, получим следующее количество сравнений:
Порядок эффективности индексно-последовательного поиска О ( )
Методы оптимизации поиска
Существует некоторая вероятность поиска того или иного элемента в таблице. Пусть в таблице данный элемент существует. Тогда вся таблица поиска может быть представлена как система с дискретными состояниями, а вероятность нахождения искомого элемента - p(i), т.е i - го состояния системы.
Количество сравнений при поиске в таблице, представленной как дискретная система, представляет собой математическое ожидание значения дискретной случайной величины, которая определяется вероятностями состояний и номерами состояний системы.
Z=Q=1p(l)+2p(2)+3p(3) +... +nр(n)
Желательно, чтобы р(1)≥р(2)≥р(3) ≥...≥р(п) – это минимизирует количество сравнений и увеличивает эффективность.
Последовательный поиск начинается с первого элемента, значит на это место надо поставить элемент, к которому чаше всего обращаются (с наибольшей вероятностью поиска).