Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 31

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

Листинг 4.8. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск Π² ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΌ связном спискС


function TDSLLSearch(aList : TtdSingleLinkList;

aItem : pointer;

aCompare : TtdCompareFunc) : boolean;

begin

with aList do begin

MoveBeforeFirst;

MoveNext;

while not IsAfterLast do begin

if (aCompare(Examine, aItem) = 0) then begin

Result := true;

Exit;

end;

MoveNext;

end;

end;

Result := false;

end;


function TDSLLSortedSearch(aList : TtdSingleLinkList;

aItem : pointer;

aCompare : TtdCompareFunc) : boolean;

var

CompareResult : integer;

begin

with aList do begin

MoveBeforeFirst;

MoveNext;

while not IsAfterLast do begin

CompareResult := aCompare(Examine, aItem);

if (CompareResult >= 0) then begin

Result := (CompareResult = 0);

Exit;

end;

MoveNext;

end;

end;

Result := false;

end;


Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для класса TtdDoubleLinkList Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅.

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск

Π’ случаС отсортированного списка ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска. Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим Π΅Π³ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ массива, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ для связных списков.

Алгоритм Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для отсортированных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ².

ΠœΠ°ΡΡΠΈΠ²Ρ‹

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас имССтся отсортированный массив. Как Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Ρ€Π°Π½Π΅Π΅, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ использовании Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° Π² случаС отсутствия Π² спискС искомого элСмСнта ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ классу O(n). Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ быстродСйствиС?

ΠžΡ‚Π²Π΅Ρ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск. Он основан Π½Π° стратСгии "раздСляй ΠΈ властвуй": Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌ Π΅Π΅ Π½Π° малСнькиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³Ρ‡Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Π°, Π·Π°Ρ‚Π΅ΠΌ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π΅ΡˆΠ°Π΅ΠΌ всю Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π‘Π΅Ρ€Π΅ΠΌ срСдний элСмСнт массива. Π Π°Π²Π΅Π½ Π»ΠΈ ΠΎΠ½ искомому элСмСнту? Если Π΄Π°, Ρ‚ΠΎ поиск ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ссли искомый элСмСнт мСньшС срСднСго, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, Ссли элСмСнт присутствуСт Π² массивС, ΠΎΠ½ находится Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли искомый элСмСнт большС срСднСго, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ΄Π½ΠΈΠΌ сравнСниСм ΠΌΡ‹ Ρ€Π°Π·Π±ΠΈΠ»ΠΈ Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° Π΄Π²Π΅ части. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ примСняСм Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΊ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ части массива: Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ срСдний элСмСнт ΠΈ опрСдСляСм, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ (Ρ‚ΠΎΡ‡Π½Π΅Π΅ ΡƒΠΆΠ΅ Π² Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ части) находится искомый элСмСнт. ΠœΡ‹ снова Π΄Π΅Π»ΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° Π΄Π²Π΅ части. ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° искомый элСмСнт Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ (разумССтся, Ссли ΠΎΠ½ присутствуСт Π² массивС).

Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π² Π΄Π²Π° Ρ€Π°Π·Π°, быстродСйствиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ O(log(n)), Ρ‚.Π΅. ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌΠ° log(_2_) ΠΎΡ‚ количСства элСмСнтов Π² массивС (Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ количСства элСмСнтов массива Π²ΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ поиска Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄Π²Π° Ρ€Π°Π·Π°).

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выполнСния Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска Π² массивС TList (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ TDTList.pas Π½Π° Web-сайтС ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ²).

Листинг 4.9. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π² отсортированном массивС TList


function TDTListSortedIndexOf(aList : TList; aItem : pointer;

aCompare : TtdCompareFunc) : integer;

var

L, R, M : integer;

CompareResult : integer;

begin

{Π·Π°Π΄Π°Ρ‚ΡŒ значСния для индСксов ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ послСднСго элСмСнтов}

L := 0;

R := pred(aList.Count);

while (L <= R) do begin

{Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ индСкс срСднСго элСмСнта}

M := (L + R) div 2;

{ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ срСднСго элСмСнта с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ}

CompareResult := aCompare(aList.List^[M], aItem);

{Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ срСднСго элСмСнта мСньшС искомого значСния, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π»Π΅Π²Ρ‹ΠΉ индСкс Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π΄ΠΎ срСднСго индСкса}

