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

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

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

ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ·Π΅Π» --> 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 Π½Π° ΠΎΠ΄ΠΈΠ½ шаг ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ искомый ΡƒΠ·Π΅Π».

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

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° функция Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска для класса TtdSingleLinkList.

Листинг 4.10. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π² отсортированном ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΌ связном спискС


function TtdSingleLinkList.SortedFind(aItem : pointer;

aCompare : TtdCompareFunc) : boolean;

var

BLCursor : PslNode;

BLCursorIx : longint;

WorkCursor : PslNode;

WorkParent : PslNode;

WorkCursorIx : longint;

ListCount : longint;

MidPoint : longint;

i : integer;

CompareResult :integer;

begin

{ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ}

BLCursor := FHead;

BLCursorIx := -1;

ListCount := Count;

{ΠΏΠΎΠΊΠ° Π² спискС ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΡƒΠ·Π»Ρ‹...}

while (ListCount <> 0) do begin

{Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ срСднСй Ρ‚ΠΎΡ‡ΠΊΠΈ; ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 1}

MidPoint := (ListCount + 1) div 2;

{ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π²ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΎ срСднСй Ρ‚ΠΎΡ‡ΠΊΠΈ}

WorkCursor := BLCursor;

WorkCursorIx := BLCursorIx;

for i := 1 to MidPoint do begin

WorkParent := WorkCursor;

WorkCursor := WorkCursor^.slnNext;

inc(WorkCursorIx);

end;

{ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ}

CompareResult := aCompare(WorkCursor^.slnData, aItem);

{Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° мСньшС искомого, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ списка ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ»}

if (CompareResult < 0) then begin

dec(ListCount, MidPoint);

BLCursor := WorkCursor;

BLCursorIx := WorkCursorIx;

end

{Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° большС искомого, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ списка ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ»}

else if (CompareResult > 0) then begin

ListCount := MidPoint - 1;

end

{Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ; ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ курсор Π½Π° Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π»}

else begin

FCursor := WorkCursor;

FParent := WorkParent;

FCursorIx := WorkCursorIx;

Result := true;

Exit;

end;

end;

Result := false;

end;


Ѐункция Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска для класса TtdDoubleLinkList Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Вставка элСмСнта Π² отсортированный ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ отсортированный массив ΠΈΠ»ΠΈ связный список, Ρƒ нас сущСствуСт Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° поддСрТания порядка элСмСнтов. МоТно сначала Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ элСмСнты Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡ… ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΡ€ΠΈ вставкС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ вставки Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, вставив Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ останСтся отсортированным. Если прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² отсортированном Π²ΠΈΠ΄Π΅, Ρ‚ΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΡ€ΠΈ вставкС ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок элСмСнтов.

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС наша Π·Π°Π΄Π°Ρ‡Π° сводится ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ полоТСния Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π² отсортированном спискС. ПослС опрСдСлСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΡ‹ просто вставляСм Π² Π½Π΅Π΅ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт. Π Π°Π½Π΅Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ вставки, Π½ΠΎ, ΠΊ соТалСнию, быстродСйствиС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска достаточно Π½ΠΈΠ·ΠΊΠΎΠ΅. МоТно Π»ΠΈ для опрСдСлСния Ρ‚ΠΎΡ‡ΠΊΠΈ вставки Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ поиском?

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска для массива, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π² листингС 4.9. Когда Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΈ искомый элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° основании Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… L, R ΠΈ M? Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ L>R. Рассмотрим, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° Π² послСдний Ρ€Π°Π·. Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ L=R ΠΈΠ»ΠΈ L=R-1. ΠŸΡ€ΠΈ этом вычислСниС даст, Ρ‡Ρ‚ΠΎ M=L. Если Π±Ρ‹ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ L ΠΈ R Π±Ρ‹Π»Π° большС, скаТСм, L=R-2, Ρ‚ΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ M ΠΏΠΎΠΏΠ°Π»ΠΎ Π±Ρ‹ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΌΠ΅ΠΆΠ΄Ρƒ L ΠΈ R, ΠΈ Ρ†ΠΈΠΊΠ» Π±Ρ‹Π» Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

