
- •1.1. Цель работы
- •Поразрядная сортировка
- •1.3. Средства Си для реализации поразрядных сортировок
- •1.4.1. Поразрядная сортировка
- •1.5. Порядок выполнения
- •Цель работы
- •Прямой поиск
- •1.3. Бинарный поиск
- •1.4. Интерполяционный поиск
- •1.5. Порядок выполнения работы
- •1.1. Цель работы
- •1.2. Последовательный (прямой) поиск
- •1.3. Алгоритм поиска Кнута
- •1.4. Поиск Боуера-Мура
- •1.5. Порядок выполнения работы
1.5. Порядок выполнения
Получите вариант задания у преподавателя.
Составьте алгоритм поразрядной сортировки.
Реализуйте алгоритм на языке Си.
Проанализируйте полученные результаты.
Организация поиска элементов по заданному ключу
Цель работы
Ознакомиться с основными алгоритмами поиска элементов в массиве. Реализовать на языке Си различные методы поиска.
Прямой поиск
Задача поиска элемента в какой-либо структуре данных сводится к просмотру элементов структуры и последующему возвращению места нахождения искомого элемента. Для данных, хранимых в массивах, это будет индекс. Для динамических структур данных это будет адрес (указатель). Для различных прикладных задач можно модифицировать алгоритм поиска:
найти количество заданных элементов;
если заданных элементов несколько, то найти все элементы;
если заданных элементов несколько, то найти первое вхождение заданного элемента и т.д..
Рассмотрим все алгоритмы для следующей формулировки задачи поиска: найти первое вхождение заданного элемента.
Самый простой и неэффективный метод поиска – прямой поиск. Его алгоритм может быть описан следующим образом:
Поиск(массив X, элемент a)
{n – размер массива X;
ЦИКЛ(
)
ЕСЛИ (X[i]==a) вернуть i;
вернуть -1;
}
Функция возвращает -1, если поиск прошел неуспешно. В случае успеха функция возвращает индекс заданного элемента.
Очевидно, что время поиска прямо пропорционально размеру просматриваемого массива.
Для улучшения прямого поиска можно воспользоваться следующими стратегиями:
пусть в системе высока вероятность того, что ранее найденный элемент будет и далее участвовать в поиске, тогда можно переносить найденный элемент в начало массива; тогда следующий поиск пройдет быстрее;
пусть в системе высока вероятность того, что ранее найденный элемент уже не будет использоваться в поиске, в этом случае перенесем элемент в конец массива.
1.3. Бинарный поиск
Если данные массива упорядочены, то можно сократить время поиска, реализуя следующий алгоритм:
X – массив, n – размерность массива, a – значение для поиска.
F = 0, L = n-1
M = (F+L)/2 // найдем середину массива
ЕСЛИ (a==X[M]) ТО вернуть М // элемент найден
ЕСЛИ (a<X[M]) ТО L = M-1 // далее ищем в левой половине
ЕСЛИ (a]>X[M]) ТО F = M+1 // далее ищем в правой половине
ЕСЛИ (F<L) ТО вернуться на шаг 3.
Вернуть -1 // поиск прошел неуспешно.
Время бинарного
поиска прямо пропорционально
. Т.е. если рассматривается массив из
32 элементов то в самом худшем случае
будет выполнено 5 сравнений, в то время
как при прямом поиске будет выполнено
32 сравнения.
1.4. Интерполяционный поиск
Этот поиск является улучшенной версией бинарного поиска для числовых отсортированных массивов. Предположим, что данные в массиве равномерно распределены на промежутке от 0 и до n. Очевидно, что чем больше значение, тем ближе оно находится к концу массива. Интерполяционный поиск позволяет определить размер массива, в котором будет производиться поиск в зависимости от значения искомого элемента. То есть, если ищется маленькое значение, то точка разделения будет находиться ближе к началу массива. При поиске больших значений точка разделения сдвинется к концу массива.
Алгоритм интерполяционного поиска выглядит следующим образом:
X – массив, n – размерность массива, a – значение для поиска.
F = 0, L = n-1
M = F+(a – x[F])/(X[L]-X[F])(L-F)// найдем точку разделения
ЕСЛИ (a==X[M]) ТО вернуть М // элемент найден
ЕСЛИ (a<X[M]) ТО L = M-1 // далее ищем в левой половине
ЕСЛИ (a>X[M]) ТО F = M+1 // далее ищем в правой половине
ЕСЛИ (F<L) ТО вернуться на шаг 3.
Вернуть -1 // поиск прошел неуспешно.