logo

Qidiruv algoritmlari

Загружено в:

12.08.2023

Скачано:

0

Размер:

255.78515625 KB
Mundarija
Kirish. Qidiruv algoritmlari ............................................................................................. 2
I bob. Chiziqli qidiruv ..................................................................................................... 5
1.1.Chiziqli qidiruv algoritmi ishlashi ............................................................................. 5
1.2.Chiziqli qidiruv algoritmining c++ tilida dasturi ....................................................... 6
1.3.Chiziqli qidiruv algoritmining murakkabliklari ......................................................... 7
II bob. Ikkilik qidiruv algoritmi ....................................................................................... 7
2.1.Ikkilik qidiruv algoritmi ishlashi ............................................................................... 7
2.2.Ikkilik qidiruv algoritmining c++ tilida dasturi ....................................................... 10
2.3.Ikkilik qidiruv algoritmining murakkabligi ............................................................. 11
III BOB.Satrlarda qismiy satrlarni qidirish algortmlari. ................................................ 11
3.1 Qismiy satrlarni qidirish algoritmlarining turlari ................................................... 13
3.2.Kenglik bo’yicha izlash algoritmi(bfs). ................................................................... 19
3.3.QISMIY SATRLARNI QIDIRISH ALGORITMI ............................................................. 20
XULOSA ........................................................................................................................ 22
Manbalar ..................................................................................................................... 23
1 Kirish. Qidiruv algoritmlari
Ro‘yxatdan   zarur   axborotni   qidirish   -   nazariy   dasturlashning   fundamental
masalalaridan   biri   hisoblanadi.   Qidiruv   algoritmini   tahlil   qilishda,   qidirilayotgan
axborot kompyuterda ma‘lumotlar massivi ko‘rinishida joylashgan deb faraz qilamiz.
Yozuvlar   yoki   ro‘yxat   elementlari   massivda   ketma-ket   joylashadi   va   ular   o‘rtasida
bo‘shliq   yo‘q.   Ro‘yxatdagi   yozuvlar   1   dan   N   gacha   tartiblangan   bo‘ladi.   Aslida
yozuvlar   maydonlardan   tashkil   topgan   bo‘ladi,   bizni   kalit   deb   ataluvchi
maydonlardan   bittasining   qiymati   qiziqtiradi.   Ro‘yxatlar   kalit   maydonlari   qiymati
bo‘yicha   tartiblangan   yoki   tartiblanmagan   bo‘lishi   mumkin.   Aniq   qiymatni   qidirish
masalasi   biror   elementni   tanlash   masalasi   bilan   bog‘liq.   Aytaylik,   bizga   kattaligi
bo‘yicha beshinchi element, oxiridan yettinchi yoki o‘rta qiymatli element kerak.
Qidiruv   -   bu   kompyuter   xotirasida   ma‘lumotlarni   qayta   ishlash   jarayonida
qo‘llaniladigan   asosiy   amallardan   biri   hisoblanadi.   Bu   amalning   mazmuni   shundan
iboratki,   berilgan   argument   bo‘yicha   massiv   elementlari   orasidan   shu   argumentga
mos ma‘lumotni (elementni) aniqlashdan iborat.
Ixtiyoriy ma‘lumot (yoki tuzilma) elementi qandaydir belgisi bilan boshqasidan
farq   qiladi.   Ushbu   belgi   kalit   deyiladi.   Kalit   takrorlanmas   bo‘lishi   mumkin,   ya‘ni
tuzimadagi   mavjud   bitta   element   uchun   aynan   shu   kalit   qo‘llaniladi.   Bunday   kalit
birlamchi   deb   ataladi.   Elementlarning   ma‘lum   guruhi   uchun   takrorlanishi   mumkin
bo‘lgan kalit  ikkilamchi  kalit deyiladi, ushbu kalit bo‘yicha ham qidiruv tashkil qilish
mumkin.   Ma‘lumot   elementlarining   kalitlari   alohida   joyda   to‘plangan   (boshqa
jadvalda)   bo‘lishi   yoki   o‘zi   alohida   yozuvdagi   biror   bir   maydonda   saqlanishi
mumkin.   Bunday   ajratib   olingan   yoki   alohida   faylda   saqlanadigan   tashqi   kalit
deyiladi. Agar kalit yozuvda joylashgan bo‘lsa, u holda  ichki kalit  deyiladi.
Berilgan   argument   bo‘yicha   qidiruv   berilgan   argument   kaliti   bilan   aniqlangan
algoritm   deyiladi.   Qidiruv   algoritmi   ishlashi   natijasi   ushbu   ma‘lumotda   joylashishi
mumkin   yoki   u   jadvalda   mavjud   bo‘lmasligi   mumkin.   Ma‘lumotning   mavjud
bo‘lmaslik holati ikkita amalda yuz berishi mumkin:
berilgan qiymatning yo‘qligini aniqlashda;
berilgan qiymatni jadvalga qo‘yishda.
Masalan, bizga ro‘yxat elementi kaliti sifatida   k   berilgan bo‘lsin. Har bir   k(i)   kalitda
r(i)- ma‘lumot   mavjud.   Qidiruv   argumenti   -   Key .   Unga   yozuv   ma‘lumoti   rec   mos
keladi.   Jadvalda   ma‘lumotlar   tuzilmasiga   bog‘liq   holda   qidiruvning   bir   nechta
shakllari farqlanadi.
Bu masalani yechish uchun ikki xil yondoshuv mavjud: ketma-ket qidiruv va
indeksli ketma-ket qidiruv. Ushbu qidiruv algoritmlarini o‘rganib chiqamiz.
2 Qidiruv   algoritmlarida   biror   aniq   elementni   mavjud   ro‘yxat   elementlarini   birma-bir
qarab   chiqish   orqali   qidirib   topish   masalasi   hal   qilinadi.   Ketma-ket   qidiruv
algoritmida ro‘yxatning saralanganligi ahamiyatga ega bo‘lmasa-da, lekin saralangan
ro‘yxatda   eng   yaxshi   natijaga   erishiladi.   Odatda   qidiruv   kerakli   elementning
ro‘yxatda   bor   yoki   yo‘qligini   shunchaki   tekshirish   uchun   emas,   balki   shu   kalit-
qiymatga   ega   bo‘lgan   ma‘lumotni   ajratib   olish   uchun   ham   qo‘llaniladi.   Masalan,
kalit-qiymat   qidirilayotgan   elementning   tartib   raqami   yoki   boshqa   unikal   (yagona)
identifikator bo‘lishi mumkin. Kerakli kalit topilgandan so‘ng dastur shu kalitga mos
ma‘lumotlarni   o‘zgartirishi   yoki   shunchaki   barcha   yozuvlarni   ajratib   chiqarishi
mumkin.   Har   qanday   holatda   ham   qidiruv   algoritmi   kalitning   joylashgan   o‘rnini
aniqlash   masalasini   yechish   uchun   qo‘llaniladi.   SHuning   uchun   ham   qidiruv
algoritmlari   kerakli   kalitdan   tarkib   topgan   yozuv   indeksini   natija   sifatida   ajratib
beradi.   Agar   kalit-qiymat
topilmasa,   u   holda   qidiruv
algoritmi massivning yuqori
chegarasidan   katta   bo‘lgan
indeks   qiymatini   qaytaradi.
Maqsadga   erishish   uchun
ro‘yxat   elementlari   1 dan   N
gacha   bo‘lgan   sonlar
yordamida   raqamlangan
bo‘lsin   deb   faraz   qilamiz.
Bu   holatda   qidirilayotgan   kalit   ro‘yxatda   mavjud   bo‘lmasa,   algoritm   0   qiymatni
beradi   (1-rasm).   Soddalik   uchun   ajratib   olinadigan   kalit-qiymatlar   ro‘yxatda
takrorlanmaydi   deb   qabul   qilinadi.
Ketma-ket   qidiruv   algoritmi   ro‘yxatning   birinchi   elementidan   boshlab   oxirgi
elementgacha qidirilayotgan elementni topilmaguncha qarab chiqiladi. Bundan kelib
chiqadiki, kalit qiymati 
ro‘yxatda   qancha   uzoqda   turgan   bo‘lsa,   qidiruv   shuncha   uzoq   davom   etadi   (vaqtga
nisbatan).   Bu   holatni   ketma-ket   qidiruv   algoritmi   tahlilida   e‘tiborga   olish   zarur
bo‘ladi.
Algoritmning   tahlili.   Ketma-ket   qidiruv   algoritmida   ikki   eng   yomon   holat   mavjud.
Birinchi   holatda   qidiruvdagi   element   ro‘yxat   oxirida   joylashgan   bo‘ladi.   Ikkinchi
holatda esa, qidiruvdagi element ro‘yxatda mavjud bo‘lmaydi. Har ikki holatda ham
necha   marta   taqqoslash   amali   bajarilishini   qarab   chiqamiz.   Ro‘yxat   elementlarining
kalit   qiymati   unikal   (takrorlanmas)   deb   qaraydigan   bo‘lsak,   qidiruvdagi   elementga
moslik oxirgi yozuvda uchrasa, u holda oxirgi taqqoslash keraksiz bo‘lishi mumkin.
31-rasm Lekin   algoritm   oxirgi   elementga   qadar   taqqoslash   amalini   bajaradi.   Natijada   N   ta
taqqoslash amalga oshiriladi (bu yerda  N - ro‘yxatdagi elementlar soni).
Qidirilayotgan   qiymatning   ro‘yxatda   yo‘qligini   tekshirish   uchun   uni   ro‘yxatning
barcha elementlari bilan taqqoslab chiqishga to‘g‘ri keladi. Agar biror element bilan
taqqoslash   qoldirilsa,   u   holda   qidirilayotgan   element   rostdan   ham   ro‘yxatda
yo‘qligini   aniqlab   bo‘lmaydi.   Bu   esa   ro‘yxatning   barcha   elementlarini   qarab
chiqishni talab etadi va bu holatda ham  N  marta taqqoslash amalga oshiriladi.
Umuman   olganda,   qidirilayotgan   element   ro‘yxatning   oxirgi   elementi   yoki   unda
mavjud emasligini aniqlash uchun  N  marta taqqoslash amali bajariladi.  N  har qanday
qidiruv   algoritmining   eng   yuqori   chegarasi   hisoblanadi,   agar   taqqoslashlar   N   dan
ko‘p   bajarilsa,   hech   bo‘lmaganda   ro‘yxatning   bitta   elementi   bilan   ikki   marta
taqqoslash   bajarilganligini   bildiradi.   Bundan   kelib   chiqadiki,   ortiqcha   ish   bajarilgan
va algoritmni yaxshilash talab etiladi.
O’rtacha holat tahlili.   Qidiruv algoritmi uchun ikkita o‘rtacha holat mavjud. Birinchi
holatda   qiqdiruv   muvaffaqiyatli,   ikkinchi   holatda   qidiruv   samarasiz,   ya‘ni
qidirilayotgan element ro‘yxatda mavjud bo‘lmasligi mumkin.
Agar   qidirilayotgan   element   ro‘yxatda   bo‘lsa,   u   holda   N   marta   mumkin   bo‘lgan
holatlardan   biriga   teng   bo‘ladi:   birinchi,   ikkinchi,   uchinchi   va   h.k.   Bu   holatlarning
barchasini   teng   ehtimolli   deb   faraz   qilamiz,   ya‘ni   qidirilayotgan   element   mavjud
holatlarning birida uchrashi ehtimoli  1/N  ga teng bo‘ladi.
Ushbu xulosalardan kelib chiqqan holda quyidagi savollar tug‘iladi:
Agar qidirilayotgan element ro‘yxatda birinchi turgan bo‘lsa, necha marta taqqoslash
bajariladi?
Ikkinchi bo‘lsa-chi?
Uchinchisi bo‘lsa-chi?
N -element bo‘lsa-chi?
Agar   yuqorida   aytilgan   fikrlardan   kelib   chiqadigan   bo‘lsak,   ushbu   savollarga   javob
tayyor,   chunki   har   bir   holat   uchun   mos   ravishda   1,   2,   3   va   N   marta   taqqoslash
bajariladi.   Bu   esa   N   ta   holatdan   har   biri   qidirilayotgan   elementning   ro‘yxatda
joylashish tartibiga mos kelishini bildiradi. Natijada, o‘rtacha holatlar uchun quyidagi
tenglikga erishamiz:
A(N)  = 1 f ,  = 1. N(N
 + 1)
 =  N +1 , (i)
