Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sd_lab_1.doc
Скачиваний:
23
Добавлен:
17.11.2018
Размер:
3.44 Mб
Скачать

Дихотомический поиск по совпадению

Пусть таблица упорядочена по возрастанию значений ключа (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;

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