Если ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° Π² послСдний Ρ€Π°Π· искомый элСмСнт Π±Ρ‹Π» мСньшС, Ρ‡Π΅ΠΌ элСмСнт Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ M, Ρ‚ΠΎ пСрСмСнная R ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° Π±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ M-1, ΠΈ Ρ†ΠΈΠΊΠ» Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ Π±Ρ‹. ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ искомого значСния Π½Π΅ Π±Ρ‹Π»ΠΎ Π΄ΠΎ элСмСнта M, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ вставлСн ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами M-1 ΠΈ M. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΌΡ‹ вставляСм элСмСнт Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ M.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли Π±Ρ‹ искомый элСмСнт Π±Ρ‹Π» большС элСмСнта Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ M, Ρ‚ΠΎ пСрСмСнная L ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° Π±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ M+1. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ†ΠΈΠΊΠ»Π° L=R. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρ†ΠΈΠΊΠ» Π±Ρ‹Π» Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ искомого значСния Π½Π΅ Π±Ρ‹Π»ΠΎ послС элСмСнта M, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ вставлСн ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами M ΠΈ M+1. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΌΡ‹ вставляСм элСмСнт Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ M+1.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ M ΠΈΠ»ΠΈ M+1 Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΡ€ΠΈ послСднСм Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π°. Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ Π΅Ρ‰Π΅ Ρ€Π°Π·. Π Π°Π·Π²Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ описанными двумя случаями Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ? ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π° мСсто вставки Π² ΠΎΠ±ΠΎΠΈΡ… случаях ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ L. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вставка выполняСтся Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ L.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ листингС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² массив TList. Π’ ΠΊΠΎΠ΄Π΅ прСдполагаСтся, Ρ‡Ρ‚ΠΎ Ссли вновь вставляСмый элСмСнт ΡƒΠΆΠ΅ присутствуСт Π² массивС, вставка Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ (Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ элСмСнтов Π½Π΅ допускаСтся). Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСкс вставлСнного элСмСнта. Π›Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ привСдСнная функция Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Π² случаС, ΠΊΠΎΠ³Π΄Π° список ΠΏΠ΅Ρ€Π΅Π΄ вставкой пуст.

Листинг 4.11. Вставка элСмСнта Π² отсортированный массив TList с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска


function TDTListSortedInsert(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 := L;

aList.Insert(L, aItem);

end;


Для связного списка функция Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ индСкс для вставки Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта. Поиск сам ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ вставки элСмСнта.

РСзюмС

Π­Ρ‚Π° Π³Π»Π°Π²Π° Π±Ρ‹Π»Π° посвящСна поиску. Π‘Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ выполняСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска для отсортированных массивов ΠΈ связных списков. Π‘Ρ‹Π»ΠΎ Π΄ΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ для отсортированных ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС Π±ΡƒΠ΄Π΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ рассмотрСли использованиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска для вставки Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ мСсто отсортированного массива.

Π“Π»Π°Π²Π° 5. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΡ€ΠΈ повсСднСвном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ встрСчаСтся ΠΎΡ‡Π΅Π½ΡŒ часто. Когда Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ выводится ΠΏΠΎΠ»Π΅ со списком, Π΅Π³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ Π»Π΅Π³Ρ‡Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли элСмСнты Π² спискС отсортированы Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС. ΠœΡ‹, ΠΊΠ°ΠΊ люди, ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ порядкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ распрСдСлСниС Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, ΠΊΠ°ΠΊ слоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΎΠΉ, Ссли Π±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° отсортирована Π½Π΅ ΠΏΠΎ фамилиям Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС, Π° Π² ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌ порядкС. Π“Π»Π°Π²Ρ‹ Π² этой ΠΊΠ½ΠΈΠ³Π΅, ΠΊΠ°ΠΊ ΠΈ Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ, располоТСны Π² соотвСтствиС с ΠΈΡ… Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ. Π§Ρ‚ΠΎ касаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚ΠΎ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ссли Π΄Π°Π½Π½Ρ‹Π΅ отсортированы. НапримСр, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ поиска быстрСС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска ΠΏΡ€ΠΈ большом количСствС элСмСнтов Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, поэтому Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π² скорости поиска, ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ отсортированный порядок элСмСнтов.