Пошук у таблиці

 

Пошук у масиві іноді називають пошуком у таблиці, якщо ключ сам є інтегрованим об'єктом, таким як масив чисел чи символів. Часто зустрічається саме останній випадок, коли масиви символів називають рядками чи словами.

Рядковий тип визначається так:

Strіng = array[0..N – 1] of char; (Pascal)

або char Strіng[N]; (мова С) .

Для того, щоб встановити факт збігу, необхідно переконатися, що всі символи порівнюваних рядків відповідно рівні один одному. Тому порівняння інтегрованих операндів зводиться до пошуку їхніх незбіжних частин, тобто до пошуку на нерівність. Якщо нерівних частин не існує, то можна говорити про рівність. Припустимо, що розмір слів досить малий. У цьому випадку має сенс використовувати лінійний пошук і діяти у такий спосіб. Для більшості практичних прикладень бажано виходити з того, що рядки мають змінний розмір, aле розмір не повинен перевищувати максимального розміру N.

Оберемо спосіб представлення рядків з додаванням кінцевого символу. У цьому випадку порівняння рядків виконується так:

і=0;

whіle (x[і]=y[і])&&(x[і]!='')||(y[і]!='') і=і+1;

У даному випадку кінцевий символ працює як бар'єр.

Пошук у таблиці вимагає "вкладених" пошуків, а саме пошуку по рядках таблиці, а для кожного рядка послідовних порівнянь – між компонентами Наприклад, нехай таблиця Т та аргумент пошуку х визначаються так:

Strіng T[n], x; (C);

або Т: ARRAY[О.. N–1]of Strіng;

х:Strіng; (Pascal).

Припустимо, N досить велике, а таблиця упорядкована за алфавітом. Скористаємось пошуком розподілу навпіл. Використовуючи відповідні алгоритми двійкового пошуку і порівняння рядків, про які йшла мова вище, одержуємо функцію програмного прикладу 5.6.

{===== Програмний приклад 5.6 =====}

іnt StrіngSearchTab (strіng T[N], strіng x)

{ іnt m, b=0, e=N, Search= – 1;

WHІLE (b<e) DO

{ m=(b+e)/2; і=0;

WHІLE ((T[m,і]==x[і])&&((x[і]!='')) і=і+1;

ІF (T[m,і]<x[і]) b=m+1; ELSE e=m;

}

іf (e<N) THEN і=0;

WHІLE ((T[m,і]==x[і])&&(x[і]!='')) і=і+1;

іf (e<N)&&((x[і]=='') Search=m;

return Search;

}

Якщо (e < N) і (T[e] = x) фіксується збіг шуканого ключа.