- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •Введение
- •Классификация структур данных
- •Структура оперативной памяти
- •Лабораторная работа 1 методы сортировки постоянных таблиц и поиска в таблицах
- •Методические указания к выполнению работы
- •Определение операции сортировки
- •Линейный выбор (сортировка выбором)
- •Линейный выбор с подсчетом
- •Метод "пузырька"
- •{Описание типов}
- •Шейкер – сортировка
- •Метод вставки с прямым включением
- •Метод вставки с бинарным включением
- •Метод двухпутевой вставки
- •Метод Шелла
- •"Быстрая" сортировка (обменная сортировка с разделением)
- •Метод простого двухпутевого слияния (сортировка слиянием)
- •Метод естественного слияния (сортировка слиянием)
- •Дихотомический поиск по совпадению
- •Дихотомический поиск нескольких записей
- •Дихотомический поиск по близости
- •Дихотомический поиск по интервалу
- •Задание к лабораторной работе
- •Варианты заданий
- •Требования к выполнению лабораторной работы
- •Контрольные вопросы
- •Литература
- •Приложение а Примеры программ, выполняющих сортировку таблицы методом линейного выбора
- •Программа на языке с
- •Приложение в краткое описание системы turbo pascal
- •1. Структура pascal-программы
- •2. Простые типы
- •3. Составные типы
- •4. Операторы
- •5. Процедуры и функции
- •6. Файлы
- •7. Управление консолью
- •Содержание
- •Методические указания и задания
- •К лабораторным работам по курсу
- •«Алгоритмы и структуры данных»
- •(Для студентов обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
Дихотомический поиск по совпадению
Пусть таблица упорядочена по возрастанию значений ключа (K[1] <=K[2]<=...<=K[n]), и нужно найти запись с ключом KL. Предполагается, что в таблице может быть только одна запись с заданным ключом (или ни одной).
Согласно бинарному поиску ключ KL должен сначала сравниться с ключом K[i] записи R[i], находящейся в середине таблицы (i=(ng+vg) div 2). Если KL >K[i], то отбрасывается (то есть больше не рассматривается) левая подтаблица - записи с меньшими ключами (ng=i+1) и поиск продолжается в правой подтаблице. Если KL<K[i], то отбрасывается правая подтаблица - записи с большими ключами (vg=i-1) и дальнейший поиск осуществляется в левой подтаблице.
Процесс деления подтаблиц пополам продолжается до тех пор, пока не возникнет одна из следующих ситуаций:
1) KL=K[i] - запись найдена;
2)KL<>K[i], ng>vg – ключи не совпали, а длина последней подтаблицы равна 1; это означает, что искомой записи в таблице нет.
Средняя длина дихотомического поиска равна log2n - 1. В худшем случае понадобится log2n + 1 сравнений. Это значительно лучше, чем при последовательном поиске.
В качестве примера рассмотрим поиск записи с ключом равным 30 (KL=30) в упорядоченной по возрастанию таблице (приведены ключи записей):
Процедура дихотомического поиска приведена на рисунке 2 (предполагается, что в таблице может быть только одна запись с искомым ключом или ни одной).
Замечание
На практике используется также следующая модификация метода: выбирается наибольшая степень двойки, не превосходящая длину таблицы, и на первом шаге обращаются к записи с номером, равным полученной степени. Если по результатам сравнения одна часть таблицы отбрасывается, то в оставшейся части также выбирается запись с номером, равным наибольшей степени двойки, и так далее.
Дихотомический поиск нескольких записей
Если в таблице может быть несколько записей с заданным значением ключа, то в процедуре поиска нужно определить индекс первой (i1) и индекс последней (i2) записей с этим ключом.
В качестве примера рассмотрим поиск записей с ключом равным 33 (KL=33) в упорядоченной по возрастанию таблице (приводятся ключи записей).
Const Nmax=100;
Type
Rec=Record
kl : integer; {ключ записи}
inf :string[10];{информационное поле}
End;
Table = Array[1..Nmax] Of Rec;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
procedure search(Var T: Table; n, key: integer; var k: integer);
{ T – таблица, n-число записей в таблице, key- значение ключа поиска}
{ k-номер найденной записи (k=0 при неуспешном поиске)}
var
ng ,vg, i: integer;
fl: boolean;
Begin
ng:=1; vg:= n;
fl:=false; k:=0;
while (ng<=vg) and not fl do
begin
i:=(ng+vg) div 2;
if key<T[i].kl then
vg:=i-1
else
if key>T[i].kl then
ng:=i+1
else
begin
fl:=true;
k:=i
end
end
end;
Рисунок 2 – Процедура дихотомического поиска записи
Пример поиска нескольких записей:
Процедура поиска в этом случае имеет вид:
Const Nmax=100;
Type
Rec=Record
kl : integer; {ключ записи}
inf :string[10];{информационное поле}
End;
Table = Array[1..Nmax] Of Rec;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Рrocedure search-2 (Var T: Table; key, n: integer; var i1, i2: integer);
{ T – таблица, n-число записей в таблице, key- значение ключа поиска}
{ i1-номер первой найденной записи, i2-номер последней}
var
ng ,vg, i: integer;
fl: boolean;
Begin
ng:=1; vg:= n; fl:=false;
i1:=0; i2:=0;
while (ng<=vg) and not fl do
begin
i:=(ng+vg) div 2;
if key<T[i].kl then
vg:=i-1
else
if key>T[i].kl then
ng:=i+1
else
begin
fl:=true;
k:=i ;
end ;
end ;
if fl then
begin
i1:=i; i2:=i;
while (i1>1) and (T[i1-1].kl=key) do
i1:=i1-1;
while (i2<n) and (T[i2+1].kl=key) do
i2:=i2+1;
end;
end;