N : N 2 2 ' ’
Agar   qidirilayotgan   element   ro‘yxatda   mavjud   bo‘lmasa   taqqoslashlar   soni   N+ 1
gacha oshib ketadi. Element ro‘yxatda mavjud bo‘lmasa, u holda qidiruv uchun  N  ta
taqqoslash zarurligini yuqorida ko‘rib chiqdik.  
Agarda ro‘yhat elementlari soni  N  juda katta son bo‘lsa u holda 1/( N +1) ning qiymati
0 ga yaqin son bo‘ladi.
4 Bu   qidirish   usulida   ikkita   jadval   tashkil   etiladi:   o‘z   kalitlariga   ega   bo‘lgan
ma‘lumotlar   jadvali   (o‘sish   tartibida   joylashtirilgan)   va   ma‘lumotlar   kalitlaridan
tashkil topgan indekslar jadvali.
 Bu kalitlar asosiy jadvaldan oldindan aniqlangan intervalda olinadi (2-rasm)
Bu   yerda   birinchi   berilgan   argument   bo‘yicha   indekslar   jadvalidan   ketma-   ketlikda
qidirish   amalga   oshiriladi.   Kalitlarni   ko‘rib   chiqishda   berilgan   kalitdan   kichigi
topilsa, u holda ushbu kichik kalitni asosiy jadvaldagi qidirishning eng quyi chegarasi
-   low   ga   joylashtiramiz,   xuddi   shunday   berilgan   kalitdan   katta   deb   topilgan   kalitni
( kind > key ) yuqori  hi  ga joylashtiramiz. Misol uchun,  key  = 101.
Algoritmning   tahlili .   Agar   barcha   holatlar   uchun   teng   ehtimollik   deb   hisoblansa,   u
holda qidirish samaradorligini quyidagicha aniqlash mumkin.
I bob. Chiziqli qidiruv
Chiziqli   qidiruv -   ketma-ket   qidiruv  algoritmi   bo'lib, biz  bir   uchidan  boshlaymiz  va
kerakli element topilgunga qadar ro'yxatning har  bir elementini tekshiramiz.   Bu eng
oddiy qidiruv algoritmidir.
1.1.Chiziqli qidiruv algoritmi ishlashi
Quyidagi ro'yxatdagi elementni qidirish uchun quyidagi bosqichlar bajariladi   k = 1 .
52-rasm. Indeksli ketma-ket qidirish usuliga misol . Qidiriladigan massiv
Birinchi   elementdan   boshlang,   solishtiring k har   bir   element   bilan x .
Har bir element bilan solishtiring
Agar bo'lsa   x == k , indeksni qaytaring.
Element topildi. Aks holda, qaytib keling  topilmadi .
Chiziqli   qidiruv   algoritmiLinearSearch(massiv,   kalit)massivdagi   har   bir   element
uchun
agar element == qiymati uning indeksini qaytaring
1.2.Chiziqli qidiruv algoritmining c++ tilida dastu ri
#include <iostream>
using namespace std;
int search(int array[], int n, int x) {
6   for (int i = 0; i < n; i++)
    if (array[i] == x)
      return i;
  return -1;
}
int main() {
  int array[] = {2, 4, 0, 1, 9};
  int x = 1;
  int n = sizeof(array) / sizeof(array[0]);
  int result = search(array, n, x);
  (result == -1) ? cout << "Bunday qiymat yo`q" : cout << "Element turgan qator " <<
result;
  return 0;
}
1.3.Chiziqli qidiruv algoritmining murakkabliklari
Vaqtning murakkabligi:   O(n)
Kosmik murakkablik:   O(1)
II bob. Ikkilik qidiruv algoritmi
Ikkilik   qidiruv   -   tartiblangan   massivdagi   elementning   o'rnini   topish   uchun   qidiruv
algoritmi.
Ushbu yondashuvda element har doim massiv qismining o'rtasida qidiriladi.
2.1.Ikkilik qidiruv algoritmi ishlashi
Ikkilik   qidiruv   faqat   elementlarning   tartiblangan   ro'yxatida   amalga   oshirilishi
mumkin.   Agar elementlar hali tartiblanmagan bo'lsa, avval ularni saralashimiz kerak.
7 Ikkilik qidiruv ishlaydi
Ikkilik   qidiruv   algoritmi   quyida   muhokama   qilinadigan   ikkita   usulda   amalga
oshirilishi mumkin.
Iterativ usul
Rekursiv usul
Rekursiv usul   bo'l va zabt et   yondashuviga amal qiladi.
Ikkala usul uchun ham umumiy qadamlar quyida muhokama qilinadi.
Qidiruv   amalga   oshiriladigan   massiv:
Dastlabki massiv  x = 4 Qidiriladigan element bo'lsin   .
Ikki ko'rsatkichni mos ravishda eng past va eng yuqori pozitsiyalarga past va baland
qilib qo'ying.
                Ko'rsatkichlarni o'rnatish
