Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodicheskie_ukazania (2).doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
199.17 Кб
Скачать

1.5. Порядок выполнения

  • Получите вариант задания у преподавателя.

  • Составьте алгоритм поразрядной сортировки.

  • Реализуйте алгоритм на языке Си.

  • Проанализируйте полученные результаты.

Организация поиска элементов по заданному ключу

    1. Цель работы

Ознакомиться с основными алгоритмами поиска элементов в массиве. Реализовать на языке Си различные методы поиска.

    1. Прямой поиск

Задача поиска элемента в какой-либо структуре данных сводится к просмотру элементов структуры и последующему возвращению места нахождения искомого элемента. Для данных, хранимых в массивах, это будет индекс. Для динамических структур данных это будет адрес (указатель). Для различных прикладных задач можно модифицировать алгоритм поиска:

  • найти количество заданных элементов;

  • если заданных элементов несколько, то найти все элементы;

  • если заданных элементов несколько, то найти первое вхождение заданного элемента и т.д..

Рассмотрим все алгоритмы для следующей формулировки задачи поиска: найти первое вхождение заданного элемента.

Самый простой и неэффективный метод поиска – прямой поиск. Его алгоритм может быть описан следующим образом:

Поиск(массив X, элемент a)

{nразмер массива X;

ЦИКЛ( )

ЕСЛИ (X[i]==a) вернуть i;

вернуть -1;

}

Функция возвращает -1, если поиск прошел неуспешно. В случае успеха функция возвращает индекс заданного элемента.

Очевидно, что время поиска прямо пропорционально размеру просматриваемого массива.

Для улучшения прямого поиска можно воспользоваться следующими стратегиями:

  • пусть в системе высока вероятность того, что ранее найденный элемент будет и далее участвовать в поиске, тогда можно переносить найденный элемент в начало массива; тогда следующий поиск пройдет быстрее;

  • пусть в системе высока вероятность того, что ранее найденный элемент уже не будет использоваться в поиске, в этом случае перенесем элемент в конец массива.

1.3. Бинарный поиск

Если данные массива упорядочены, то можно сократить время поиска, реализуя следующий алгоритм:

  1. Xмассив, nразмерность массива, aзначение для поиска.

  2. F = 0, L = n-1

  3. M = (F+L)/2 // найдем середину массива

  4. ЕСЛИ (a==X[M]) ТО вернуть М // элемент найден

  5. ЕСЛИ (a<X[M]) ТО L = M-1 // далее ищем в левой половине

  6. ЕСЛИ (a]>X[M]) ТО F = M+1 // далее ищем в правой половине

  7. ЕСЛИ (F<L) ТО вернуться на шаг 3.

  8. Вернуть -1 // поиск прошел неуспешно.

Время бинарного поиска прямо пропорционально . Т.е. если рассматривается массив из 32 элементов то в самом худшем случае будет выполнено 5 сравнений, в то время как при прямом поиске будет выполнено 32 сравнения.

1.4. Интерполяционный поиск

Этот поиск является улучшенной версией бинарного поиска для числовых отсортированных массивов. Предположим, что данные в массиве равномерно распределены на промежутке от 0 и до n. Очевидно, что чем больше значение, тем ближе оно находится к концу массива. Интерполяционный поиск позволяет определить размер массива, в котором будет производиться поиск в зависимости от значения искомого элемента. То есть, если ищется маленькое значение, то точка разделения будет находиться ближе к началу массива. При поиске больших значений точка разделения сдвинется к концу массива.

Алгоритм интерполяционного поиска выглядит следующим образом:

  1. Xмассив, nразмерность массива, aзначение для поиска.

  2. F = 0, L = n-1

  3. M = F+(ax[F])/(X[L]-X[F])(L-F)// найдем точку разделения

  4. ЕСЛИ (a==X[M]) ТО вернуть М // элемент найден

  5. ЕСЛИ (a<X[M]) ТО L = M-1 // далее ищем в левой половине

  6. ЕСЛИ (a>X[M]) ТО F = M+1 // далее ищем в правой половине

  7. ЕСЛИ (F<L) ТО вернуться на шаг 3.

  8. Вернуть -1 // поиск прошел неуспешно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]