if (CompareResult < 0) then

L := succ(M)

{Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ срСднСго элСмСнта большС искомого значСния, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²Ρ‹ΠΉ индСкс Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ послС срСднСго индСкса}

else if (CompareResult > 0) then

R := pred(M)

{Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС искомый элСмСнт Π½Π°ΠΉΠ΄Π΅Π½}

else begin

Result := M;

Exit;

end;

end;

Result := -1;

end;


Для описания подмассива, рассматриваСмого Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… - L ΠΈ R, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранят, соотвСтствСнно, Π»Π΅Π²Ρ‹ΠΉ ΠΈ ΠΏΡ€Π°Π²Ρ‹ΠΉ индСксы. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ значСния этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ 0 (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива) ΠΈ Count-1 (послСдний элСмСнт массива). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Ρ†ΠΈΠΊΠ» While, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ΠΉΠ΄Π΅ΠΌ послС обнаруТСния Π² массивС искомого элСмСнта ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ L прСвысит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ R, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ искомый элСмСнт Π² массивС отсутствуСт. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° вычисляСтся индСкс срСднСго элСмСнта (фактичСски это срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ L ΠΈ R). Π—Π°Ρ‚Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта со срСдним индСксом сравниваСтся с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ срСднСго элСмСнта мСньшС, Ρ‡Π΅ΠΌ искомоС, ΠΌΡ‹ пСрСносим Π»Π΅Π²Ρ‹ΠΉ индСкс Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ послС срСднСго. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΡ‹ пСрСносим ΠΏΡ€Π°Π²Ρ‹ΠΉ индСкс Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ срСдним. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ опрСдСляСм Π½ΠΎΠ²Ρ‹ΠΉ подмассив для поиска. Если ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ срСднСго элСмСнта Ρ€Π°Π²Π½ΠΎ искомому, поиск Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° рис. 4.1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ шаги, выполняСмыС ΠΏΡ€ΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ поискС Π±ΡƒΠΊΠ²Ρ‹ d Π² отсортированном массивС, содСрТащСм Π±ΡƒΠΊΠ²Ρ‹ ΠΎΡ‚ a Π΄ΠΎ k. На шагС (Π°) пСрСмСнная L ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт (индСкс 0), Π° R - Π½Π° послСдний (индСкс 10). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ M Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ 5. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ выполняСм сравнСниС: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта с индСксом 5 Ρ€Π°Π²Π½ΠΎ f, Π° это большС искомого значСния d.


Рисунок 4.1. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π² массивС


Богласно Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ, ΠΌΡ‹ устанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ R Ρ€Π°Π²Π½Ρ‹ΠΌ M-1 (Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, правая Π³Ρ€Π°Π½ΠΈΡ†Π° подмассива Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ находится слСва ΠΎΡ‚ срСднСго элСмСнта). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ R Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π²Π½ΠΎ 4. НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ срСднСго индСкса Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 2, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° шагС (b). ВыполняСм сравнСниС: Π±ΡƒΠΊΠ²Π° c (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта с индСксом 2) мСньшС, Ρ‡Π΅ΠΌ d.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Π² соотвСтствии с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ индСкс L Π·Π° индСксом M (Ρ‚.Π΅. M+1 ΠΈΠ»ΠΈ 3). НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ M Π½Π° шагС (с) Ρ€Π°Π²Π½ΠΎ 3. ВыполняСм сравнСниС: элСмСнт с индСксом 3 содСрТит Π±ΡƒΠΊΠ²Ρƒ d, Π° это ΠΈ Π΅ΡΡ‚ΡŒ нашС искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Поиск Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

БвязныС списки

Π˜Π·ΡƒΡ‡Π°Ρ ΠΊΠΎΠ΄ листинга 4.9, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ΄Ρ‚ΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ маловСроятно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск использовался для связных списков, Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ индСксным доступом ΠΊ элСмСнтам списка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ 3, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ сниТСнию быстродСйствия.