O'rta elementni toping o'rta massivning ya'ni.   arr[(low + high)/2] = 6 .
                                    O'rta element 
Agar   x   ==   o'rta   bo'lsa,   midni   qaytaring.   Aks   holda,   izlanadigan   elementni   m   bilan
solishtiring.
Agar bo'lsa   x > mid , solishtiring x ning o'ng tomonidagi elementlarning o'rta elementi
bilan o'rta .   Bu sozlash orqali amalga oshiriladi past ga   low = mid + 1 .
Aks   holda,   solishtiring x ning   chap   tomonidagi   elementlarning   o'rta   elementi
bilan o'rta .   Bu sozlash orqali amalga oshiriladi yuqori ga   high = mid - 1 .
8                       O'rta elementni topish
3 dan 6 gacha bo'lgan bosqichlarni past daraja yuqoriga to'g'ri kelguncha takrorlang.
           O'rta element
x = 4 topiladi.
                     Topildi
Ikkilik qidiruv algoritmi
Takrorlash usuli
past va baland ko'rsatkichlar bir-biriga duch kelguncha bajaring.
o'rta = (past + yuqori) / 2
agar (x == arr[mid])
o'rtaga qaytish
else if (x > arr[mid]) // x o'ng tomonda
past = o'rta + 1
Aks holda // x chap tomonda
yuqori = o'rta - 1
Rekursiv usul
binarySearch(arr, x, past, yuqori)
9 agar past > baland bo'lsa
False ni qaytaring
boshqa
o'rta = (past + yuqori) / 2
agar x == arr[mid]
o'rtaga qaytish
Aks holda, agar x > arr[mid] // x o'ng tomonda bo'lsa
ikkilik qidiruvni qaytarish (arr, x, o'rta + 1, yuqori)
Aks holda // x o'ng tomonda
ikkilik qidiruvni qaytarish (arr, x, past, o'rta - 1)
2.2.Ikkilik qidiruv algoritmining c++ tilida dasturi
#include <iostream>
using namespace std;
int binarySearch(int array[], int x, int low, int high) {
  while (low <= high) {
    int mid = low + (high - low) / 2;
    if (array[mid] == x)
      return mid;
    if (array[mid] < x)
      low = mid + 1;
    else
      high = mid - 1;
  }
  return -1;
}
int main(void) {
  int array[] = {3, 4, 5, 6, 7, 8, 9};
  int x = 9;
  int n = sizeof(array) / sizeof(array[0]);
  int result = binarySearch(array, x, 0, n - 1);
  if (result == -1)
10     printf("bunday son mavjud emas");
  else
    printf("siz qidirayotgan element %d-o`rinda turipdi", result);
    return 0;
   }
2.3.Ikkilik qidiruv algoritmining murakkabligi
Vaqt murakkabliklari
Eng yaxshi holat murakkabligi   : O(1)
Ishning o'rtacha murakkabligi   : O(log n)
Eng yomon holatlarning murakkabligi   : O(log n)
Kosmik murakkablik
Ikkilik qidiruvning fazoviy murakkabligi   O(1) .
III BOB.Satrlarda qismiy satrlarni qidirish algortmlari.   
Eng   oddiy   algoritm.   Rabin-Karp   algoritmi   .   Satrlardan     qismiy     satrni     qidirish
algoritmi  –  bu  matnda  (text)  qismiy satr (pattern) topishga imkon beradigan satrlar
ustidagi   algoritmlar   sinfi.   U   matn   muharrirlari,   MBBT,   qidiruv   tizimlari,   dasturlash
tillari   va   boshqalarda   o'rnatilgan   funksiya   sifatida   ishlatiladi.Qidiruv   vazifalarida
qidiruv   satrni   “igna”   (inglizchadan   -     "needle")   va   qidiruv   o'tkaziladigan   satrni
“g aram” (ingliz tilidan - "haystack") deb belgilash  odat  tusiga  kirgan.  Shuningdek,ʻ
biz     qidirish     olib     boriladigan   alifboni   Σ   bilan   belgilaymiz.   Primitiv     algoritmning
muvaffaqiyatsizligi.     Agar     satrlar     birdan   boshlab     raqamlangan     deb     hisoblasak,
eng     oddiy     “qo'pol     kuch”     (Brute   force)   algoritmi   (sodda   algoritm)   quyidagicha
bo ladi:
ʻ
for i=0...|haystack|-|needle|
for j=0...|needle|
if haystack[i+j + 1]<>needle[j] 
then goto 1
11 output("Topildi: ", i+1)
1:
Eng oddiy qidirish algoritmi, eng yaxshisi, |haystack|  -  |needle| +1 taqqoslash;  agar
bir-biriga     o'xshashliklar     ko'p     bo'lsa,     tezlik   O(|haystack|·|needle|)   ga   tushadi.
Primitiv     algoritm     o'rtacha     2     soatlik     taqqoslashda     ishlayotgani   isbotlangan.
Bugungi     kunda     qismiy     satrlarni     qidirish     algoritmlarining     xilmaxilligi   mavjud.
Dasturchi bunday omillarga qarab, mosini tanlashi kerak.
1.  Optimallashtirish  kerakmi  yoki  primitiv  algoritm  yetarlimi? Jimlik bo yicha, buʻ
dasturlash tillarining standart kutubxonalari amalga oshiradi. 
2.   Foydalanuvchining   "dushmanligi".   Boshqacha   aytganda: foydalanuvchi ataylab
algoritm  sekin bajariladigan ma'lumotlarni  aniqlaydimi?   Eng   oddiy   holatda   O   (|
haystack|     ·     |     needle|)     ball   qo'yadigan     juda     oddiy     algoritmlar     mavjud,     lekin
"muntazam" ma'lumotlarda  solishtirishlar  soni  |  haystack  |  dan  ancha  kam. Faqat
1990-yillarda     O     (|     haystack     |)     ning     murakkabligini,     eng   yomon   holatda   va   |
haystack | o'rtacha.
3.     Tilning   grammatikasi   qidiruvni   "o'rtacha"   tezlashtiradigan   ba'zi   evristikalarga
dushman bo'lishi mumkin.
4.     Protsessor     arxitekturasi.     Ba'zi     protsessorlarda     avtomatik   kattalashtirish     yoki
SIMD   amallari   mavjud   bo'lib,   ular  sizga ikkita operativ xotirani tez taqqoslashga
imkon   beradi   (masalan,   x86-da     rep     cmpsd).     Bunday     protsessorlarda     “needle”ni
“haystack”   bilan   taqqoslaydigan   algoritmni   qo'llash   juda   qiziq     -albatta,   hamma
pozitsiyalarda emas.
5.     Alifbo     o'lchami.     Ko'p     algoritmlar     (ayniqsa,     oxirigacha   taqqoslashga
asoslangan),   mos   kelmaydigan   belgi   bilan   bo   g liq   evristikaga     ega.     Katta	
ʻ
alifbolarda     ramzlar     jadvali     ko'p     xotirani   egallaydi,   kichik   alifbolarda   tegishli
evristik samarasiz bo'ladi.
6.  “haystack”ni  indekslash  qobiliyati.  Agar  mavjud  bo'lsa, qidiruv juda tezlashadi.
7.   Bir   vaqtning   o'zida bir  nechta satrlarni  qidirish kerakmi? Ba'zi  algoritmlarning
yon   xususiyatlari   (Axo-Korasik,   ikkilik   algoritm)   bunga   imkon   beradi.Qoida
tariqasida,     matn     tahrirlovchisida     Boyer-Mur-Xorspul     kabi   eng     oddiy     evristik
algoritmni     olish     kifoya-hatto     juda     sekin     kompyuter   ham   bir   soniya   ichida
qidirishni   amalga   oshira   oladi.   Agar   matn   hajmi   gigabaytda     o'lchanadigan     bo'lsa
yoki     qidiruv     ko'plab     so'rovlarni   bajaradigan   serverda   ishlayotgan   bo'lsa,   siz   eng
muvaffaqiyatli algoritmni tanlashingiz   kerak   bo'ladi.   Masalan,   plagiatni   aniqlash
dasturlari     o'z   ma'lumotlar     bazasida   saqlanadigan   ko'plab     hujjatlar   orasida   qismiy
satr qidirish algoritmlari yordamida onlayn tekshiruvlarni amalga oshiradi.
12 3.1 Qismiy satrlarni qidirish algoritmlarining turlari
Rabin-Karp algoritmi.  Rabin-Karp algoritmi-bu matnni xeshlash yordamida berilgan
satrdan   ichki   satrni   qidiradigan   qidirish   algoritmi.   U   1987-yilda   Maykl   Rabin   va
Richard   Karp   tomonidan   ishlab   chiqilgan.Algoritm     kamdan-kam     hollarda     bitta
qismiy   satrni   topish   uchun ishlatiladi, lekin muhim nazariy ahamiyatga ega va bir
xil   uzunlikdagi   bir   nechta   qismiy   satr   uchun   moslikni   topishda   juda   samarali.     n
uzunlikdagi matn va  m  uzunlikdagi qismiy satr  uchun uning o'rtacha va eng yaxshi 
bajarilish vaqti to'g ri xesh funksiyasi bilan O (n) dir, lekin eng yomon holatda  uningʻ
samaradorligi     O     (nm)     ga     teng.     Bu     esa     keng   qo'llanilmasligining   sabablaridan
biridir.   Rabin-Karp     algoritmining     eng     oddiy     amaliy     qo'llanmalaridan     biri
plagiatni     aniqlashdir.     Rabin-Karp     algoritmi     tekshirilgan     maqoladagi   manba
materiallardan   ba'zi   jumlalar   paydo   bo'lishining   misollarini   tezda   topishi     mumkin.
Algoritmning  kichik  farqlarga  sezgirligini  yo'q  qilish uchun siz ularni olib tashlash
orqali   harf   yoki   tinish   belgi   kabi   tafsilotlarni   e'tiborsiz   qoldirishingiz   mumkin.   Biz
qidirayotgan   qatorlar   soni   juda   katta   bo'lgani   uchun,   bitta   satrlarni   topishning
an'anaviy   algoritmlari   samarasiz   bo'lib   qoladi.   Quyidagi   misol   orqali   Rabin-Karp
algoritmini ko rib chiqamiz. 	
ʻ
Berilgan matn S= “aevesapng”
Izlanadigan satr P= “esap”
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
0  1  2  3
e  s  a  p
Quyida simvollar uchun xesh-kod keltirilgan:
a  →  1
b  →  2
c  →  3
d  →  4
e  →  5
f  →  6
…  →  …
z  →  26
1-qadam.  Belgilarga  tayinlangan  xesh  kodi  yordamida  qismiy satrning xesh kodi
qiymatini topamiz.
0  1  2  3
e  s  a  p
↓  ↓  ↓  ↓
5  19  1  16
13 Xesh-kod qiymati: 5+19+1+16=41
2-qadam.   Agar   m   qismiy   satr   uzunligi   bo'lsa,   biz   matn   satrining boshidan m
uzunlikdagi qismiy satrni olishni boshlaymiz. Shundan so'ng, qismiy satr uchun xesh-
kod   qiymatini   topamiz   va   shablon   satrining   xeshkod   qiymatiga   mos   kelishini
tekshiramiz.   Agar   u   mos     keladigan   bo'lsa,   belgini   birma-bir   tekshiradi,   aks   holda
keyingi qismiy satrga o'tadi.
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
↓  ↓  ↓  ↓         
1  5  22  5       
Xesh kod qiymati: 1+5+22+5 = 33
Xesh-kod   qiymati    mos   kelmaydi,   keyin    biz    m    (4)    uzunlikdagi  keyingi  satrga
o'tamiz.
3-qadam.
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
↓  ↓  ↓  ↓     
5  22  5  19       
Xesh kod qiymati: 5+22+5+19 = 51
Xesh-kod  qiymati  mos  kelmaydi,  keyin  m  uzunlikdagi  keyingi satrga o'tamiz.
4-qadam. 
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
↓  ↓  ↓  ↓ 
22  5  19  1   
Xesh kod qiymati: 22+5+19+1 = 47
Xesh-kod qiymati mos  kelmaydi, keyin biz  m  uzunlikdagi keyingi satrga o'tamiz.
5-qadam. 
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
↓  ↓  ↓  ↓
5  19  1  16 
Xesh kod qiymati: 5+19+1+16 = 41
Bu     yerda     xesh-kodining     qiymati     bir     xil,     shuning     uchun     biz     ichki   qismiy
belgilarini qidiriluvchi satr bilan birma -bir tekshiramiz.
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
↓  ↓  ↓  ↓
14 e  s  a  p 
Barcha   belgilar   mos     keladi,   keyin   biz   ichki   satrning   boshlang ich   indeksini   chopʻ
etamiz va iloji bo'lsa, m uzunlikdagi keyingi qismiy satrga o'tamiz.
6-qadam.
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
↓  ↓  ↓  ↓
19  1  16  14
Xesh kod qiymati: 19+1+16+14 = 50
Joriy  ichki  satrning  xesh  qiymati  qismiy  satrning  xesh  qiymatiga mos kelmaydi.
Shunday qilib, iloji bo'lsa,   m   uzunligining keyingi   ichki satriga o tamiz, aks holda	
ʻ
to'xtatamiz.
7-qadam.
0  1  2  3  4  5  6  7  8
a  e  v  e  s  a  p  n  g
↓  ↓  ↓  ↓
1  16  14  7
Xesh kod qiymati: 1+16+14 +7= 38 
Bu   yerda   ham   xesh   kodi   qiymati   mos   kelmaydi   va   bu  m     uzunligining   oxirgi   ichki
satri. Shunday qilib, bu yerda o'z jarayonimizni to'xtatamiz. Eslatma:  Bu  yerda  xesh
funksiyasini     yaratish     yoki     aniqlashning   turli   usullari   mavjud.   Yaxshi   tushunish
uchun oddiy xesh funksiyasidan foydalanildi. 
Rabin-Karp algoritmi (C++)
#include <bits/stdc++.h>
using namespace std; 
#define d 256
 void search(char pat[], char txt[], int q) 
{
    int M = strlen(pat); 
    int N = strlen(txt); 
    int i, j; 
    int p = 0; 
    int t = 0;  
    int h = 1;
    for (i = 0; i < M - 1; i++) 
        h = (h * d) % q; 
    for (i = 0; i < M; i++) { 
        p = (d * p + pat[i]) % q; 
        t = (d * t + txt[i]) % q; 
    } 
 
15     for (i = 0; i <= N - M; i++) { 
 
      
        if (p == t) { 
            for (j = 0; j < M; j++) { 
                if (txt[i + j] != pat[j]) { 
                    break; 
                } 
            } 
            if (j == M) 
                cout << "Pattern found at index " << i 
                     << endl; 
        } 
        if (i < N - M) { 
            t = (d * (t - txt[i] * h) + txt[i + M]) % q; 
            if (t < 0) 
                t = (t + q); 
        } 
    } 
}
int main() 
{
    char txt[] = "SAMARQAND DAVLAT UNIVERSITETI"; 
    char pat[] = "DAVLAT"; 
    int q = INT_MAX; 
    search(pat, txt, q); 
    return 0; 
}
Boyer-Mur   algoritmi.   1977-yilda   Robert   Boyer   va   Jey   Mur tomonidan   ishlab
chiqilgan,   matnda   oldindan   ishlov   berish   imkoniyati bo'lmagan   taqdirda, satrda
qismiy satrni topish algoritmlari orasida eng tezkori hisoblanadi.
Algoritm g oyasi quyidagicha:ʻ
-  Chapdan o'ngga skanerlash, o'ngdan chapga taqqoslash.
-  To'xtash belgisini topish
16 o  agar taqqoslanadigan birinchi harf mos kelmasa, shablon eng yaqiniga o'tkaziladi
o  to'xtash belgisi bo'lmasa, shablon uning orqasiga siljiydi
-  Mos keladigan qo'shimchani topish
o  agar  1  yoki  undan  ortiq  belgi  mos  kelsa,  shablon  bu qo'shimchaning birinchi
mos kelishiga qadar o'ngga siljiydi
1.  q w t e e q e w q r w q w r q r
q w r q r
2.  q w t e e q e r q r w q w r q r
q w r q r
3.  q w t e e q e w q r w q w r q r
q w r q r
4.  q w t e e q e w q r w q w r q r
q w r q r 
To'xtatish   belgisi   jadvali.   Qismiy   satrdagi   elementning   oxirgi   o'rnini   belgilaydi
(oxirgi harfdan tashqari).   Agar qismiy satrda element bo'lmasa, jadvalga 0 kiritiladi
(bittadan raqamlash uchun)
Misol. Qismiy satr: qwrqr
Simvol  q  w  r  e  t
Oxirgi pozitsiya  4  2  3  0  0
1.  q t e e q r w q w r e e
q w r q r
2.  q t e e q r w q w r e e
q w r q r
Suffiks  jadvali. Mumkin  bo'lgan  barcha  qo'shimchalar   uchun jadvalda  qismiy  satrni
o'zgartirish kerak bo'lgan eng kichik miqdor ko'rsatilgan, u yana  qo'shimchaga  mos
keladi.  Agar  bunday  siljishning  iloji  bo'lmasa, satrning uzunligi ko'rsatilgan.
Misol. Qismiy satr: qwrqr
Suffiks  Bo sh  r  qr  rqr  wrqr  qwrqrʻ
qadam  1  2  5  5  5  5
1.  q t e e q r w q w r e e
q w r q r
2.  q t e e q r w q w r e e
q w r q r 
3.  q t e e q r w q w r e e
q w r q r
4.  q t e e q r w q w r e e
q w r q r
17 Algoritmning   murakkabligi.   O   (|   haystack   |   +   |   needle   |   +   |   Σ   |)   davriy   bo'lmagan
qismiy satrlar bo'yicha
O (| haystack | · | needle | + | Σ |) davriy haystack - berilgan satr, needle – qismiy satr,
Σ - solishtirish uchun alifbo 1991-yilda   Koul   shuni   ko'rsatdiki,   davriy   bo'lmagan
sxemalar bo'yicha,  algoritm  satr  bo'ylab  to'liq  o'tishda  3·|haystack|  tadan  ko'p 
bo'lmagan taqqoslashni amalga oshiradi.
Boyer-Mura algoritmi (C++)
#include <bits/stdc++.h>
using namespace std;
# define NO_OF_CHARS 256
void badCharHeuristic( string str, int size, int badchar[NO_OF_CHARS])
{
int i;
for (i = 0; i < NO_OF_CHARS; i++)
badchar[i] = -1;
for (i = 0; i < size; i++)
badchar[(int) str[i]] = i;
}
void search( string txt, string pat)
{
int m = pat.size();
int n = txt.size();
int badchar[NO_OF_CHARS];
badCharHeuristic(pat, m, badchar);
int s = 0;
while(s <= (n - m))
{
int j = m - 1;
while(j >= 0 && pat[j] == txt[s + j])
j--;
if (j < 0)
{
cout  << s << endl;
s += (s + m < n)? m-badchar[txt[s + m]] : 1;
}
else
s += max(1, j - badchar[txt[s + j]]);
18 }
}
int main()
{
string txt;
string pat;
getline(cin,txt);
getline(cin,pat);
search(txt, pat);
cout << pat;
return 0; }
3.2.Kenglik bo’yicha izlash algoritm i(bfs).
Kenglik   bo’yicha   izlash   algoritmi   grafni   o’tib   chiqish   va   yo’l   izlash   metodi
hisoblanadi.   Bizga   graf   uchlar   va   bog’lanishlar   to’plamlari   sifatida   beriladi.   Yana
boshlang’ich   uch   va   oxirgi   uch(maqsad   uch)   beriladi.   Boshlang’ich   uchdan   ohirg
uchga boradigan eng qisqa yo’lni topish kerak.
Kenglik   bo’yicha   izlash   algoritmida   barcha   uchlar   grafning   alohida   sathlariga
ajratiladi   va   bu   sathdagi   uchlar   ketma-ket   ko’rib   chiqiladi.   Qidiruv   qandaydir
boshlang’ich   uch   orqali   boshlanadi.   Qidiruv     (https://azkurs.org/reja-binar-darxtlar-
haqida-tushuncha-kop-olchamli-daraxtni-bin.html)v   uchga   kelgan   vaqtida   unga
qo’shni bo’lgan barcha uchlarni ko’rib chiqamiz. Agar qo’shni uch hali ko’rilmagan
bo’lsa bu uchni navbatga qo’yamiz.
Kenglik bo’yicha izlash algoritmi quyidagi tartibda bo’ladi(noformal tavsifi):
Qidiruv boshlanadigan dastlabki uchni bo’sh bo’lgan navbatga joylashtiramiz.
Navbatdagi birinchi uchni olamiz va uni navbatdan o’chirib tashlaymiz
19 Navbatdan   olingan   uchga   qo’shni   bo’lgan   barcha   uchlarni   ko’rib   chiqamiz.   Agar   u
hali ko’rilmagan bo’lsa bu uchni ko’rilgan uchlar qatoriga qo’shamiz va bu uchning
o’zini navbat oxiriga qo’shamiz.
Agar   navbat   bo’sh   bo’lsa   boshlang’ich   uch   orqali   yetib   borib   bo’ladigan   barcha
uchlar ko’rib chiqilib bo’lingan bo’ladi va qidiruvni to’xtatishimiz mumkin.
3.3.QISMIY SATRLARNI QIDIRISH ALGORITMI
Satrlardan   qismiy   satrni   qidirish   algoritmi   –   bu   matnda   (text)   qismiy   satr
(pattern) topishga imkon beradigan satrlar ustidagi algoritmlar sinfi.
U   matn   muharrirlari,   MBBT,   qidiruv   tizimlari,   dasturlash   tillari   va   boshqalarda
o'rnatilgan funksiya sifatida ishlatiladi. Primitiv  algoritmning  kamchiligi  nima ?Eng
oddiy   qidirish   algoritmi,   eng   yaxshisi,   |haystack|   -   |needle|   +1   taqqoslash;   agar   bir-
biriga   o'xshashliklar   ko'p   bo'lsa,   tezlik   O(|haystack|·|needle|)   ga   tushadi.Primitiv
algoritm   o'rtacha   2   soatlik   taqqoslashda   ishlayotgani   isbotlangan.   .
Foydalanuvchining   "dushmanligi"   .   Protsessor   arxitekturasi.   Alifbo   o'lchami.
haystack”ni   indekslash   qobiliyati.   Rabin   kart     algaritmi     xeshlash   orqali   topadigan
qismiy  stralarni topish  algaritmi.   Berilgan satrni  topish  uchun  bu  saatr  harflarni
raqamlar     bilan     belgilab       oladi   va     bu     rqamlarni     yig’indisini   topadi.     Berilgan
tekisdan satrni   topishda   qismiy satrni   uzinligicha   po’laka   bo’ladi   va u   harflarni
yigindisini topadi  yuqoridagi  qismiy  satrni  yig’indisiga  teng  bo’lsa shu  satr  bilan
hadma     had     tekshiradi   va     to’g’ri     kelsa   uni       chiqardi.   Rabin-Karp   algoritmi-bu
matnni   xeshlash   yordamida   berilgan   satrdan   ichki   satrni   qidiradigan   qidirish
algoritmi.   U   1987-yilda   Maykl   Rabin   va   Richard   Karp   tomonidan   ishlab   chiqilgan.
Rabin Krap  algoritming   murakkabligi n uzunlikdagi matn va m uzunlikdagi qismiy
satr uchun uning o'rtacha va eng yaxshi bajarilish vaqti to'g ri xesh funksiyasi bilan Oʻ
(n)   dir,   lekin   eng   yomon   holatda   uning   samaradorligi   O   (nm)   ga   teng.   Rabin   Krap
algoritming   murakkabligi qanday ?
n   uzunlikdagi   matn   va   m   uzunlikdagi   qismiy   satr   uchun   uning   o'rtacha   va   eng
yaxshi bajarilish vaqti to'g ri xesh funksiyasi bilan O (n) dir, lekin eng yomon holatda	
ʻ
uning samaradorligi O (nm) ga teng.
Algoritm   g oyasi   quyidagicha:   -   Chapdan   o'ngga   skanerlash,   o'ngdan   chapga	
ʻ
taqqoslash.   -   To'xtash   belgisini   topish   o   agar   taqqoslanadigan   birinchi   harf   mos
kelmasa, shablon eng yaqiniga o'tkaziladi o to'xtash belgisi bo'lmasa, shablon uning
orqasiga siljiydi - Mos keladigan qo'shimchani topish o agar 1 yoki undan ortiq belgi
mos   kelsa,   shablon   bu   qo'shimchaning   birinchi   mos   kelishiga   qadar   o'ngga   siljiydi.
Boyer   Mur   algoritmining     murakkabligi     O  (|   haystack   |  +   |  needle   |   +  |   Σ   |)   davriy
20 bo'lmagan qismiy satrlar bo'yicha O (| haystack | · | needle | + |  Σ  |) davriy haystack -
berilgan satr, needle – qismiy satr,  Σ  - solishtirish uchun alifbo
Mumkin bo'lgan barcha qo'shimchalar uchun jadvalda qismiy satrni o'zgartirish kerak
bo'lgan   eng   kichik   miqdor   ko'rsatilgan,   u   yana   qo'shimchaga   mos   keladi.   Agar
bunday   siljishning   iloji   bo'lmasa,   satrning   uzunligi   ko'rsatilgan.   bo'lgan   barcha
qo'shimchalar   uchun   jadvalda   qismiy   satrni   o'zgartirish   kerak   bo'lgan   eng   kichik
miqdor   ko'rsatilgan,   u   yana   qo'shimchaga   mos   keladi.   Agar   bunday   siljishning   iloji
bo'lmasa,   satrning   uzunligi   ko'rsatilgan.   1977-yilda   Robert   Boyer   va   Jey   Mur
tomonidan   ishlab   chiqilgan,   matnda   oldindan   ishlov   berish   imkoniyati   bo'lmagan
taqdirda, satrda qismiy satrni topish algoritmlari orasida eng tezkori hisoblanadi
21 XULOSA
Bizga   dasturlash   hayotimizda   muhim   ro’l   o’ynaydi.Saralangan   ro’yxatda
yozuvlar   kalitning   o’sib   borish   tartibida   joylashgan   bo’lib,   saralanmagan   ro’yxatda
ular   tasodifiy   ravishda   joylashadi.   Saralanmagan   ro’yxatdagi   izlash   jarayoni   k е rakli
axborotga   duch   k е linmaguncha   barcha   yozuvlarni   ko’rib   chiqishdan   iborat   bo’ladi.
Bu   eng   sodda   izlash   algoritidir.   Konkr е t   qiymatni   izlash   tanlash   masalasi   bilan
bog’liq   bo’lib,   bunda   qandaydir   xususiyatga   ega   bo’lgan   el е m е ntni   topish   talab
etiladi.   Masalan,   kattalik   bo’yicha   b е shinchi   o’rindagi   el е m е nt,   ro’yxat   oxiridan
е ttinchi el е m е nt yoki o’rtacha qiymatli el е m е nt.
Ro’yxatidan kеrakli axborotni  izlash nazariy programmalashning fundamеntal
masalalaridan biridir. Izlash algoritmlari to’g’risida gap kеtganda axborot dasturdagi
bеrilganlar   massividan   iborat   bo’lgan   yozuvlarda   saqlanadi   dеgan   nuqtai   nazardan
kеlib   chiqiladi.   Yozuvlar   yoki   ro’yhat   elеmеntlari   massivda   kеtma-kеt   joylashadi.
Ko’pincha   yozuvlar   bir   nеcha   sohalardan   iborat   bo’lishi   mumkmn,   ammo   izlashda
ushbu   sohalardan   faqat   bittasi(kalit)   hisobga   olinadi.   Yozuvlar   kalit   sohasi   qiymati
bo’yicha saralangan yoki saralanmagan bo’lishi mumkin.
Izlash algoritmlari quyidagi guruxlarga bo’linadi:
Xulosa   qilib   shuni   aytamanki   bu   fanimizda   yani   Algoritmlash   asoslari   va
ma`lumotlar   strukturasi   fanidan   juda   kop   malumotlarni   òrganib   oldim.   Men   bu
mavzuda chiziqli izlash qidiruv algoritmi chiziqli izlash algoritmini C++ da dasturi ni
tuzib   urgandim.   Chiziqli   izlash   deganda   bizga   berilgan   oddiy   natural   sonli   qatorni
misol qilib olsak shu qator ichidan biz qidirayotgan raqamni chiziqli izlab topib bersa
manashu chiziqli izlash algoritmi diyiladi. U qanday tartibda buladi 9 4 6 2 8 5 1 3
shu   natural   sonli   qatorni   misol   qilib   olsak   va   k=5   dib   olsak   yani   bizgq   5   ni   tobib
berish buyruģini aytsak shu qatordan 5 ni izlab topadi yani 5 ni olamiz birinchi bòlib
9 bilan solishtiramiz 9 5 ga tengmi  yòq keyingi  raqamga utamiz 4 5 ga tengmi  yuq
buniham   tashlab   yuboramiz   va   kiyingi   raqamni   olamiz   6   5   ga   tengmi   yòq   kiyingi
raqam   2   5   ga   tengmi   yòq   8   5   ga   tengmi   yòq   shu   tartibda   solishtirib   chiqamiz     va
kiyingi navbat raqami 5 5 ga tengmi ha teng demak biz izlagan son 6- òrinda turgan
degan xulosaga kelamiz
22 Manbalar
1. https    ://    medium    .   com    /@    algorithmuzb    /   chiziqli    -   qidirish    -   vs    -   ikkilik    -   qidirish    -  
59    ab    25    c   6284   
2.   .   https    ://    medium    .   com    /@    algorithmuzb    /   ikkilik    -   qidirish    -   binary    -   search    -  
15070    d   707    b   04   
3. https    ://    library    .   samdu    .   uz    /   files    /  
ea    917    e   396    a   5562    f   1008    bd    4   bddae    9   ac    2   c   _   ALGORITMLAR    %20    VA    %20    MA   
%    E    2%80%9    FLUMOTLAR    %20    STRUKTURALARI    .   pdf   
4. https    ://    medium    .   com    /   tag    /   satr    -   qidirish   
5. https    ://    uzbekdevs    .   uz    /   maqolalar    /   chiziqli    -   qidiruv   
6. Algoritm va dasturlash asoslari (A.R.Azamatov).
23

Mundarija Kirish. Qidiruv algoritmlari ............................................................................................. 2 I bob. Chiziqli qidiruv ..................................................................................................... 5 1.1.Chiziqli qidiruv algoritmi ishlashi ............................................................................. 5 1.2.Chiziqli qidiruv algoritmining c++ tilida dasturi ....................................................... 6 1.3.Chiziqli qidiruv algoritmining murakkabliklari ......................................................... 7 II bob. Ikkilik qidiruv algoritmi ....................................................................................... 7 2.1.Ikkilik qidiruv algoritmi ishlashi ............................................................................... 7 2.2.Ikkilik qidiruv algoritmining c++ tilida dasturi ....................................................... 10 2.3.Ikkilik qidiruv algoritmining murakkabligi ............................................................. 11 III BOB.Satrlarda qismiy satrlarni qidirish algortmlari. ................................................ 11 3.1 Qismiy satrlarni qidirish algoritmlarining turlari ................................................... 13 3.2.Kenglik bo’yicha izlash algoritmi(bfs). ................................................................... 19 3.3.QISMIY SATRLARNI QIDIRISH ALGORITMI ............................................................. 20 XULOSA ........................................................................................................................ 22 Manbalar ..................................................................................................................... 23 1

Kirish. Qidiruv algoritmlari Ro‘yxatdan zarur axborotni qidirish - nazariy dasturlashning fundamental masalalaridan biri hisoblanadi. Qidiruv algoritmini tahlil qilishda, qidirilayotgan axborot kompyuterda ma‘lumotlar massivi ko‘rinishida joylashgan deb faraz qilamiz. Yozuvlar yoki ro‘yxat elementlari massivda ketma-ket joylashadi va ular o‘rtasida bo‘shliq yo‘q. Ro‘yxatdagi yozuvlar 1 dan N gacha tartiblangan bo‘ladi. Aslida yozuvlar maydonlardan tashkil topgan bo‘ladi, bizni kalit deb ataluvchi maydonlardan bittasining qiymati qiziqtiradi. Ro‘yxatlar kalit maydonlari qiymati bo‘yicha tartiblangan yoki tartiblanmagan bo‘lishi mumkin. Aniq qiymatni qidirish masalasi biror elementni tanlash masalasi bilan bog‘liq. Aytaylik, bizga kattaligi bo‘yicha beshinchi element, oxiridan yettinchi yoki o‘rta qiymatli element kerak. Qidiruv - bu kompyuter xotirasida ma‘lumotlarni qayta ishlash jarayonida qo‘llaniladigan asosiy amallardan biri hisoblanadi. Bu amalning mazmuni shundan iboratki, berilgan argument bo‘yicha massiv elementlari orasidan shu argumentga mos ma‘lumotni (elementni) aniqlashdan iborat. Ixtiyoriy ma‘lumot (yoki tuzilma) elementi qandaydir belgisi bilan boshqasidan farq qiladi. Ushbu belgi kalit deyiladi. Kalit takrorlanmas bo‘lishi mumkin, ya‘ni tuzimadagi mavjud bitta element uchun aynan shu kalit qo‘llaniladi. Bunday kalit birlamchi deb ataladi. Elementlarning ma‘lum guruhi uchun takrorlanishi mumkin bo‘lgan kalit ikkilamchi kalit deyiladi, ushbu kalit bo‘yicha ham qidiruv tashkil qilish mumkin. Ma‘lumot elementlarining kalitlari alohida joyda to‘plangan (boshqa jadvalda) bo‘lishi yoki o‘zi alohida yozuvdagi biror bir maydonda saqlanishi mumkin. Bunday ajratib olingan yoki alohida faylda saqlanadigan tashqi kalit deyiladi. Agar kalit yozuvda joylashgan bo‘lsa, u holda ichki kalit deyiladi. Berilgan argument bo‘yicha qidiruv berilgan argument kaliti bilan aniqlangan algoritm deyiladi. Qidiruv algoritmi ishlashi natijasi ushbu ma‘lumotda joylashishi mumkin yoki u jadvalda mavjud bo‘lmasligi mumkin. Ma‘lumotning mavjud bo‘lmaslik holati ikkita amalda yuz berishi mumkin: berilgan qiymatning yo‘qligini aniqlashda; berilgan qiymatni jadvalga qo‘yishda. Masalan, bizga ro‘yxat elementi kaliti sifatida k berilgan bo‘lsin. Har bir k(i) kalitda r(i)- ma‘lumot mavjud. Qidiruv argumenti - Key . Unga yozuv ma‘lumoti rec mos keladi. Jadvalda ma‘lumotlar tuzilmasiga bog‘liq holda qidiruvning bir nechta shakllari farqlanadi. Bu masalani yechish uchun ikki xil yondoshuv mavjud: ketma-ket qidiruv va indeksli ketma-ket qidiruv. Ushbu qidiruv algoritmlarini o‘rganib chiqamiz. 2

Qidiruv algoritmlarida biror aniq elementni mavjud ro‘yxat elementlarini birma-bir qarab chiqish orqali qidirib topish masalasi hal qilinadi. Ketma-ket qidiruv algoritmida ro‘yxatning saralanganligi ahamiyatga ega bo‘lmasa-da, lekin saralangan ro‘yxatda eng yaxshi natijaga erishiladi. Odatda qidiruv kerakli elementning ro‘yxatda bor yoki yo‘qligini shunchaki tekshirish uchun emas, balki shu kalit- qiymatga ega bo‘lgan ma‘lumotni ajratib olish uchun ham qo‘llaniladi. Masalan, kalit-qiymat qidirilayotgan elementning tartib raqami yoki boshqa unikal (yagona) identifikator bo‘lishi mumkin. Kerakli kalit topilgandan so‘ng dastur shu kalitga mos ma‘lumotlarni o‘zgartirishi yoki shunchaki barcha yozuvlarni ajratib chiqarishi mumkin. Har qanday holatda ham qidiruv algoritmi kalitning joylashgan o‘rnini aniqlash masalasini yechish uchun qo‘llaniladi. SHuning uchun ham qidiruv algoritmlari kerakli kalitdan tarkib topgan yozuv indeksini natija sifatida ajratib beradi. Agar kalit-qiymat topilmasa, u holda qidiruv algoritmi massivning yuqori chegarasidan katta bo‘lgan indeks qiymatini qaytaradi. Maqsadga erishish uchun ro‘yxat elementlari 1 dan N gacha bo‘lgan sonlar yordamida raqamlangan bo‘lsin deb faraz qilamiz. Bu holatda qidirilayotgan kalit ro‘yxatda mavjud bo‘lmasa, algoritm 0 qiymatni beradi (1-rasm). Soddalik uchun ajratib olinadigan kalit-qiymatlar ro‘yxatda takrorlanmaydi deb qabul qilinadi. Ketma-ket qidiruv algoritmi ro‘yxatning birinchi elementidan boshlab oxirgi elementgacha qidirilayotgan elementni topilmaguncha qarab chiqiladi. Bundan kelib chiqadiki, kalit qiymati ro‘yxatda qancha uzoqda turgan bo‘lsa, qidiruv shuncha uzoq davom etadi (vaqtga nisbatan). Bu holatni ketma-ket qidiruv algoritmi tahlilida e‘tiborga olish zarur bo‘ladi. Algoritmning tahlili. Ketma-ket qidiruv algoritmida ikki eng yomon holat mavjud. Birinchi holatda qidiruvdagi element ro‘yxat oxirida joylashgan bo‘ladi. Ikkinchi holatda esa, qidiruvdagi element ro‘yxatda mavjud bo‘lmaydi. Har ikki holatda ham necha marta taqqoslash amali bajarilishini qarab chiqamiz. Ro‘yxat elementlarining kalit qiymati unikal (takrorlanmas) deb qaraydigan bo‘lsak, qidiruvdagi elementga moslik oxirgi yozuvda uchrasa, u holda oxirgi taqqoslash keraksiz bo‘lishi mumkin. 31-rasm

Lekin algoritm oxirgi elementga qadar taqqoslash amalini bajaradi. Natijada N ta taqqoslash amalga oshiriladi (bu yerda N - ro‘yxatdagi elementlar soni). Qidirilayotgan qiymatning ro‘yxatda yo‘qligini tekshirish uchun uni ro‘yxatning barcha elementlari bilan taqqoslab chiqishga to‘g‘ri keladi. Agar biror element bilan taqqoslash qoldirilsa, u holda qidirilayotgan element rostdan ham ro‘yxatda yo‘qligini aniqlab bo‘lmaydi. Bu esa ro‘yxatning barcha elementlarini qarab chiqishni talab etadi va bu holatda ham N marta taqqoslash amalga oshiriladi. Umuman olganda, qidirilayotgan element ro‘yxatning oxirgi elementi yoki unda mavjud emasligini aniqlash uchun N marta taqqoslash amali bajariladi. N har qanday qidiruv algoritmining eng yuqori chegarasi hisoblanadi, agar taqqoslashlar N dan ko‘p bajarilsa, hech bo‘lmaganda ro‘yxatning bitta elementi bilan ikki marta taqqoslash bajarilganligini bildiradi. Bundan kelib chiqadiki, ortiqcha ish bajarilgan va algoritmni yaxshilash talab etiladi. O’rtacha holat tahlili. Qidiruv algoritmi uchun ikkita o‘rtacha holat mavjud. Birinchi holatda qiqdiruv muvaffaqiyatli, ikkinchi holatda qidiruv samarasiz, ya‘ni qidirilayotgan element ro‘yxatda mavjud bo‘lmasligi mumkin. Agar qidirilayotgan element ro‘yxatda bo‘lsa, u holda N marta mumkin bo‘lgan holatlardan biriga teng bo‘ladi: birinchi, ikkinchi, uchinchi va h.k. Bu holatlarning barchasini teng ehtimolli deb faraz qilamiz, ya‘ni qidirilayotgan element mavjud holatlarning birida uchrashi ehtimoli 1/N ga teng bo‘ladi. Ushbu xulosalardan kelib chiqqan holda quyidagi savollar tug‘iladi: Agar qidirilayotgan element ro‘yxatda birinchi turgan bo‘lsa, necha marta taqqoslash bajariladi? Ikkinchi bo‘lsa-chi? Uchinchisi bo‘lsa-chi? N -element bo‘lsa-chi? Agar yuqorida aytilgan fikrlardan kelib chiqadigan bo‘lsak, ushbu savollarga javob tayyor, chunki har bir holat uchun mos ravishda 1, 2, 3 va N marta taqqoslash bajariladi. Bu esa N ta holatdan har biri qidirilayotgan elementning ro‘yxatda joylashish tartibiga mos kelishini bildiradi. Natijada, o‘rtacha holatlar uchun quyidagi tenglikga erishamiz: A(N) = 1 f , = 1. N(N + 1) = N +1 , (i) N : N 2 2 ' ’ Agar qidirilayotgan element ro‘yxatda mavjud bo‘lmasa taqqoslashlar soni N+ 1 gacha oshib ketadi. Element ro‘yxatda mavjud bo‘lmasa, u holda qidiruv uchun N ta taqqoslash zarurligini yuqorida ko‘rib chiqdik. Agarda ro‘yhat elementlari soni N juda katta son bo‘lsa u holda 1/( N +1) ning qiymati 0 ga yaqin son bo‘ladi. 4

Bu qidirish usulida ikkita jadval tashkil etiladi: o‘z kalitlariga ega bo‘lgan ma‘lumotlar jadvali (o‘sish tartibida joylashtirilgan) va ma‘lumotlar kalitlaridan tashkil topgan indekslar jadvali. Bu kalitlar asosiy jadvaldan oldindan aniqlangan intervalda olinadi (2-rasm) Bu yerda birinchi berilgan argument bo‘yicha indekslar jadvalidan ketma- ketlikda qidirish amalga oshiriladi. Kalitlarni ko‘rib chiqishda berilgan kalitdan kichigi topilsa, u holda ushbu kichik kalitni asosiy jadvaldagi qidirishning eng quyi chegarasi - low ga joylashtiramiz, xuddi shunday berilgan kalitdan katta deb topilgan kalitni ( kind > key ) yuqori hi ga joylashtiramiz. Misol uchun, key = 101. Algoritmning tahlili . Agar barcha holatlar uchun teng ehtimollik deb hisoblansa, u holda qidirish samaradorligini quyidagicha aniqlash mumkin. I bob. Chiziqli qidiruv Chiziqli qidiruv - ketma-ket qidiruv algoritmi bo'lib, biz bir uchidan boshlaymiz va kerakli element topilgunga qadar ro'yxatning har bir elementini tekshiramiz. Bu eng oddiy qidiruv algoritmidir. 1.1.Chiziqli qidiruv algoritmi ishlashi Quyidagi ro'yxatdagi elementni qidirish uchun quyidagi bosqichlar bajariladi k = 1 . 52-rasm. Indeksli ketma-ket qidirish usuliga misol .