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

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

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

Если массив Π½Π΅ отсортирован, для поиска ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ СдинствСнный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ: Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с искомым. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚Π°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ»Π° For. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ поиск значСния 42 Π² массивС ΠΈΠ· 100 Ρ†Π΅Π»Ρ‹Ρ… чисСл:


var

MyArray : array[0..99] of integer;

Inx : integer;

begin

for Inx := 0 to 99 do

if MyArray[Inx] = 42 then

Break;

if (Inx = 100) then

.. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 42 Π½Π΅ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ..

else

.. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 42 Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² элСмСнтС с индСксом Inx ..


Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ просто, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? Код выполняСт Ρ†ΠΈΠΊΠ» ΠΏΠΎ всСм элСмСнтам массива, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ заканчивая послСдним, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Break для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ искомому 42. (ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Break ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, здСсь ΠΎΠ½ Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ отличаСтся ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° goto.) ПослС Ρ†ΠΈΠΊΠ»Π°, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π°ΠΉΠ΄Π΅Π½ Π»ΠΈ элСмСнт, провСряСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Ρ†ΠΈΠΊΠ»Π° Inx.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, сколько Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ нашли ΠΎΡˆΠΈΠ±ΠΊΡƒ? ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² языкС Object Pascal ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†ΠΈΠΊΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π² случаС ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ†ΠΈΠΊΠ»Π°, скаТСм, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Break, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†ΠΈΠΊΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

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

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


var

MyArray : array[0..99] of integer;

Inx : integer;

FoundIt : boolean;

begin

FoundIt := false;

for Inx := 0 to 99 do

if MyArray[Inx] = 42 then begin

FoundIt := true;

Break;

end;

if not FoundIt then

.. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 42 Π½Π΅ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ..

else

.. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 42 Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² элСмСнтС с индСксом Inx ..


А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ поиска элСмСнта Π² массивС TList с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния (Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ TDTList.pas Π½Π° Web-сайтС ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ²). Если искомый элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возвращаСтся индСкс элСмСнта.

Листинг 4.5. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск Π² нСсортированном массивС TList


function TDTListIndexOf(aList : TList; aItem : pointer;

aCompare : TtdCompareFunc) : integer;

var

Inx : integer;

begin

for Inx := 0 to pred(aList.Count) do

if (aCompare(aList.List^[Inx], aItem) = 0) then begin

Result := Inx;

Exit;

end;

{Ссли ΠΌΡ‹ ΠΏΠΎΠΏΠ°Π»ΠΈ сюда, Π·Π½Π°Ρ‡ΠΈΡ‚ искомый элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½}

Result := -1;

end;


Π­Ρ‚Π° функция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ TList.IndexOf, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для поиска элСмСнта Π² массивС ΠΏΡƒΡ‚Π΅ΠΌ сравнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. ЀактичСски ΠΎΠ½ Π² своСм Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ спискС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ осущСствляСт поиск элСмСнта ΠΊΠ°ΠΊ указатСля. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, функция TDTListIndexOf осущСствляСт поиск самого элСмСнта, вызывая для сравнСния искомого ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сравнСния. Ѐункция сравнСния ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ просто значСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π²ΠΎ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² класс ΠΈΠ»ΠΈ запись, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ поля.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ†Π΅Π»ΡŒΡŽ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности примСняСтся нСбольшая Ρ…ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒ. ВмСсто сравнСния aItem с aList[Inx] выполняСтся сравнСниС с aList.List^[Inx]. Π—Π°Ρ‡Π΅ΠΌ? ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ сравнСниС Π² Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ вызываСмая функция, TList.Get, ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ указатСля ΠΈΠ· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ массива ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ провСряСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ индСкс Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ попадания Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 0 Π΄ΠΎ количСства элСмСнтов (вызывая ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ссли условиС Π½Π΅ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ). Но ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ индСкс находится Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ†ΠΈΠΊΠ» ΠΎΡ‚ 0 Π΄ΠΎ количСства элСмСнтов минус 1. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Items ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ TList.Get. МоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ нСпосрСдствСнно ΠΊ массиву ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (свойство List экзСмпляра TList).