Но, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, рСализация Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска для связных списков оказываСтся Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΆ ΠΈ Π½Π΅Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ ссылкС выполняСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС, Π½Π΅ΠΆΠ΅Π»ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ ссылкС - это "Ρ…ΠΎΡ€ΠΎΡˆΠΎ", Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния - "ΠΏΠ»ΠΎΡ…ΠΎ". Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ слСдуСт ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния. (ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для нас функция сравнСния - "Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик", ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ трСбуСтся Π½Π° Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΌΠ°Π»ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌ Π½Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ ссылкС.) Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ "внутрСнностям" связного списка.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Β­ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ связного списка, Π° Π·Π°Ρ‚Π΅ΠΌ рассмотрим ΠΊΠΎΠ΄ для классов TtdSingleLinkList ΠΈ TtdDoubleLinkList. Для нашСго ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ связного списка Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ извСстно количСство содСрТащихся Π² Π½Π΅ΠΌ элСмСнтов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ понадобится ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ связный список содСрТит Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π».

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сам Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

1. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ BeforeCount.

2. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ количСство элСмСнтов Π² спискС Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ListCount.

3. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ListCount Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, искомого элСмСнта Π½Π΅Ρ‚ Π² спискС, ΠΈ поиск Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ значСния ListCount, ΠΏΡ€ΠΈ нСобходимости ΠΎΠΊΡ€ΡƒΠ³Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ MidPoint.

4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ BeforeCount ΠΏΠΎ ссылкам Next Π½Π° MidPoint ΡƒΠ·Π»ΠΎΠ².

5.Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта Π² ΡƒΠ·Π»Π΅, Π³Π΄Π΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»Π°ΡΡŒ пСрСмСнная BeforeCount, с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Если значСния Ρ€Π°Π²Π½Ρ‹, искомый элСмСнт Π½Π°ΠΉΠ΄Π΅Π½ ΠΈ поиск Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

6. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΡƒΠ·Π»Π΅ мСньшС, Ρ‡Π΅ΠΌ искомоС, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠ·Π΅Π» Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ BeforeCount, Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MidPoint ΠΈΠ· значСния ListCount ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡˆΠ°Π³Ρƒ 3.

7. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΡƒΠ·Π»Π΅ большС, Ρ‡Π΅ΠΌ искомоС, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MidPoint-1 Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ListCount ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡˆΠ°Π³Ρƒ 3.


Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ€Π°Π±ΠΎΡ‚Ρƒ этого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ имССтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ связный список ΠΈΠ· пяти ΡƒΠ·Π»ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ ΡƒΠ·Π΅Π» B:


ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π» --> A --> B --> C --> D --> E --> nil


На ΠΏΠ΅Ρ€Π²ΠΎΠΌ шагС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ BeforeList присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, Π° Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ListCount присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5. Π”Π΅Π»ΠΈΠΌ ListCount Π½Π° Π΄Π²Π°, округляСм Π΄ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ, ΠΈ присваиваСм ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (3) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ MidPoint (шаг 3). По ссылкам ΠΎΡ‚ ΡƒΠ·Π»Π° BeforeList отсчитываСм Ρ‚Ρ€ΠΈ ΡƒΠ·Π»Π°: A, B, C (шаг 4). Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» с искомым (шаг 5). Π•Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ большС искомого B, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, устанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ListCount Ρ€Π°Π²Π½Ρ‹ΠΌ 2 (шаг 7). Π•Ρ‰Π΅ Ρ€Π°Π· выполняСм Ρ†ΠΈΠΊΠ». Π”Π΅Π»ΠΈΠΌ ListCount Π½Π° Π΄Π²Π°, округляСм Π΄ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 1 (шаг 3). По ссылкам ΠΎΡ‚ ΡƒΠ·Π»Π° BeforeList отсчитываСм ΠΎΠ΄ΠΈΠ½ ΡƒΠ·Π΅Π»: А (шаг 4). Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π° с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ (шаг 5). Оно мСньшС значСния B, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, записываСм Π² BeforeList Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° B, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ListCount присваиваСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 (шаг 6) ΠΈ снова выполняСм Ρ†ΠΈΠΊΠ». Π’ этот Ρ€Π°Π· MidPoint ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 (Ρ‚.Π΅. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ListCount, Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π½Π° Π΄Π²Π° ΠΈ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½ΠΎΠ΅ Π΄ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ). ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ссылкС ΠΎΡ‚ ΡƒΠ·Π»Π° BeforeList Π½Π° ΠΎΠ΄ΠΈΠ½ шаг ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ искомый ΡƒΠ·Π΅Π».