Eng katta qismiy ketma-ketlikni qidirish
![“Eng katta qismiy ketma-ketlikni qidirish”
MUNDARIJA
KIRISH. .......................................................................................................... 2
I Qismiy ketma-ketlikni qidirish ..................................................................... 3
1.1 Ketma-ket qidiruv algoritmi .................................................................. 3
1.2 Teng bo’lish orqali qidiruv (ikkilik qidiruv) algoritmi ......................... 5
1.3 Dastur kodi: ........................................................................................... 6
1.4 Indeksli ketma-ket qidiruv algoritmi. .................................................... 9
II. Qismiy ketma-ketlikni qidirish uchun Knut Morris Pratt algoritmi ......... 12
2.1 Knut Morris Pratt algoritmi haqida ..................................................... 12
2.2 Patterndan DFA yasash: ...................................................................... 14
2.3 Knuth-Morris-Pratt algoritmini kodda ifodalash ................................. 15
III. Deykstra algoritmi .................................................................................. 20
XULOSA ....................................................................................................... 22
FOYDALANILGAN ADABIYOTLAR ....................................................... 24](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_1.png)
![KIRISH.
Algoritm tushunchasi zamonaviy matematika va informatikaning asosiy
tushunchalaridan biri hisobanadi. Algoritm ma’lum bir turga oid masalalarni
yechishda ishlatiladigan amallarning muayyan tartibda bajarilishi haqidagi qoida
hisoblanadi.
“Qismiy ketma-ketlikni qidirish” asosan, algoritmda bu mavzuni
yoritishimizda qidiruv nima ekanligiga to’xtalib o’tsak. Ma’lumotlarni qidirish
algoritmlari bu- to’plam ma’lumotlar orasidan ma’lum bir kalit so’zga mos
keluvchi elimentlarni qidirishga aytiladi. Ma’lumotlarni qidirish algoritmlari
odatda ikki toifaga bo’linadi va bular quydagilar:
Tarkibiy qidiruv: Bunda ro’yxat yoki qator ketma- ket o’tkaziladi va har bir
eliment tekshiriladi. Bunga misol sifatida chiziqli qidiruvni keltirsak bo’ladi.
Qidirish algoritmining eng soddasi bo’lgan chiziqli qidirish algoritmi, chiziqli
ma’lumotlar tuzulmalaridan biror bir shart yoki qiymat bo’yicha eliment qidirishga
mo’ljallangan va uning algoritmik murakkabligi quydagicha: Chiziqli qidirish
algoritmining vaqt bo’yicha murakkabligi uning nomidan ham ma’lum, ya’ni
chiziqli O(n). Ya’ni, eng yomon holat sifatida eliment array bo’lmagan holat
qaraladi va bunda algoritm maximum n ta qadam ish bajarishi kerak bo’ladi.
Intervalli qidirish- bu algoritmar maxsus ajratilgan ma’lumotlar
tuzilmalarida qidirish uchun mo’ljallangan. Ushbu turdagi qidiruv algoritmlari
Linear Search-ga qaraganda ancha samaralidir, chunki ular qayta-qayta qidiruv
tuzulmasi markaziga yo’naladi va qidiruv maydonini ikkiga bo’ladi. Masalan:
Ikkilik qidiruv.
Ikkilik qidiruv- bu algoritmi asosan to’plamni ikkiga bo’lishlar orqali
qidirishdan iborat. Ya’ni unda bo’linishlar toki kalit so’z topulmaganicha davom
etadi.
2](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_2.png)
![I Qismiy ketma-ketlikni qidirish
Kompyuterda ma’lumotlarni qayta ishlashda qidiruv asosiy amallardan
biri hisoblanadi. Uning vazifasi berilgan argument bo’yicha massiv
ma’lumotlari ichidan mazkur argumentga mos ma’lumotlarni topish yoki
bunday ma’lumot yo’qligini aniqlashdan iborat. Ixtiyoriy ma’lumotlar
majmuasi jadval yoki fayl deb ataladi.
Ixtiyoriy ma’lumot (yoki tuzilma elementi) boshqa ma’lumotdan biror
bir belgisi orqali farq qiladi. Mazkur belgi kalit deb ataladi. Kalit noyob
bo’lishi, ya’ni mazkur kalitga ega ma’lumot jadvalda yagona bo’lishi
mumkin. Bunday noyob kalitga boshlang’ich (birinchi) kalit deyiladi.
Ikkinchi kalit bir jadvalda takrorlansada u orqali ham qidiruvni amalga
oshirish mumkin. Ma’lumotlar kalitini bir joyga yig’ish (boshqa jadvalga)
yoki yozuv sifatida ifodalab bitta maydonga kalitlarni yozish mumkin. Agar
kalitlar ma’lumotlar jadvalidan ajratib olinib alohida fayl sifatida saqlansa, u
holda bunday kalitlar tashqi kalitlar deyiladi. Aks holda, ya’ni yozuvning bir
maydoni sifatida jadvalda saqlansa ichki kalit deyiladi. Kalitni berilgan
argument bilan mosligini aniqlovchi algoritmga berilgan argument bo’yicha
qidiruv deb ataladi. Qidiruv algoritmi vazifasi kerakli ma’lumotni jadvaldan
topish yoki yo’qligini aniqlashdan iboratdir. Agar kerakli ma’lumot yo’q
bo’lsa, u holda ikkita ishni amalga oshirish mumkin:
1. Ma’lumot yo’qligini indikatsiya qilish (belgilash)
2. Jadvalga ma’lumotni qo’yish.
Faraz qilaylik, k – kalitlar massivi. Har bir k(i) uchun r(i) – ma’lumot
mavjud. Key – qidiruv argumenti. Unga rec - informatsion yozuv mos
qo’yiladi. Jadvaldagi ma’lumotlarning tuzilmasiga qarab qidiruvning bir necha
turlari mavjud.
1.1 Ketma-ket qidiruv algoritmi
Mazkur ko’rinishdagi qidiruv agar ma’lumotlar tartibsiz yoki ular
tuzilishi noaniq bo’lganda qo’llaniladi. Bunda ma’lumotlar butun jadval
bo’yicha operativ xotirada kichik adresdan boshlab, to katta adresgacha
ketma-ket qarab chiqiladi.
Massivda ketma-ket qidiruv (search o’zgaruvchi topilgan element tartib
raqamini saqlaydi).
3](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_3.png)
![Ketma-ket qidiruv algoritmi C++ tilida quyidagicha bo’ladi:
int qidiruv(int key)
{ for (int i=0;i<n;i++)< p=""></n;i++)<>
if (k[i]==key) { search = i;return search;}
search = -1;
return search;
}
}
Massivda ketma-ket qidiruv algoritmi samaradorligini bajarilgan
taqqoslashlar soni M bilan aniqlash mumkin. M
min = 1, M
max = n. Agar
ma’lumotlar massiv yacheykasida bir xil ehtimollik bilan taqsimlangan
bo’lsa, u holda M
o’rt (n + 1)/2 bo’ladi. Agar kerakli element jadvalda
yo’q bo’lib, uni jadvalga qo’shish lozim bo’lsa, u holda yuqorida keltirilgan
algoritmdagi oxirgi ikkita operator quyidagicha almashtiriladi .
n=n+1;
k[n-1]:=key;
r[n-1]:=rec; search:=n-1;
return search;
Agar ma’lumotlar jadvali bir bog’lamli ro’yhat ko’rinishida berilgan
bo’lsa , u holda ketma-ket qidiruv ro’yhatda amalga oshiriladi.
1-Rasm
Chiziqli bir bog’lamli ro’yhatdan key kalitga mos elementni ketma-ket
qidiruv usuli yordamida izlab topish dasturi.
Node *q=NULL;
Node *p=lst;
while (p !=NULL){
4](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_4.png)
![if (p->k == key){ search = p;
return search;
}
q = p;
p = p->nxt;
}
Node *s=new Node;;
s->k=key;
s->r=rec;
s->nxt= NULL;
if (q == NULL){ s->nxt=lst; lst = s;
}
else q->nxt = s;
search= s;
return search;
Ro’yhatli tuzilmaning afzalligi shundan iboratki, ro’yhatga elementni
qo’shish yoki o’chirish tez amalga oshadi, bunda qo’shish yoki o’chirish
element soniga bog’liq bo’lmaydi, massivda esa elementni qo’shish yoki
o’chirish o’rta hisobda barcha elementlarning yarmini siljitishni talab qiladi.
Ro’yhatda qidiruvning samaradorligi taxminan massivniki bilan bir xil
bo’ladi.
1.2 Teng bo’lish orqali qidiruv (ikkilik qidiruv) algoritmi
Faraz qilaylik, o’sish tartibida tartiblangan sonlar massivi berilgan
bo’lsin. Ushbu usulning asosiy g’oyasi shundan iboratki, tasodifiy qandaydir
A
M element olinadi va u X qidiruv argumenti bilan taqqoslanadi. Agar
A
M =X bo’lsa, u holda qidiruv yakunlanadi; agar A
M >X bo’lsa, u holda
indekslari M dan katta bo’lgan barcha elementlar kelgusi qidiruvdan chiqarib
yuboriladi.
5](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_5.png)
![M ixtiyoriy tanlanganda ham taklif qilinayotgan algoritm korrekt
ishlaydi. Shu sababali M ni shunday tanlash lozimki, tadqiq qilinayotgan
algoritm samaraliroq natija bersin, ya’ni uni shunday tanlaylikki, iloji boricha
kelgusi jarayonlarda ishtirok etuvchi elementlar soni kam bo’lsin. Agar biz
o’rtacha elementni, ya’ni massiv o’rtasini tanlasak yechim mukammal
bo’ladi. Misol uchun butun sonlardan iborat, o’sish bo’yicha tartiblangan
massivdan ikkilik qidiruv usuli yordamida key kalitga mos elementni izlash
dasturini ko’rib chiqamiz.
1.3 Dastur kodi:
#include <iostream>
using namespace std ;
int main(){
int n;cout<<"n=";cin>>n;
int k[n];
for(int i=0;i>k[i];
int key, search;
cout<<"qidirilayotgan elementni kiriting=";cin>>key;
int low = 0;
while (low <= hi){
int mid = (low + hi) / 2;j++;
if (key == k[mid]){
search = mid;
cout<<"qidirilayotgan element "<<search+1<<" o’rinda="" turibdi=""
va="" u="" "<<j<<"="" ta="" solishtirishda="" toplidi\n";<=""
p=""></search+1<<">
system("pause");
exit(0);
}
if (key < k[mid])
hi = mid - 1;
6](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_6.png)
![else low = mid + 1;
}
search=-1;
cout<<j<<" ta="" solishtirish="" amalga="" oshirildi="" va=""
qidirilayotgan="" element="" topilmadi\n";<="" p=""></j<<">
system("pause"); }
Dastur natijasi:
n=6
1 2 3 4 5 6
qidirilayotgan elementni kiriting=6
qidirilayotgan element 6 o'rinda turibdi va u 3 ta solishtirishda toplidi
Qidiruv jadvalini qayta tartibga keltirish
Umuman olganda, jadvalda har bir elementni qidirish ehtimolligini
qandaydir bir qiymat bilan izohlash mumkin. Faraz qilaylik jadvalda
qidirilayotgan element mavjud. U holda qidiruv amalga oshirilayotgan
jadvalni diskret holatga ega tizim sifatida qarash mumkin hamda unda
qidirilayotgan elementni topish ehtimolligi – bu tizim i-chi holati ehtimolligi
p(i) deb olish mumkin.
2-Rasm
Jadvalni diskret tizim sifatida qaraganimizda, undagi taqqoslashlar soni
diskret tasodifiy miqdorlar qiymatlarini matematik kutilmasini ifodalaydi.
Z=Q=1*p(1)+2*p(2)+3*p(3)+…+n*p(n)
Ma’lumotlar jadvalda quyidagi ko’rinishda tartiblangan bo’lishi lozim:
p(1) p(2) p(3) … p(n).
7](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_7.png)
![Bu shart taqqoslashlar sonini kamaytirib, samaradorlikni oshiradi.
Sababi, ketma-ket qidiruv birinchi elementdan boshlanganligi uchun eng ko’p
murojaat qilinadigan elementni birinchiga qo’yish lozim.
Qidiruv jadvalini qayta tartibga keltirishning eng ko’p ishlatiladigan
ikkita usuli mavjud. Ularni bir bog’lamli ro’yhatlar misolida ko’rib chiqamiz.
1. Topilgan elementni ro’yhat boshiga qo’yish orqali qayta tartibga
keltirish.
2. Transpozitsiya usuli.
Topilgan elementni ro’yhat boshiga qo’yish orqali qayta tartibga
ketirish.
3-Rasm
Topilgan element birdaniga ro’yhat boshiga joylashtiriladi. Tuzilmadan
har safar birorta element izlab topilsa va u ro’yhat boshiga olib borib
qo’yilaversa, natijada oxirgi izlangan elementlar ro’yhat boshiga joylashib
qoladi va biz oxirgi vaqtlarda izlangan elementlarni tez izlab topish
imkoniga ega bo’lamiz.
Boshida q ko’rsatkich bo’sh, p esa ro’yhat boshini ko’rsatadi; p
ikkinchi elementni ko’rsatganda, q birinchini ko’rsatadi. Ro’yhat boshi
ko’rsatkichi (table) birinchi elementni ko’rsatadi. Ro’yhatda key kalitli
element topilsa, u p ko’rsatkich bilan, undan oldingi element esa q
ko’rsatkich bilan belgilanadi. Shu topilgan p elementni ro’yhat boshiga
joylashtiriladi.
Dastur kodi:
node *q=NULL;
node *p=table;
8](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_8.png)
![while (p !=NULL){
if (key == p->k){
if (q == NULL) { //o‘rinlashtirish shart emas
search = p;
exit(0);
}
q=p;
p = p->nxt;
}
exit(0);
1.4 Indeksli ketma-ket qidiruv algoritmi.
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 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 chegarasiga joylashtiramiz, xuddi shunday
berilgan kalitdan katta deb topilgan kalitni yuqori chegaraga joylashtiramiz.
Qidiruv butun jadval bo’yicha emas, balki quyi chegaradan yuqori chegaragacha
amalga oshiriladi.
Ushbu qidiruv algoritmi quyidagicha (Psevdokodda):
i = 1
while (i <= m) and (kind(i) <= key) do
9](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_9.png)
![i=i+1
end while
if i = 1 then low = 1
else low = pind(i-1)
endif
if i = m+1 then hi = n
else hi = pind(i)-1
endif
for j=low to hi
if key = k(j) then
search=j
return;
endif
next j
search=0
return 0;
}
10](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_10.png)
![11](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_11.png)
![II. Qismiy ketma-ketlikni qidirish uchun Knut Morris Pratt
algoritmi
2.1 Knut Morris Pratt algoritmi haqida
Knut-Morris-Pratt algoritmi. Matnda namuna satrni izlovchi ch е kli
avtomat qurishda boshlang`ich holatdan tugallovchi holatga o’tishlar namuna
satrga kiruvchi simvollar bilan b е lgilab olinadi. Asosiy muammo namuna
satrga tugallovchi holatga olib k е lmaydigan simvollarni qo’shish jarayonida
vujudga k е ladi.
Knut-Morris-Pratt algoritmi ch е kli avtomat printsipiga asoslanadi, ammo
unda mos tushmaydigan simvollarni qayta ishlashning boshqaa usulidan
foydalaniladi. Ushbu algoritmda ch е kli avtomat holatlari ayni paytda mos
tushishi k е rak bo’lgan simvollar orqali b е lgilab olinadi. Har bir holatda ikki
yo’nalishda o’tish imkoniyati mavjud: birinchisi – mos tushish ro’y b е rgan
holat; ikkinchisi – mos tushish ro’y b е rmagan holatga to’g’ri k е ladi. Mos
tushish ro’y b е rganda avtomatning k е yingi tugunga o’tishi yuzb е radi, aks
holda joriy tugundan oldingi (orqaga) tugunga o’tish yuz b е radi. Quyidagi
tasvirda ababcb namuna satri uchun tuzilgan Knut-Morris-Pratt avtomatining
sx е matik tuzilishi ifoda etilgan:
Har bir muvaffaqiyatli o’tish bajarilganda Knut-Morris-Pratt ch е kli
avtomatida matndan yangi simvol tanlanadi. Muvaffaqiyatsiz o’tishlarda yangi
simvol tanlanmasdan, buning o’rniga oxirgi marta tanlangan simvol takroran
qayta ishlanadi. Agar avtomat tugallovchi holatga o’tsa, matndan namuna
satr topildi d е b, hisoblanadi. Quyida ushbu algoritm matnini k е ltiramiz:
subLoc=1// Namuna satrdagi taqqoslanuvchi joriy simvol ko’rsatkichi
textLoc=1//Matndagi taqqoslanuvchi joriy simvol ko’rsatkichi
while textLoc<=length(text) and subLoc<=length(substring) do
if subLoc=0 or text [textLoc]=substring[subLoc] then
textLoc=textLoc+1
subLoc= subLoc+1
else // mos tushmaslik yuz b е rdi; mos tushmaslik bo’yicha o’tish
subLoc=fail[subLoc]
12](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_12.png)
![end while
if (subLoc>length(substring) then
return textLoc-length(substring)+1// topilgan mos tushish
else return 0// izlangan namuna topilmadi
end if
Matn ichida qidiruv uchun brute-force yondashuvining kamchiligi –
pattern’dagi belgilardan biri qidiruvda mos kelmay qolganda, qidiruvni boshqatdan
boshlashi kerak. Shuning uchun worst case O(N*M) bo’lib ketadi. Misol uchun,
bizda matn A B A A A A B A A A A A A A A A bo’lsin. Pattern esa
BAAAAAAAAA .
Qidiruv jarayoni:
A B A A A A B A A A A A A A A A
B A A A A A A A A A
….B A A A A A A A A A
…… B A A A A A A A A A
…….. B A A A A A A A A A
……… B A A A A A A A A A
………… B A A A A A A A A A
…………B A A A A A A A A A
Mana ko`rib turibmizki, ikkinchi siklda patternning 6-belgisi mos kelmay
qoldi. Demak biz text’dagi biz ko’rib o’tgan ohirgi 6 belgi BAAAAB
ekanini bilamiz. Nima uchun qidiruvni yana boshqatdan boshlashimiz kerak?
3-6 sikllarni tushirib qoldirib, 7-sikldan davom ettirishning imkoni bormi?
13](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_13.png)
![Knuth-MorrisPratt (KMP) algoritmi mana shu muammoga yechim
sifatida kelib, qidiruvni boshqatdan boshlamaslikning imkonini beradi. U
Deterministic Finite Automaton g’oyasiga asoslangan.
2.2 Patterndan DFA yasash:
Yuqoridagi jadval va graph’ni biz o’zimi ko’rib turib yasadik. Kodda
qanday qilib berilgan pattern’dan DFAni yasaymiz?
DFAni yasashda ikki xil holat bor:
Mos kelish . j-holatida, keyingi belgi c == pattern.charAt(j) bo’lsa, u
holda j ni bittaga oshiramiz.
Mos kelmaslik . j-holatida, keyingi belgi c != pattern.charAt(j) bo’lsa,
u holda ohirgi j-1 belgilar pattern[1..j-1] ichida bo’ladi.
1-Jadval:
function dfaGenerator ( pattern ) {
R = 128
const M = pattern . length
const dfa = [ ... Array ( R ). fill ( null )]. map (() => Array ( M ). fill ( 0 ))
dfa [ pattern . charCodeAt ( 0 )][ 0 ] = 1
for ( let x = 0 , j = 1 ; j < M ; j ++ ) {
for ( let c = 0 ; c < R ; c ++ ) {
// Copy mismatched cases
dfa [ c ][ j ] = dfa [ c ][ x ]
// Set match case
dfa [ pattern . charCodeAt ( j )][ j ] = j + 1
14](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_14.png)
![// Update restart state
x = dfa [ pattern . charCodeAt ( j )][ x ]
}
}
return dfa
}
2.3 Knuth-Morris-Pratt algoritmini kodda ifodalash
function KMPSearch ( str , pattern ) {
const N = str . length
const M = pattern . length
const dfa = dfaGenerator ( pattern )
let i , j
if ( ! N || ! M ) {
return -1
}
for ( i = 0 , j = 0 ; i < N && j < M ; i ++ ) {
j = dfa [ str . charCodeAt ( i )][ j ]
}
if ( j === M ) {
return i – M
}
15](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_15.png)
![else {
return N
}
function dfaGenerator ( pattern ) {
R = 128
const M = pattern . length
const dfa = [ ... Array ( R ). fill ( null )]. map (() => Array ( M ). fill ( 0 ))
dfa [ pattern . charCodeAt ( 0 )][ 0 ] = 1
for ( let x = 0 , j = 1 ; j < M ; j ++ ) {
for ( let c = 0 ; c < R ; c ++ ) {
// Copy mismatched cases
dfa [ c ][ j ] = dfa [ c ][ x ]
// Set match case
dfa [ pattern . charCodeAt ( j )][ j ] = j + 1
// Update restart state
x = dfa [ pattern . charCodeAt ( j )][ x ]
}
}
return dfa
}
}
16](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_16.png)
![/**
* USAGE
*/
Masofani aniqlash misolini ko’rib chiqaylik. Shahar viloyatlarini
birlashtiruvchi avtomobil yo’llari tarmog’I berilgan bo’lsin. Ba’zi yo’llar bir
tomonlama. Shahar markazidan har bir viloyatga eng qisqa yo’lni topishimiz
zarur.
Keltirilgan masalani yechishda Deykstraning algoritmidan
foydalanishimiz mumkin. Algoritm graflarga asoslangan bo’lib, u 1959- yil
niderlandiyalik olim E. Deykstra tomonidan yaratilgan. U grafning bitta
uchidan boshqa uchlarigacha eng qisqa masofani aniqlaydi, bunda grafning
yechimlari manfiy bo’lmasligi lozim. Bizdan birinchi uchdan qolganlariga
borishning qisqa masofasini topish talab qilinsin.
Doiralar shaklida uchlar, chiziqlar shaklida ular orasidagi yo’l
tasvirlangan. Doiralar ichida uchlarning nomerlari, elimentlari ostida ularning
ma’lumoti – yo’l uzunligi berilgan. Har bir uchning yonida qizil belgi bilan
shu uchga birinchi uchdan eng qisqa masofa uzunligi belgilangan.
Tadbiq
1–uchning belgisi 0 ga teng deb hisoblanadi, qolgan uchlarning
belgilari yetib bo’lmas darajada juda katta sonlardan iborat. Bu 1–uchdan
boshqalarigacha bo’lgan masofa hali noma’lumligiki ko’rsatadi. Grafning
barcha uchlari ko’rilmagan deb belgilanadi.
Birinchi qadam
Minimal belgiga 1–uch ega. Uning qo’shnilari 2, 3 va 6 uchlar.
Uchning qo’shnilarini navbat bilan ko’rib chiqamiz. 1–uchning birinchi
qo’shnisi 2–uch, chunki ungacha bo’lgan masofa minimal. 1–uch orqali
ungacha bo’lgan masofa 1–uchgacha bo’lgan qisqa masofaning summasiga
teng, 1–dan 2–ga boruvchi uning belgisi va qovurg’asi uzunligiga, ya’ni
0+7=7. Bu 2–uchning joriy belgisidan (10000) kichik, shu sababdan ham 2–
uchning yangi belgisi 7 ga teng.
Shunga mos ravishda qolgan qo’shnilar (3 va 6 uchlar) uchun ham
yo’l uzunligini aniqlaymiz. 1-uchning barcha qo’shnilari ko’rib chiqildi. 1-
17](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_17.png)
![uchgacha joriy minimal masofa yakuniy hisoblanadi va qayta ko’rib
chiqilmaydi. 1-uch ko’rib chiqildi deb belgilanadi.
Ikkinchi qadam
Birinchi qadam takrorlanadi. Ko’rib chiqilmagan uchlardan “yaqini”ni
topamiz. Bu 2-uch belgisi 7 ga teng. Yana tanlangan uchning qo’shnilari
belgilarini kamaytirishga harakat qilamiz, bunda ularga 2-uch orqali o’tamiz.
2- uchning qo’shnilari 1, 3 va 4 uchlar.
1-uch ko’rib chiqilgan, shu sababdan 3-uch ko’rib chiqilmagan va
uchlar ichida minimal belgiga ega. Agar unga 2 orqali borilsa, u holda bu
yo’lning uzunligi 17 (7+10=17) ga teng bo’ladi. Ammo 3-uchning joriy
belgisi 9 ga teng, ya’ni 9<17, shu sababdan belgi o’zgarishsiz qoladi.
2-uchning yana bir qo’shnisi 4-uch. Agar unga 2-uch orqali borsak, u
holda bunday yo’lning uzunligi 22 (7+15=22) ga teng. 22<10000 dan
bo’lganligi sabab, 4-uchning belgisini 22 ga tenglaymiz.
2-uchning barcha qo’shnilari ko’rib chiqildi, endi uni ko’rib chiqilgan
sifatida belgilaymiz.
Uchinchi qadam. 3-uchni tanlab algoritmning qadamini takrorlaymiz.
Uni “qayta ishlab chiqish”dan so’ng quyidagi natijaga ega bo’lamiz.
To’rtinchi qadam
Beshinchi qadam
Oltinchi qadam
Shu tarzda 1-uchdan 5-uchga eng qisqa masofa 1 – 3 – 6 – 5 uchlari
orqali bo’ladi. Shu yo’l orqali biz 20 ga teng minimal og’irlik yig’amiz.
Minimal masofa haqida xulosaga keladigan bo’lsak. Har bir uch uchun
yo’l uzunligini bilamiz va endi uchlarni oxirdan ko’rib chiqamiz. Yakuniy
uchni ko’rib chiqamiz (bu holatda 5-uch). U bilan bog’langan barcha
uchlarni ham ko’rib chiqamiz, yakuniy uch yo’li uzunligidan mos
qovurg’aning og’irligini ayirgan holda yo’l uzunligini topamiz. Bizda 5-uch
yo’l uzunligi 20. U 6 va 4 uchlar bilan bog’langan. 6- uch uchun 20-9=11
og’irlikka ega bo’lamiz (mos tushdi). 4-uch uchun 20-6=14 og’irlikka ega
bo’lamiz (mos tushmadi). Agar natijada biz ko’rilayotgan uchning (joriy
holda 6-uch) yo’l uzunligiga mos qiymatga ega bo’lsak, u holda yakuniy
18](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_18.png)
![uchga o’tish aynan o’sha uchdan amalga oshirilgan bo’ladi. Bu uchni
qidirilayotgan yo’lda belgilan qo’yamiz.
6 -uchga qaysi qovurg’a orqali kelganimizni aniqlaymiz. Va shu holda
toki boshiga chiqmagunimizcha davom qildiramiz.
Agar bunday kuzatish natijasida bizda qaysidir qadamda bir nechta
uchlar uchun bu qiymat mos tushsa, u holda ulardan ixtiyoriy birini olish
mumkin – bir necha yo’llar bir xil uzunlikka ega bo’ladi.
Graf – bu tugunlar va qirralar (tugunlar juftligini birlashtiruvchi)
to’plamidan iborat bo’lgan abstrakt matematik obyektdir.
4-Rasm:
Grafning elementlari tarkibi va munosabatlar tuzilishi beriladi. Grafning
tarkibiy qismlari bu uning tugunlari va qirralaridir.
5-Rasm:
Tarmoq
19](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_19.png)
![Bir nechta juft tugunlararo qirralardan iborat bo’lgan turlicha yo’llar
to’plami mavjud bo’lishi mumkin. Yopiq yo’llar – sikllarning mavjud
bo’lishi tarmoqlarga xos xususiyatdir.
Yo’naltirilmagan graf yoki simmetrik bog’liqlik
Yo’naltirilmagan graf yoki nosimmetrik bog’liqlik
qirra yoylar
Ilmoq – aynan bitta tugundan chiqib, yana shu tugunga kiruvchi qirra.
III. Deykstra algoritmi
Gollandiyalik olim Edsger Deykstra algoritmi grafning boshlang’ich
berilgan tugunidan boshlab qolgan barcha tugunlargacha bo'lgan barcha eng
qisqa yo'llarni topadi. Uning yordamida, agar barcha zarur ma'lumotlar
berilgan bo'lsa, masalan, neft va shu kabi mahsulotlarni eksport qilish uchun
bitta shahardan boshqa shaharlarning har biriga borish uchun qaysi yo'llar
ketma-ketligini tanlash afzalroq ekanligini bilib olish mumkin. Ushbu
usulning salbiy tomoni shundaki, manfiy vaznga ega bo’lgan qirralari mavjud
bo'lgan graflarni qayta ishlash imkonining mavjud emasligi, ya'ni, masalan,
ba'zi tizim birorta kompaniya uchun foydasiz bo'lgan marshrutlarni taqdim
qilsa, u holda u bilan ishlash uchun Dijkstraning algoritmidan foydalanib
bo’lmaydi.
Algoritmni dasturiy ta'minotini amalga oshirish uchun ikkita massiv
kerak bo'ladi: mantiqiy toifadagi visited - tashrif buyurilgan tugunlar haqidagi
20](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_20.png)
![ma'lumotlarni saqlash uchun va topilgan eng qisqa yo'llar kiritiladigan butun
toifadagi - distance . G={V,E} graf berilgan bo’lsin. V to’plamga tegishli
barcha tugunlar dastlab tashrif buyurilmagan deb belgilanadi, ya’ni visited
massivining elementlariga false qiymat berib chiqiladi. Eng afzal yo’lni
topish masalasi qaralyapti. Distance massivining har bir elementiga shunday
qilib beriladiki, ixtiyoriy potensial yo’ldan katta bo’lsin (odatda, bu qiymatni
cheksiz katta qiymat deb qaraladi, ammo dasturda berilgan toifaning
qiymatlar diapazonidagi eng katta qiymat sifatida olinadi). Boshlang'ich nuqta
sifatida s tugun tanlanadi va unga nol yo'l belgilanadi: distance [s] = 0,
chunki s-dan s-gacha hech qanday qirra yo'q (bu usulda ilmoqlar
qaralmaydi).
Shundan keyin, barcha qo'shni tugunlar topiladi (s dan chiquvchi
qirralar orqali) [ularni t va u deb belgilaylik] va ular birma-bir tekshirib
ko'riladi, ya'ni s tugundan har bir tugungacha birma-bir marshrut bahosi
hisoblanadi:
- distance[t]=distance[s]+ s va t orasidagi qirraning vazni;
- Distance[u]=distance[s]+ s va u orasidagi qirraning vazni.
Ehtimoldan xoli emaski, u yoki bu tugunga s dan bir qancha yo’llar
bo’lishi mumkin. Shu sababli, distance massivida bu tugunga bo’lgan
yo’lning vaznini qayta ko’rib chiqish kerak bo’ladi. Shunda kattaroq
(nooptimal) qiymat yo’qotiladi va tugunga mos yo’lning vazniga kichikroq
qiymat beriladi. s tugun bilan qo’shni bo’lgan va qarab chiqilgan tugunlar
tashrif buyurilgan sifatida belgilab chiqiladi, yani visited[s]=true va natijada,
s dan chiquvchi, minimal vaznga ega bo’lgan yo’l eltuvchi tugun faol
element sifatida belgilab olinadi. Faraz qilamiz, s dan u gacha masofa t ga
qaraganda qisqa bo’lsin. Kelib chiqadiki, u tugun faollashadi va yuqoridagi
kabi uning qo’shnilari ( s dan tashqari) o’rganilib chiqiladi. u tugun tashrif
buyurilgan deb belgilanadi: visited[u]=true, endi t tugun faollashadi va
yuqoridagi prosedura uning uchun takrorlanadi. Deykstra algoritmi s
tugundan borish mumkin bo’lgan barcha tugunlar tadqiq qilinmaguncha davom
ettiriladi.
Algoritm tarixi uchta mustaqil matematiklar bilan bog'liq: Lester Ford,
Richard Bellman va Edward Moore. Ford va Bellman algoritmni 1956 va
1958 yillarda nashr etishdi, Moore esa 1957 yilda taqdim qilgan. Va ba'zan
uni Bellman-Ford-Moore algoritmi deb ham atashadi. Usul ba'zi vektorli-
marshrutlash protokollarida, masalan, RIPda (Routing Information Protocol)
qo'llaniladi. Deykstra algoritmi singari, Bellman-Ford algoritmi ham vaznga
21](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_21.png)
![ega bo’lgan graflarda bitta tugundan qolgan barcha tugunlarga bo’lgan eng
qisqa masofani aniqlashda ishlatiladi. Bu algoritm manfiy elementga ega
bo’lgan graflar bilan ishlashda ham qo’llanilishi mumkin
XULOSA
Xulosa qilib aytganda, qidirish o`zi kompyuter ma’lumotlarini qayta
ishlashda asosiy amallardan biri hisoblanadi. Uning vazifasi berilgan argument
bo’yicha massiv ma’lumotlari ichidan maxsus argumentga mos ma’lumotalarni
topish, yoki bunday ma’lumot yo’qligini aniqlashdan iborat. Teng bo’lish orqali
qidiruv o’sish tartibida tartiblangan sonlar massivi berilgan bo’lsin. Bu usulning
asosiy g’oyasi shundan iboratki tasodifiy qandaydir A
M element olinadi va bu X
qidiruv agument bilan taqqoslanadi. Agar A
M =X bo’lsa qidiruv yakunlanadi. Agar
A
M -> X bo’lsa, u holda indekslar m dan katta bo’lgan barcha elementlar kelgusi
qidiruvda chiqarib yuboriladi.
Asosan bu kurs ishida “Eng katta qismiy ketma-ketikni qidirish” mavzusi
yoritildi. Bunda ikkilik qidiruv, intervalli qidiruv, chiziqli qidiruvlarga to’xtalib
o’tildi. Hamda, bu mavzuni asoslab berishda Knut Morris Pratt va Deykstra
algoritmaridan foydalanildi.
Kurs ishi kirish, asosiy qism, xulosa va foydalanilgan adabiyotlar
ro’yxatidan iborat. Asosiy qism uchta bo’limni o’z ichiga oladi. Bular qismiy
ketma-ketlikni qidirish, qismiy ketma-ketlikni qidirish uchun Knut Morris Pratt
agoritmi va Deykstra algoritmlari kabi bo’limlari haqida ko’plab qoidalar, misollar
hamda jadvallar ko’rib chiqildi.
Ushbu kurs ishida “Eng katta qismiy ketma-ketlikni qidirish” mavzusini
yozishda bir nechta adabiyotlar va internet manzillaridan foydalanildi.
22](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_22.png)
![23](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_23.png)
![FOYDALANILGAN ADABIYOTLAR
1. A.R. Azamatov, “Algoritimlash va dasturlash asoslari”. Cho'lpon nomidagi
nashriyot-matbaa ijodiy uyi Toshkent — 2013 .
2. B.B. Akbaraliyev. “Ma’lumotlar tuzilmasi va algoritimlar”. Toshkent – 2011.
3. B. V. SHabat. Vvedenie v kompleksniy analiz. 1-chast. M.N. 1989. Nazarov
Fayzullo Maxmadiyarovich, “Algoritimlar va ma’lumotlar strukturasi”.
Samarqand – 2019.
4. G. Xudayberganov, A. Vorisov, X. Mansurov. Kompleks analiz. Toshkent,
«Universitet», 1998.
5. G. Xudayberganov, A. Vorisov, X. Mansurov. Kompleks analiz. Karshi.
«Nasaf», 2003.
6. T. X. Holmatov, N. I. Tayloqov . Amaliy matematika, dasturlash va
kompyuterning dasturiy ta`minoti. O quv qo llanmaʻ ʻ . T :. “Me h nat”, 2000 y.
7. Virt N. Algoritm i strukturi dannix programmi .-M.:Mir, 1985.-405s Sh. I.
8. Razzoqov, M. J. Yunusova. Dasturlash: Kasb-hunar kollejlari uchun o quv
ʻ
qo llanma. T. : “Ilm Ziyo”, 2011y.
ʻ
9. okhotin_algorithms_2019_l8.pdf (spbu.ru)
10. Tez katlama algoritmini qanday qo'llash kerak? - Astronomiya - 2021
(gsusigmanu.org)
11. Алгоритм Дейкстры нахождения кратчайшего пути ( prog - cpp . ru )
12. Алгоритм Дейкстры. Поиск оптимальных маршрутов на графе / Хабр
(habr.com)
13. Это маленькое чудо — алгоритм Кнута-Морриса-Пратта (КМП) / Хабр
(habr.com)
14. НОУ ИНТУИТ | Лекция | Алгоритмы поиска в тексте (intuit.ru)
24](/data/documents/928bb12e-355b-4b6c-aa37-c43dd5e7b75d/page_24.png)
“Eng katta qismiy ketma-ketlikni qidirish” MUNDARIJA KIRISH. .......................................................................................................... 2 I Qismiy ketma-ketlikni qidirish ..................................................................... 3 1.1 Ketma-ket qidiruv algoritmi .................................................................. 3 1.2 Teng bo’lish orqali qidiruv (ikkilik qidiruv) algoritmi ......................... 5 1.3 Dastur kodi: ........................................................................................... 6 1.4 Indeksli ketma-ket qidiruv algoritmi. .................................................... 9 II. Qismiy ketma-ketlikni qidirish uchun Knut Morris Pratt algoritmi ......... 12 2.1 Knut Morris Pratt algoritmi haqida ..................................................... 12 2.2 Patterndan DFA yasash: ...................................................................... 14 2.3 Knuth-Morris-Pratt algoritmini kodda ifodalash ................................. 15 III. Deykstra algoritmi .................................................................................. 20 XULOSA ....................................................................................................... 22 FOYDALANILGAN ADABIYOTLAR ....................................................... 24
KIRISH. Algoritm tushunchasi zamonaviy matematika va informatikaning asosiy tushunchalaridan biri hisobanadi. Algoritm ma’lum bir turga oid masalalarni yechishda ishlatiladigan amallarning muayyan tartibda bajarilishi haqidagi qoida hisoblanadi. “Qismiy ketma-ketlikni qidirish” asosan, algoritmda bu mavzuni yoritishimizda qidiruv nima ekanligiga to’xtalib o’tsak. Ma’lumotlarni qidirish algoritmlari bu- to’plam ma’lumotlar orasidan ma’lum bir kalit so’zga mos keluvchi elimentlarni qidirishga aytiladi. Ma’lumotlarni qidirish algoritmlari odatda ikki toifaga bo’linadi va bular quydagilar: Tarkibiy qidiruv: Bunda ro’yxat yoki qator ketma- ket o’tkaziladi va har bir eliment tekshiriladi. Bunga misol sifatida chiziqli qidiruvni keltirsak bo’ladi. Qidirish algoritmining eng soddasi bo’lgan chiziqli qidirish algoritmi, chiziqli ma’lumotlar tuzulmalaridan biror bir shart yoki qiymat bo’yicha eliment qidirishga mo’ljallangan va uning algoritmik murakkabligi quydagicha: Chiziqli qidirish algoritmining vaqt bo’yicha murakkabligi uning nomidan ham ma’lum, ya’ni chiziqli O(n). Ya’ni, eng yomon holat sifatida eliment array bo’lmagan holat qaraladi va bunda algoritm maximum n ta qadam ish bajarishi kerak bo’ladi. Intervalli qidirish- bu algoritmar maxsus ajratilgan ma’lumotlar tuzilmalarida qidirish uchun mo’ljallangan. Ushbu turdagi qidiruv algoritmlari Linear Search-ga qaraganda ancha samaralidir, chunki ular qayta-qayta qidiruv tuzulmasi markaziga yo’naladi va qidiruv maydonini ikkiga bo’ladi. Masalan: Ikkilik qidiruv. Ikkilik qidiruv- bu algoritmi asosan to’plamni ikkiga bo’lishlar orqali qidirishdan iborat. Ya’ni unda bo’linishlar toki kalit so’z topulmaganicha davom etadi. 2
I Qismiy ketma-ketlikni qidirish Kompyuterda ma’lumotlarni qayta ishlashda qidiruv asosiy amallardan biri hisoblanadi. Uning vazifasi berilgan argument bo’yicha massiv ma’lumotlari ichidan mazkur argumentga mos ma’lumotlarni topish yoki bunday ma’lumot yo’qligini aniqlashdan iborat. Ixtiyoriy ma’lumotlar majmuasi jadval yoki fayl deb ataladi. Ixtiyoriy ma’lumot (yoki tuzilma elementi) boshqa ma’lumotdan biror bir belgisi orqali farq qiladi. Mazkur belgi kalit deb ataladi. Kalit noyob bo’lishi, ya’ni mazkur kalitga ega ma’lumot jadvalda yagona bo’lishi mumkin. Bunday noyob kalitga boshlang’ich (birinchi) kalit deyiladi. Ikkinchi kalit bir jadvalda takrorlansada u orqali ham qidiruvni amalga oshirish mumkin. Ma’lumotlar kalitini bir joyga yig’ish (boshqa jadvalga) yoki yozuv sifatida ifodalab bitta maydonga kalitlarni yozish mumkin. Agar kalitlar ma’lumotlar jadvalidan ajratib olinib alohida fayl sifatida saqlansa, u holda bunday kalitlar tashqi kalitlar deyiladi. Aks holda, ya’ni yozuvning bir maydoni sifatida jadvalda saqlansa ichki kalit deyiladi. Kalitni berilgan argument bilan mosligini aniqlovchi algoritmga berilgan argument bo’yicha qidiruv deb ataladi. Qidiruv algoritmi vazifasi kerakli ma’lumotni jadvaldan topish yoki yo’qligini aniqlashdan iboratdir. Agar kerakli ma’lumot yo’q bo’lsa, u holda ikkita ishni amalga oshirish mumkin: 1. Ma’lumot yo’qligini indikatsiya qilish (belgilash) 2. Jadvalga ma’lumotni qo’yish. Faraz qilaylik, k – kalitlar massivi. Har bir k(i) uchun r(i) – ma’lumot mavjud. Key – qidiruv argumenti. Unga rec - informatsion yozuv mos qo’yiladi. Jadvaldagi ma’lumotlarning tuzilmasiga qarab qidiruvning bir necha turlari mavjud. 1.1 Ketma-ket qidiruv algoritmi Mazkur ko’rinishdagi qidiruv agar ma’lumotlar tartibsiz yoki ular tuzilishi noaniq bo’lganda qo’llaniladi. Bunda ma’lumotlar butun jadval bo’yicha operativ xotirada kichik adresdan boshlab, to katta adresgacha ketma-ket qarab chiqiladi. Massivda ketma-ket qidiruv (search o’zgaruvchi topilgan element tartib raqamini saqlaydi). 3
Ketma-ket qidiruv algoritmi C++ tilida quyidagicha bo’ladi: int qidiruv(int key) { for (int i=0;i<n;i++)< p=""></n;i++)<> if (k[i]==key) { search = i;return search;} search = -1; return search; } } Massivda ketma-ket qidiruv algoritmi samaradorligini bajarilgan taqqoslashlar soni M bilan aniqlash mumkin. M min = 1, M max = n. Agar ma’lumotlar massiv yacheykasida bir xil ehtimollik bilan taqsimlangan bo’lsa, u holda M o’rt (n + 1)/2 bo’ladi. Agar kerakli element jadvalda yo’q bo’lib, uni jadvalga qo’shish lozim bo’lsa, u holda yuqorida keltirilgan algoritmdagi oxirgi ikkita operator quyidagicha almashtiriladi . n=n+1; k[n-1]:=key; r[n-1]:=rec; search:=n-1; return search; Agar ma’lumotlar jadvali bir bog’lamli ro’yhat ko’rinishida berilgan bo’lsa , u holda ketma-ket qidiruv ro’yhatda amalga oshiriladi. 1-Rasm Chiziqli bir bog’lamli ro’yhatdan key kalitga mos elementni ketma-ket qidiruv usuli yordamida izlab topish dasturi. Node *q=NULL; Node *p=lst; while (p !=NULL){ 4
if (p->k == key){ search = p; return search; } q = p; p = p->nxt; } Node *s=new Node;; s->k=key; s->r=rec; s->nxt= NULL; if (q == NULL){ s->nxt=lst; lst = s; } else q->nxt = s; search= s; return search; Ro’yhatli tuzilmaning afzalligi shundan iboratki, ro’yhatga elementni qo’shish yoki o’chirish tez amalga oshadi, bunda qo’shish yoki o’chirish element soniga bog’liq bo’lmaydi, massivda esa elementni qo’shish yoki o’chirish o’rta hisobda barcha elementlarning yarmini siljitishni talab qiladi. Ro’yhatda qidiruvning samaradorligi taxminan massivniki bilan bir xil bo’ladi. 1.2 Teng bo’lish orqali qidiruv (ikkilik qidiruv) algoritmi Faraz qilaylik, o’sish tartibida tartiblangan sonlar massivi berilgan bo’lsin. Ushbu usulning asosiy g’oyasi shundan iboratki, tasodifiy qandaydir A M element olinadi va u X qidiruv argumenti bilan taqqoslanadi. Agar A M =X bo’lsa, u holda qidiruv yakunlanadi; agar A M >X bo’lsa, u holda indekslari M dan katta bo’lgan barcha elementlar kelgusi qidiruvdan chiqarib yuboriladi. 5