-----

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

-----

Π’ классС TtdRecordList (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описан Π² Π³Π»Π°Π²Π΅ 2) для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ IndexOf (см. листинг 4.6).

Листинг 4.6. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° TtdRecordList.IndexOf


function TtdRecordList.IndexOf(aItem : pointer;

aCompare : TtdCompareFunc) : integer;

var

ElementPtr : PAnsiChar;

i : integer;

begin

ElementPtr := FArray;

for i := 0 to pred(Count) do begin

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

Result := i;

Exit;

end;

inc(ElementPtr, FElementSize);

end;

Result := -1;

end;


Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, врСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ зависит ΠΎΡ‚ количСства элСмСнтов Π² массивС. Π’ Π»ΡƒΡ‡ΡˆΠ΅ΠΌ случаС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ элСмСнт с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ (Ссли ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² массивС), Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌ Π΅Π³ΠΎ Π² самом ΠΊΠΎΠ½Ρ†Π΅, послС просмотра всСх элСмСнтов. Π’ срСднСм для массива Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ n для обнаруТСния искомого элСмСнта придСтся ΠΏΡ€ΠΎΠΉΡ‚ΠΈ n/2 элСмСнтов. Π’ любом случаС, Ссли искомого элСмСнта Π½Π΅Ρ‚ Π² массивС, Π±ΡƒΠ΄ΡƒΡ‚ просмотрСны всС n элСмСнтов. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, опСрация ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ классу O(n).

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

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

Листинг 4.7. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск Π² отсортированном массивС TList


function TDTListSortedIndexOf(aList : TList; aItem : pointer;

aCompare : TtdCompareFunc) : integer;

var

Inx, CompareResult : integer;

begin

{ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт больший ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΉ элСмСнту aItem}

for Inx := 0 to pred(aList.Count) do begin

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

if (CompareResult >= 0) then begin

if (CompareResult = 0) then

Result := Inx

else

Result := -1;

Exit;

end;

end;

{Ссли ΠΌΡ‹ ΠΏΠΎΠΏΠ°Π»ΠΈ сюда, Π·Π½Π°Ρ‡ΠΈΡ‚ искомый элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½}

Result := -1;

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ функция сравнСния вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π°. ΠœΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ функция aCompare - для нас это "Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик". Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΠΆΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ сохраняСм ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ПослС этого ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Ρ€Π°Π·, Π½Π΅ вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, привСдСнная функция поиска нисколько Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ обнаруТСния искомого элСмСнта, Ссли искомый элСмСнт присутствуСт Π² массивС (Π² срСднСм, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½Π΅Π΅, для этого потрСбуСтся провСсти n/2 сравнСний). ЕдинствСнным Π΅Π΅ прСимущСством ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ отсутствии искомого элСмСнта Π² массивС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ быстрСС. Π‘ΠΊΠΎΡ€ΠΎ ΠΌΡ‹ рассмотрим Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ быстродСйствиС Π² ΠΎΠ±ΠΎΠΈΡ… случаях.

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

Π’ связных списках ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск выполняСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² массивах. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, элСмСнты проходятся Π½Π΅ ΠΏΠΎ индСксу, Π° ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Next. Для класса TtdSingleLinkList, описанного Π² Π³Π»Π°Π²Π΅ 3, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π²Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: пСрвая - для выполнСния поиска ΠΏΠΎ нСсортированному связному списку, ΠΈ вторая - ΠΏΠΎ отсортированному. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ просто ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Π½Π°ΠΉΠ΄Π΅Π½ Π»ΠΈ искомый элСмСнт. Π’ случаС, Ссли элСмСнт Π½Π°ΠΉΠ΄Π΅Π½, список Π±ΡƒΠ΄Π΅Ρ‚ установлСн Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ искомого элСмСнта. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для отсортированного списка курсор Π±ΡƒΠ΄Π΅Ρ‚ установлСн Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ искомый элСмСнт, Ρ‡Ρ‚ΠΎΠ±Ρ‹ список оставался отсортированным.