Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы Тех.програм.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
291.5 Кб
Скачать
  1. Метод интерполяционного поиска Интерполяционный поиск

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

Здесь r и l — соответственно правая и левая граница области поиска, k — искомый элемент, al и ar - соответственно левый и правый элемент области поиска.

Рассмотрим пример. Пусть дан массив, упорядоченный по возрастанию.

2

4

5

8

9

16

22

28

36

Пусть требуется найти число k=22. Это число больше крайнего левого и меньше крайнего правого элементов. Следовательно, существует возможность найти его в массиве.

В данном примере l=1, r=9 (областью поиска является весь массив от первого до 9-го элемента включительно, al=2, ar=36

Подставим данные в формулу для вычисления номера элемента.

P=(9 — 1) * ( 22 — 2) / (36 — 2);

P=8*20/34;

P=4,7; (для определенности округлим в большую сторону, P=5.

Рассмотрим элемент с номером l+P=6. Этот элемент равен 16 и он меньше искомого числа. Следовательно, поиск необходимо продолжить в правой части массива (теперь l будет равно 6, . al=16).

2

4

5

8

9

16

22

28

36

Вычислим шаг по формуле

P=(9 — 6)*(22 — 16) / (36 — 16);

P=3*6/20;

P=0,9 (округлим P в большую сторону, P=1).

Рассмотрим элемент номер 7. Он равен искомому числу, поиск окончен.

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

2

4

5

8

9

16

22

280

1000

Тогда в знаменателе формулы получается довольно большое число, которое при маленьких k дает шаг порядка сотых или даже тысячных. В этом случае необходимо округление P в большую сторону. Поэтому данный метод излагается здесь скорее как некое полезное упражнение.

Из-за тонкостей реализации и меньшей очевидности при объяснении, интерполяционный поиск лучше дать просто как некое упражнение на технику программирования, нежели как основной алгоритм, который надо в обязательном порядке уметь писать на олимпиадах.

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

  1. Метод поиска по бору . Алгоритм и его реализация

Бор - это структура данных, позволяющая хранить массив поиска, ключами которого являются строки. Данная структура представляет собой дерево. Переход между вершинами происходит по символу. Справа наглядный пример дерева  для всех суффиксов строки abac. Для простоты понимания рассмотрим самый простой вид хранения префиксного дерева - массив структурnode tree[]. В структуре будем хранить массив переходов с размером равным размеру алфавита в конкретной задаче.

?

1

2

3

struct node{

    int term, num[n]; // вместо n следует подставить размер алфавита.

};

Изначально все значения в массиве переходов равны -1, для удобства проверки существования ребра.