
- •1.Этапы подготовки и решения задач на эвм.
- •1. Введение
- •2. Постановка задачи
- •3. Математическое описание задачи
- •4. Выбор и обоснование метода
- •5. Алгоритмизация вычислительного процесса
- •6. Составление программы
- •7. Отладка программы
- •8. Решение задачи на эвм и анализ результатов
- •2. Понятие подпрограммы, модуля и функции.
- •Условный оператор if
- •If (условие) оператор_1; else оператор_2;
- •If (условие) { оператор_1; оператор_2; … }
- •Оператор варианта switch
- •Цикл for
- •Цикл while
- •Цикл do while
- •Структурный тип данных – массив
- •Одномерные и двумерные массивы
- •Функция
- •Комбинированный тип данных – запись.
- •Работа с файлами
- •Указатели. Динамические переменные. Их использование
- •Применение связынных списков , очередей . И.Т.Д Очереди, стеки, связанные списки и деревья
- •Итеративные алгоритмы..
- •Невычислительные задачи
- •Последовательный поиск
- •Бинарный поиск
- •Метод поиска по бинарному дереву Теория
- •Вставка и удаление
- •Метод интерполяционного поиска Интерполяционный поиск
- •Метод поиска по бору . Алгоритм и его реализация
- •Добавление новой строки в бор:
- •Поиск строки в боре:
- •Реализация:
- •Методы хранения бора:
- •Сортировка простым выбором
- •Сортировка методом простой вставки
- •Метод сортировки бинарной вставкой
- •Метод сортировки стандартным обменом Стандартный обмен
- •Шейкерная сортировка
- •Метод сортировки Шелла.
Метод интерполяционного поиска Интерполяционный поиск
Данный метод, также как и бинарный поиск, требует чтобы массив был упорядочен по возрастанию или убыванию. Работа этого метода также аналогична предыдущему, с той только разницей, что на каждом шаге рассматривается элемент, находящийся не в середине текущей части массива, а в позиции, которая находится от начальной на расстоянии, определяемом по формуле:
Здесь 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 в большую сторону. Поэтому данный метод излагается здесь скорее как некое полезное упражнение.
Из-за тонкостей реализации и меньшей очевидности при объяснении, интерполяционный поиск лучше дать просто как некое упражнение на технику программирования, нежели как основной алгоритм, который надо в обязательном порядке уметь писать на олимпиадах.
Для олимпиадного программирования более чем достаточно бинарного поиска, но зато доведенного до идеального написания.
Метод поиска по бору . Алгоритм и его реализация
Бор - это структура данных, позволяющая хранить массив поиска, ключами которого являются строки. Данная структура представляет собой дерево. Переход между вершинами происходит по символу. Справа наглядный пример дерева для всех суффиксов строки abac. Для простоты понимания рассмотрим самый простой вид хранения префиксного дерева - массив структурnode tree[]. В структуре будем хранить массив переходов с размером равным размеру алфавита в конкретной задаче.
?
1 2 3 |
struct node{ int term, num[n]; // вместо n следует подставить размер алфавита. }; |
Изначально все значения в массиве переходов равны -1, для удобства проверки существования ребра.