logo

Matritsada qidiruv algoritmlari

Загружено в:

12.08.2023

Скачано:

0

Размер:

78.0947265625 KB
Mavzu: “Matritsada qidiruv algoritmlari”
                                                 Mundarija
Mavzu: Matritsada qidiruv algoritmlari ......................................................................................................... 2
Kirish ............................................................................................................................................................. 2
I BOB.Matritsa haqida tushuncha .................................................................................................................. 4
1.1.Matritsalarni qayta ishlash .................................................................................................................. 5
1.2. Matritsani kiritish-chiqarish algoritmi ................................................................................................ 5
1.3. Matritsalarni qayta ishlash algoritmlariga misollar ............................................................................. 6
II BOB.Matritsalarni qidirish algoritmi tarixi va uning dasturi ........................................................................ 7
2.1.Matritsada muntazam qidiruv ............................................................................................................. 8
2.2.Matritsada ikkilik qidiruv ................................................................................................................... 11
2.3.Matritsada qidirsh algoritm dastulari c++ va phytonda kodlari tahlili ............................................... 14
2.4.Matritsalarni tartiblash algoritm ....................................................................................................... 16
III BOB.Matritsalarni qo’shish,ayirishva ko’paytirish ................................................................................... 18
3.1.Matirtsalarni qo’shish ........................................................................................................................ 18
3.2. Matirtsalarni ayirish .......................................................................................................................... 19
3.3.Matritsalarni ko’paytirish .................................................................................................................. 20
Foydalanilgan adabiyotlar ........................................................................................................................... 22
 Ilovalar ........................................................................................................................................................ 23 Mavzu:  Matritsada qidiruv algoritmlari
Kirish
Universitetga   matematika   bilan   bog'liq   mutaxassislik   bo'yicha   kirgan   har
qanday   odam   matritsalarni   o'rganishga   duch   keladi.   Matritsa   operatsiyalari
algebraning   eng   muhim   bo'limidir.   C   +   da   dasturlash   kursini   o'rganar
ekanmiz,   biz   faqat   eng   oddiy   vazifalardan   foydalandik,   masalan,   yig'indi   va
farqni   topish,   shuningdek,   qatorlar   /   ustunlar   bo'yicha   saralashning   har   xil
turlari   va   boshqalar.   Bugungi   kunda   matematik   dasturlash   barcha
dasturlashning muhim tarkibiy qismi hisoblanadi.   Oddiy dasturlar tufayli katta
va murakkab hisob-kitoblar oddiy holga keladi.
Mikroelektronika   fan   va   texnikaning   eng   tez   va   samarali   rivojlanayotgan
sohalaridan   biridir.   Biroq,   sxemalarning   rivojlanishi   bilan   birga,   ishlab
chiqilgan   sxemalarning   murakkabligi   ham   ortadi.   Mantiqiy   modeli   matritsa,
xususan,   mantiqiy   modeli   bo'lgan   sxema   elementlari
mavjud.   Mikrosxemaning   maydoni   va   uning   ishlashi   ko'p   jihatdan
matritsaning  parametrlariga  bog'liq.   Shuning uchun,  ustuvor  vazifa,  masalan,
Mantiqiy   matritsalarning   eng   qisqa   qopqog'ini   topish   orqali   elementning
hajmini   kamaytirishdir.   Eng   qisqa   qamrovlarni   izlashning   maqsadga
muvofiqligi mantiqiy funktsiyalarning DNF ni  minimallashtirishda, mantiqiy
sxemalarning   ayrim   turlarini   sintez   qilishda,   mantiqiy   tenglamalar   tizimini
echishda,   eng   oddiy   diagnostika   testlarini   qidirishda,   shuningdek,   boshqa
ko'plab muammolarni hal qilishda yuzaga keladi. bo'lib chiqadigan hal qilish
usullarining samaradorligi
Eng qisqa qoplamalarni topish algoritmlari, ayniqsa, nisbatan katta matritsa
o'lchamiga   ega   bo'lgan   odam   uchun   mashaqqatli   ishdir,   shuning   uchun   men
ishlab chiqqan dastur bu ishni juda osonlashtiradi.
Ushbu   ishning   dolzarbligi   shundaki,   bugungi   kunda   Yer   sayyorasi
aholisining   yarmidan   ko'pi   kompyuterdan   foydalanadi.   Ularning   ko'pchiligi
o'z ishini turli manbalardan kerakli ma'lumotlarni, xoh u Internet, ma'lumotlar
bazalari yoki mahalliy diskdagi fayllarni qidirishdan boshlaydi va agar qidiruv
vaqti   hatto   bir   soniyaga   ko'paytirilsa,   unda   umumiy   vaqt   sarflangan   kerakli
ma'lumotlarni   qidirayotgan   barcha   foydalanuvchilar   200   yildan
oshadi.   Shuning   uchun   qidiruv   vaqtini   minimal   darajaga   qisqartiradigan
qidiruv   algoritmlarini   ishlab   chiqish,   saqlash   va   amalga   oshirish   juda
muhimdir.   Google   infratuzilma   bo‘yicha   vitse-prezidenti   Urs   Xölzlening
so‘zlariga   ko‘ra,   “Tezlikni   saqlab   qolish   uchun   bizda   bitta   oddiy   qoida   bor:
qidiruv   jarayonini   sekinlashtiradigan   funksiyalarni   ishlatmang.   Siz   ajoyib
yangi   algoritm   ixtiro   qilishingiz   mumkin,   lekin   agar   u   qidiruvni
sekinlashtirsa,   siz   bu   haqda   unutishingiz,   tuzatishingiz   yoki   sekinlashuvning
o'rnini bosadigan boshqa o'zgarishlarni o'ylab topishingiz kerak bo'ladi.   Bizda
oilaviy   byudjetga   o'xshash   "qat'iy   kechikish   byudjeti"   mavjud.   Agar   siz
2 chiroyliroq   ta'tilga   chiqmoqchi   bo'lsangiz-u,   lekin   byudjetingiz   kengaymasa,
boshqa joyni qisqartirishingiz kerak."
Aynan shuning uchun ko'plab o'zini o'zi hurmat qiladigan dasturiy ta'minot
ishlab   chiqaruvchi   kompaniyalarda   umuman   dasturiy   ta'minot   tezligiga   va
ayniqsa   samarali   qidiruv   algoritmlarini   ishlab   chiqishga   alohida   e'tibor
beriladi,   ishlab   chiqish   guruhi   darajalarni   ko'rishi   uchun   ishlash   doimiy
ravishda   nazorat   qilinadi.   xizmatlarning   kechikishi.   Shuning   uchun   ham   bir
necha   yil   oldin   ishlar   sekinlasha   boshlaganida,   asosiy   e’tibor   mahsulotlarni
tezroq ishlab chiqarishga qaratildi.   Tezlik muhandislik madaniyatining muhim
qismidir.
Tez   qidiruvning   asosi   nafaqat   ma'lumotni   tezda   topish,   balki   ushbu
ma'lumotlarning   so'rovga   mos   kelishiga   ishonch   hosil   qilish   imkonini
beruvchi   samarali   qidiruv   algoritmlarini   ishlab   chiqishdir,   shuning   uchun
ushbu   kurs   ishining   maqsadi   qidiruv   algoritmlarini   o'rganish   va   tahlil
qilishdir.
3 I BOB.Matritsa haqida tushuncha
Matritsa   -   bu   halqa   yoki   maydon   elementlarining   to'rtburchaklar   jadvali
(masalan, butun, haqiqiy yoki murakkab sonlar) shaklida yozilgan matematik
ob'ekt   bo'lib,   uning   elementlari   kesishgan   joyda   joylashgan   qatorlar   va
ustunlar   to'plamidir.   Matritsaning   satrlari   va   ustunlari   soni   matritsaning
hajmini   aniqlaydi.   Masalan,   uchburchak   matritsalar   tarixan   ko'rib   chiqilgan
bo'lsa-da,   bugungi   kunda   faqat   to'rtburchaklar   matritsalar   haqida   gapiriladi,
chunki ular eng qulay va umumiydir.
Matritsalar   matematikada   chiziqli   algebraik   yoki   differentsial   tenglamalar
tizimini   ixcham   tasvirlash   uchun   keng   qo'llaniladi.   Bunda   matritsa   qatorlari
soni   tenglamalar   soniga,   ustunlar   soni   esa   noma’lumlar   soniga   mos   keladi.
Natijada   chiziqli   tenglamalar   sistemalarining   yechimi   matritsalar   ustidagi
amallarga qisqaradi.
Matritsa uchun quyidagi algebraik amallar aniqlanadi:
1. bir xil o'lchamdagi matritsalarni qo'shish;
2. mos o'lchamdagi matritsalarni ko'paytirish (ustunlari bo'lgan matritsa 
o'ng tomonda satrli matritsaga ko'paytirilishi mumkin  );
3. shu   jumladan   vektor   matritsa   bilan   ko'paytirish   (matritsani
ko'paytirishning odatiy qoidasiga ko'ra; vektor bu ma'noda matritsaning
maxsus holatidir);
4. matritsani   asosiy   halqa   yoki   maydonning   elementi   (ya'ni   skaler)   bilan
ko'paytirish.
Qo'shishga nisbatan matritsalar abel guruhini tashkil qiladi; agar biz skaler
bilan   ko'paytirishni   ham   ko'rib   chiqsak,   u   holda   matritsalar   mos   keladigan
halqa   (maydon   ustidagi   vektor   fazosi)   ustida   modul   hosil   qiladi.   Kvadrat
matritsalar   to'plami   matritsani   ko'paytirishda   yopiladi,   shuning   uchun   bir   xil
o'lchamdagi   kvadrat   matritsalar   matritsani   qo'shish   va   matritsani
ko'paytirishda birlik bilan assotsiativ halqa hosil qiladi.
4 n o'lchovli chiziqli fazoda harakat qiluvchi har bir chiziqli operator n tartibli
yagona   kvadrat   matritsa   bilan   bog'lanishi   mumkinligi   isbotlangan;   va
aksincha   -   n-tartibli   har   bir   kvadrat   matritsasi   bu   fazoda   harakat   qiluvchi
yagona   chiziqli   operator   bilan   bog'lanishi   mumkin.   Matritsaning   xossalari
chiziqli   operatorning   xossalariga   mos   keladi.   Xususan,   matritsaning   xos
qiymatlari operatorning tegishli xos vektorlarga mos keladigan xos qiymatlari
hisoblanadi.
1.1.Matritsalarni qayta ishlash
Matritsa   ikki o'lchovli massiv bo'lib, uning har bir elementi ikkita indeksga
ega:   qator   raqami   -   i   ;   ustun   raqami   -   j   .   Shuning   uchun   matritsa   elementlari
bilan   ishlash   uchun   ikkita   halqadan   foydalanish   kerak.   Agar   birinchi   tsikl
parametrining   qiymatlari   matritsa   satrlari   raqamlari   bo'lsa,   ikkinchisi
parametrining   qiymatlari   ustunlar   bo'ladi   (yoki   aksincha).   Matritsani   qayta
ishlash shundan iboratki, dastlab birinchi qator (ustun) elementlari navbatma-
navbat, keyin ikkinchisi va boshqalar ko'rib chiqiladi.   oxirigacha.   Masalalarni
yechishda matritsalar ustida bajariladigan asosiy amallarni ko'rib chiqing.
1.2. Matritsani kiritish-chiqarish algoritmi
Matritsalar,   massivlar   kabi,   element   bo'yicha   kiritilishi   (chiqish)
kerak.   Matritsa   elementlarini   kiritish   blok   diagrammasi   rasmda
ko'rsatilgan.   1-rasm.   Matritsaning   chiqishi   kirishga   o'xshash   tarzda   tashkil
etilgan.
1-rasm 2-rasm
Matritsalarni   qayta   ishlashning   bir   qancha   masalalarini   ko'rib
chiqamiz.   Ularni yechish uchun matritsalarning ayrim xossalarini o‘quvchiga
eslatib o‘tamiz (2-rasm):
 agar   elementning   satr   raqami   ustun   raqamiga   to'g'ri   kelsa   (i   =   j)   ,   bu
element matritsaning asosiy diagonalida joylashganligini anglatadi;
5  agar satr raqami ustun raqamidan oshsa   (i > j)   , u holda element asosiy
diagonal ostida joylashgan;
 agar   ustun   raqami   satr   raqamidan   katta   bo'lsa   (i<j)   ,   u   holda   element
asosiy diagonaldan yuqori bo'ladi.
 element   ikkilamchi   diagonalda   yotadi,   agar   uning   indekslari   i+j-   1   =
n   tenglikni qanoatlantirsa ;
 i+j-   1   <   n   tengsizlik   ikkilamchi   diagonaldan   yuqorida   joylashgan
elementga xosdir;
 shunga   ko'ra,   i+j-   1   >   n   ifodasi   ikkilamchi   diagonal   ostida   yotgan
elementga mos keladi  
1.3. Matritsalarni qayta ishlash algoritmlariga misollar
Bu   masalani   yechish   algoritmi   (3-rasm)   quyidagicha   tuzilgan:   yig‘indini
to‘plash   uchun   katak   nolga   o‘rnatiladi   (o‘zgaruvchi   S   ).   Keyin   ikkita   halqa
yordamida   (birinchisi   qatorlarda,   ikkinchisi   ustunlarda)   matritsaning   har   bir
elementi   skanerdan   o'tkaziladi,   ammo   yig'ish   faqat   ushbu   element   asosiy
diagonaldan yuqori bo'lsa, ya'ni i < j xususiyati bo'lsa sodir bo'ladi.
4-rasmda   ushbu   muammoning   boshqa   yechimi   ko'rsatilgan.   U   i<j   shartni
tekshirmaydi   , lekin shunga qaramay, asosiy diagonaldan yuqorida joylashgan
matritsa elementlarini ham umumlashtiradi.   Ushbu algoritm qanday ishlashini
tushunish uchun 4.3-rasmga qaytaylik.   Berilgan matritsaning birinchi qatoriga
ikkinchisidan   boshlab   barcha   elementlarni   qo'shish   kerak.   Ikkinchisida   -
uchinchidan   boshlab   hamma   narsa,   i   -chi   qatorda   jarayon   (i   +   1   )   -chi
elementdan boshlanadi va hokazo.   Shunday qilib, birinchi tsikl 1 dan   N   gacha
ikkinchisi   esa   i+   1   dan   M   gacha   ishlaydi   .   Biz   o'quvchini   tavsiflangan
algoritmga mos keladigan dasturni mustaqil ravishda yaratishga taklif qilamiz.
3-rasm 4-rasm
6 II BOB.Matritsalarni qidirish algoritmi tarixi va uning dasturi
Matritsa   algoritmi   qidiruv   ish   bosqichining   transformatsiya   matritsasi
tasodifiy bezovtalanishi bilan farq qiladi, buning natijasida k tasodifiy qidiruv
algoritmi   amalga  oshiriladi.   tasvirlangan   bikomponentlarni   topish   uchun   eng
oddiy   matritsa   algoritmi   ,   aftidan   S.   ga   tegishli   A.   A.   Zykov   kitobida   bir
nechta   usullar   tasvirlangan;   Eng   samarali   algoritmlar   qo'shni   ro'yxatlar   bilan
ifodalangan   grafik   bo'ylab   chuqurlikdan   birinchi   qidiruv   strategiyasidan
foydalangan   holda   harakat   qilishga   asoslangan.   Ularga   yaqin   (birinchi
chuqurlikdan   qidirish   strategiyasidan   foydalanish   ma'nosida)V.N.
Kasyanovning   maxsus   cho'qqilarni   raqamlash   asosidagi   algoritmi.   Pottosin
chiziqli   komponentlarni   topish   algoritmi   V.   Materiallar   balansi   tenglama
tizimini   echish   uchun   matritsa   algoritmi   bilan   birgalikda   distillash   ustunini
hisoblash   algoritmi   etarli   tezlikka   ega,   qayta   ishlangan   oqimlari   bo'lgan
tizimlar uchun Nyuton-Rafson usuli ishlatilgan.   Ushbu shakl qulaydir, chunki
ko'pgina   matritsa   algoritmlari   arifmetik   amallarni   matritsali   amallar   bilan
rasmiy ravishda almashtirish orqali blok tuzilmasining matritsalari yordamida
osonlik bilan ifodalanishi mumkin (qarang:   Matritsali algoritmlardagi   ishning
ikkinchi   bezovta   qiluvchi   xususiyati   juda   yaqin   bo'limlardan   ajratish
tendentsiyasidir.   Popov   tomonidan   matritsali   algoritm   g'oyasini   amalga
oshirishga   yangi   urinish   bo'ldio'zgaruvchilar   girdobida   siqilmaydigan
suyuqlik tenglamalari uchun, oqim funktsiyasidan farqli o'laroq, ikki o'lchovli
matritsali tenglamalar tizimi o'zgaruvchan yo'nalishlar usuli bilan emas, balki
taklif   qilingan   boshqa   iterativ   usul   bilan   echildi   va,   ehtimol,   ushbu   turdagi
tizimlar uchun samaraliroq.   xususan, qatlamda chiziqli tenglamalarni yechish
uchun  maxsus  panjara  trafareti  va  Nyuton  usulidan   foydalanilgan.   Mualliflar
nafaqat   mutlaqo   barqaror   sxemani   olishga,   balki   har   bir   qatlam   uchun
takrorlash   sonini   sezilarli   darajada   kamaytirishga   muvaffaq   bo'lishdi.   Biroq,
bu usulni  qo'llash oraliq axborotni  saqlash uchun katta operativ xotiraga ega
kompyuterlardan foydalanishni talab qiladi.   Kamchilik, shuningdek, qatlamda
ko'p   sonli   arifmetik   operatsiyalardir.   SVD   qanday   ishlashini   tasvirlashdan
oldin,   oddiyroq   matritsa   algoritmi   -   Gaussni   yo'q   qilish   -   biroz   boshqacha
nuqtai nazardan     qarash foydali bo'ladi . Kuzov konstruksiyalarini kompleks
hisob-kitoblar   uchun   boji   ramkalari,   tank   qozonlari,   elektron   kompyuterda
amaliy   hisob-kitoblarda   qo'llaniladigan  	
    matritsali   algoritmlar   ishlab
chiqilgan.   Yagona   qiymat   dekompozitsiyasini   hisoblash   uchun   ALGOL
protsedurasi  (Golub va Reynsh tomonidan)   Wilkinson va Reinsch tomonidan
tahrirlangan   Matritsa   algoritmlarida   nashr   etilgan.   Argondagi   Milliy
laboratoriyalarda   NATS   loyihasi   doirasida   Fortran   subprogrammalari   bir
qator matritsaning xos qiymat muammolari, shu jumladan SVD protsedurasini
tarjima qilish uchun ishlab chiqilgan.   SVD ikkinchi qatorga kiritilgan bo'lsa-
da, u 1976 yilgi nashrning ko'rsatmalarida tasvirlanmagan, lekin faqat keyingi
7 nashrda   tasvirlanadi.   Shaklda   ko'rsatilgan   nurga   nisbatan.     ichki   kuchlarning
diagrammalarini qurishda   matritsani hisoblash algoritmi   quyidagicha yoziladi.
  Tarmoqli quvur liniyasidagi kuchlarni haroratni isitishdan (og'irlik yukining
ta'siri   hisobga   olinmagan)   aniqlash   uchun   muallif   aralash   usulning   matritsali
algoritmini   taklif   qildi   :   tizimning   alohida   tarmoqlari   kuch   usuli   yordamida
hisoblab   chiqilgan,   keyin   esa   deformatsiya   usulining   tenglamalari   tuzildi   va
yechildi,   buning   natijasida   tarmoq   tugunlarida   noma'lum   deformatsiyalar
aniqlandi.   Bunday   tizimlarda   ko'paytiriladigan   matritsaning   elementlari   har
bir   tsiklda   almashtirilishi   va   chiziqli   tenglamalar   tizimini   echish   uchun
to'g'ridan-to'g'ri   matritsali   algoritmlarni   amalga   oshirish   mumkinligi   tufayli
yuqori   ishlov   berish   tezligi   ta'minlanadi   .   Bu   usullarning   iterativ   usullardan
afzalligi   shundaki,   ular   ma'lum   miqdordagi   tsikllar   doirasida   amalga
oshiriladi,   shu   bilan   birga   kerakli   takrorlashlar   soni   odatda   oldindan   ma'lum
emas.   A   [/,   /   r]   ning   ixtiyoriy   elementiga   kirish   uchun   sarflangan   vaqt,   agar
har bir satr yoki ustunda elementlar juda kam bo'lsa, oqilona chegaralar ichida
qoladi;   bundan tashqari, ko'pchilik   matritsa algoritmlari   o'zboshimchalik bilan
elementlarga   kirishdan   foydalanmaganligi   sababli,   matritsaning   ketma-ket
o'tishi bilan bog'liq vakillik tezlikni biroz yo'qotishiga olib keladi.   Konturlarni
o'z   ichiga   olgan   yo'llarni   yo'q   qilishning   aniq   matritsa   usullari
tasvirlangan;   ammo   bu   usullar,   masalan,   tasvirlangan   ketma-ket   tarmoqdan
o'tish   algoritmi   juda   katta   hajmdagi   hisob-kitoblarni   talab   qiladi.   Shuning
uchun,   quyida   tavsiflangan  	
    taxminiy   matritsa   algoritmi   mos   bo'lishi
mumkin.   Ilgari   aytilganlarga   asoslanib,   eksperimental   tarzda   tasdiqlangan
ketma-ketlik   tarmog'ida   har   bir   makroskopik   bosqich   tanlangan   atomlar
guruhining   oddiy   o'tish   jarayoni   sifatida   namoyon   bo'lishi   aniq.Ko'rsatilgan
kompyuter   dasturi   -   oddiy   matritsali   algoritm   -   teskari   masalani   osonlikcha
hal   qiladi:   berilgan   makroskopik   bosqich   uchun   u   mumkin   bo'lgan
reaktsiyalarni   aniqlaydi,   tanlaydi.   Ushbu   makroskopik   bosqichni   amalga
oshiradigan barcha elementar reaktsiyalar mexanizmi.  
2.1.Matritsada muntazam qidiruv
Algoritmni   ishlab   chiqishni   davom   ettirishdan   oldin,   oddiy   misolni   ko'rib
chiqaylik:
15 20 40 85
20 35 80 95
30 55 95 105
40 80 100 120
                                                       1-jadval
Aytaylik, biz 55-elementni qidiryapmiz. Uni qanday topish mumkin?
Agar   satr   va   ustunning   birinchi   elementlarini   ko'rib   chiqsak,   biz   izlayotgan
elementning joylashuvini qidirishni boshlashimiz mumkin.   Shubhasiz, 55 dan
8 katta   qiymat   bilan   boshlanadigan   ustunda   55   bo'lishi   mumkin   emas,   chunki
minimal element har doim ustunning boshida bo'ladi.   Bundan tashqari, biz 55
ning   o'ng   tomonda   bo'lishi   mumkin   emasligini   bilamiz,   chunki   har   bir
ustunning   birinchi   elementining   qiymati   chapdan   o'ngga   ortadi.   Shuning
uchun, agar ustunning birinchi elementi   x   dan katta ekanligini topsak , chapga
o'tishimiz kerak.
Xuddi   shunday   tekshiruv   satrlar   uchun   ham   ishlatilishi   mumkin.   Agar   biz
birinchi   element   qiymati   x   dan   katta   bo'lgan   satr   bilan   boshlagan   bo'lsak,
yuqoriga ko'tarilishimiz kerak.
Xuddi   shunday   mulohazalardan   ustunlar   yoki   satrlarning   oxirgi
elementlarini   tahlil   qilishda   foydalanish   mumkin.   Agar   ustun   yoki   satrning
oxirgi  elementi  x  dan   kichik   bo'lsa,  x  ni  topish   uchun  pastga   (satrlar   uchun)
yoki o'ngga (ustunlar uchun) harakat qilish kerak.   Bu shunday, chunki oxirgi
element har doim maksimal bo'ladi.
Keling, ushbu barcha kuzatuvlardan yechim yaratish uchun foydalanamiz:
 Agar   ustunning   birinchi   elementi   x   dan   katta   bo'lsa   ,   u   holda   x   chap
ustunda joylashgan.
 Agar   ustunning   oxirgi   elementi   x   dan   kichik   bo'lsa   ,   u   holda   x   o'ng
ustunda joylashgan.
 Agar   satrning   birinchi   elementi   x   dan   katta   bo'lsa   ,   x   uning   ustidagi
satrda bo'ladi.
 Agar   satrning   oxirgi   elementi   x   dan   kichik   bo'lsa   ,   x   uning   ostidagi
satrda bo'ladi.
Keling, ustunlar bilan boshlaylik.Biz o'ng ustundan boshlashimiz va chapga
o'tishimiz kerak.   Bu shuni anglatadiki, taqqoslash uchun birinchi element [0]
[c-1]   bo'ladi   ,   bu   erda   c     -   ustunlar   soni.   Ustunning   birinchi   elementini   x
(bizning   holatimizda   55)   bilan   taqqoslab,   x   0,1   yoki   2   ustunlarda   bo'lishi
mumkinligini   tushunish oson. Keling   , [0][2]   dan boshlaylik .
Bu element to liq matritsadagi qatorning oxirgi elementi bo lmasligi mumkin,ʻ ʻ
lekin   u   submatritsadagi   qatorning   oxiri   hisoblanadi.   Va   submatritsa   bir   xil
shartlarga bo'ysunadi.   [0][2]   elementining   qiymati 40 ga teng, ya'ni u bizning
elementimizdan kamroq, ya'ni biz pastga siljishimiz kerakligini bilamiz.
Endi submatritsa quyidagi shaklni oladi (kulrang hujayralar tashlanadi):
15 20 40 85
20 35 80 95
30 55 95 105
9 40 80 100 120
                                                        2-jadval
Biz qidiruv qoidalarini qayta-qayta ishlatishimiz mumkin.   E'tibor bering, biz 1
va 4-qoidalardan foydalanamiz.
10 Quyidagi kod ushbu algoritmni amalga oshiradi:
public   static   boolean  findElement( int [][]  matrix ,  int   elem ) {
   int   row  = 0;
   int   col  =  matrix [0]. length  - 1;
  while ( row  <  matrix . length  &&  col  >= 0) {
    if ( matrix [ row ][ col ] ==  elem ) {
      return true;
    } else if ( matrix [ row ][ col ] >  elem ) {
       col --;
    } else {
       row ++;
    }
  }
  return false;
}
Muammoni   hal   qilishning   yana   bir   yondashuvi   ikkilik   qidiruvdir.   Biz
murakkabroq kodni olamiz, lekin u xuddi shu qoidalarga asoslanadi.
2.2.Matritsada ikkilik qidiruv
Keling, misolimizga yana qaraylik:
15 20 70 85
20 35 80 95
30 55 95 105
40 80 100 120
                                                 3-jadval
Biz   algoritm   samaradorligini   oshirishni   xohlaymiz.   Keling,   o'zimizga   savol
beraylik: element qayerda bo'lishi mumkin?
Bizga barcha satrlar va ustunlar tartiblanganligi aytiladi.   Bu [i][j]   elementi
0   va   j   ustunlar   orasidagi   i   qatordagi   elementlardan   va   0   va   i-1   qatorlar
orasidagi   j   qatordagi  elementlardan   kattaroq ekanligini bildiradi   .   Boshqa so'z
bilan:
a[i][0]   <=   a[i][1]   <=   ...   <=   a[i][ji]   <=   a[i][j]   a[0][j]   <=   a
[ 1][j] <= ... <= a[i-1][j] <= a[i][j]
Matritsaga   qarang:   quyuq   kulrang   hujayradagi   element   boshqa   tanlangan
elementlardan kattaroqdir.
15 20 70 85
20 35 80 95
30 55 95 105
40 80 100 120
                                                   4-jadval
11 Oq hujayralardagi elementlar tartiblangan.   Ularning har biri chap elementdan
ham,   yuqoridagi   elementdan   ham   kattaroqdir.   Shunday   qilib,   tanlangan
element kvadratdagi barcha elementlardan kattaroqdir.
15 20 70 85
20 35 80 95
30 55 95 105
40 80 100 120
                                            5-jadval
Biz   qoidani   shakllantirishimiz   mumkin:   matritsada   tanlangan   har   qanday
to'rtburchakning pastki o'ng burchagida eng katta element bo'ladi.
Xuddi shunday, yuqori chap burchak har doim eng kichik bo'ladi.   Quyidagi
diagrammadagi   ranglar   elementlarning   tartiblanishi   haqidagi   ma'lumotlarni
aks ettiradi (och kulrang < oq < to'q kulrang):
15 20 70 85
20 35 80 95
30 55 95 105
40 80 100 120
                                                6-jadval
Keling,   asl   muammoga   qaytaylik.   Aytaylik,   85-elementni   topishimiz
kerak.Diagonalga   qarasak,   35   va   95-   elementlarni   ko‘ramiz.Bundan   85-
elementning joylashuvi haqida qanday ma’lumotlarni olishimiz mumkin?
15 20 70 85
20 35 80 95
30 55 95 105
40 80 100 120
                                                   7-jadval
85 quyuq kulrang maydonda bo'lishi mumkin emas, chunki 95 element yuqori
chap burchakda joylashgan va bu kvadratdagi eng kichik elementdir.
85   ochiq   kulrang   maydonga   tegishli   emas,   chunki   35   element   pastki   o'ng
burchakda joylashgan.
85 ikkita oq maydondan birida bo'lishi  kerak.Shunday qilib, biz to'rimizni
to'rtta   kvadrantga   ajratamiz   va   pastki   chap   va   yuqori   o'ng   kvadrantlarda
qidiramiz.   Ularni kvadrantlarga bo'lish va keyinroq qidirish mumkin.
E'tibor   bering,   diagonal   tartiblangan,   ya'ni   biz   ikkilik   qidiruvdan   samarali
foydalanishimiz mumkin.
Quyidagi kod ushbu algoritmni amalga oshiradi:
public   Coordinate   findElement ( int [][]   matrix ,   Coordinate   origin ,   Coordinate
dest ,  int x )   {
   if   ( ! origin . inbounds ( matrix )   ||   ! dest . inbounds ( matrix ))   {
     return   null ;
12    }
   if   ( matrix [ origin . row ][ origin . column ]   ==  x )   {
     return  origin ;
   }   else   if   ( ! origin . isBefore ( dest ))   {
     return   null ;
   }
  Coordinate start  =   ( Coordinate )  origin . clone ();
  int diagDist  =  Math . min ( dest . row  -  origin . row ,  dest . column  -  origin . column );
    Coordinate   end   =   new   Coordinate ( start . row   +   diagDist ,   start . column   +
diagDist );
  Coordinate p  =   new   Coordinated ( 0 ,   0 );
   while   ( start . isBefore ( end ))   {
    р . setToAverage ( start ,  end );
     if   ( x  >  matrix [ p . row ][ p . column ])   {
      start . row  =  p . row  +   1 ;
      start . column  =  p . column  +   1 ;
     }   else   {
      end . row  =  p . row  -   1 ;
      end . column  =  p . column  -   1 ;
     }
   }
   return   partitionAndSearch ( matrix ,  origin ,  dest ,  start ,  x );
}
public Coordinate  partitionAndSearch ( int [][]  matrix ,
Coordinate origin .  Coordinate dest ,  Coordinate pivot ,  int elem )   {
  Coordinate lowerLeftOrigin  =   new   Coordinate ( pivot . row ,  origin . column );
  Coordinate lowerLeftDest  =   new   Coordinate ( dest . row ,  pivot . column  -   1 );
  Coordinate upperRightOrigin  =   new   Coordinate ( origin . row ,  pivot . column );
  Coordinate upperRightDest  =   new   Coordinate ( pivot . row  -   1 ,  dest . column );
    Coordinate   lowerLeft   =   findElement ( matrix ,   lowerLeftOrigin ,
lowerLeftDest ,  elem );
   if   ( lowerLeft  ==   null )   {
     return   findElement ( matrix ,  upperRightOrigin ,  upperRightDest ,  elem );
   }
   return  lowerLeft ;
}
public static Coordinate  findElement ( int [][]  matrix ,  int x )   {
  Coordinate origin  =   new   Coordinate ( 0 ,   0 );
  Coordinate dest  =   new   Coordinate ( matrix . length  -   1 ,  matrix [ 0 ]. length  -   1 );
13    return   findElement ( matrix ,  origin ,  dest ,  x );
}
public class  Coordinate  implements  Cloneable   {
  public int row ;
  public int column ;
  public  Coordinate ( int r ,  int c )   {
    row  =  r ;
    column  =  c ;
   }
  public boolean  inbounds ( int [][]  matrix )   {
     return  row  >=   0   &&  column  >=   0   &&
    row  <  matrix . length  &&  column  <  matrix [ 0 ]. length ;
   }
  public boolean  isBefore ( Coordinate p )   {
     return  row  <=  p . row  &&  column  <=  p . column ;
   }
  public Object  clone ()   {
     return   new   Coordinate ( row ,  column );
   }
  public void  setToAverage ( Coordinate min ,  Coordinate max )   {
    row  =   ( min . row  +  max . row )   /   2 ;
    column  =   ( min . column  +  max . column )   /   2 ;
   }
}
Ushbu kodni birinchi marta to'g'ri yozish juda qiyin.Esda tutingki, siz kodni
usullarga   ajratish   orqali   hayotingizni   osonlashtirasiz.   Dasturlarni   yozishda
asosiy   sohalarga   e'tibor   bering.   Va   siz   har   doim   hamma   narsani   birlashtira
olasiz.
2.3.Matritsada qidirsh algoritm dastulari c++ va phytonda kodlari tahlili
Saralangan   matritsali   mat[n][m]   va   "x"   elementi   berilgan.   Agar   mavjud
bo'lsa, x ning matritsadagi o'rnini toping, aks holda -1 ni chop eting.   Matritsa
shunday   tartiblanganki,   qatordagi   barcha   elementlar   ortib   borish   tartibida   va
“i” qatori uchun, bu yerda 1 <= i <= n-1, “i” qatorining birinchi elementi dan
katta yoki teng. "i-1" qatorining oxirgi elementi.   Yondashuv O (log n + log m)
vaqt murakkabligiga ega bo'lishi kerak.
Misollar:  
Kirish : mat[][] = { {1, 5, 9},
                    {14, 20, 21},
14                     {30, 34, 43} }
        x = 14
Chiqish: topilgan (1, 0)
Kirish : mat[][] = { {1, 5, 9, 11},
                    {14, 20, 21, 26},
                    {30, 34, 43, 50} }
        x = 42
Chiqish: -1
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main() {
        int n = 4; // no. of rows
        int m = 5; // no. of columns
        int a[n][m] = {{0, 6, 8, 9, 11},
                                  {20, 22, 28, 29, 31},
                                  {36, 38, 50, 61, 63},
                                  {64, 66, 100, 122, 128}};
        int k = 31; // element to search
        map<int,pair<int,int>>mp;
        for(int i=0;i<n;i++){
          for(int j=0;j<m;j++){
                if(k==a[i][j]){
                    cout<<"Found at ("<<i<<","<<j<<")"<<endl;
                }
                mp[a[i][j]]={i,j};
            }
        }
    if(mp.find(k)!=mp.end()){
            //cout<<"("<<mp[k]<<",)"<<endl;
            cout<<"This is how we can found using mapping: "<<endl;
            cout<<"("<<mp[k].first<<","<<mp[k].second<<")"<<endl;
        }else{
          cout<<"Not Found"<<endl;
        }
        return 0;
}
          Vaqt murakkabligi   : O(n+m), O'tish uchun.
15 Phytonda kodi:
n = 4 
m = 5
a = [[0, 6, 8, 9, 11],
          [20, 22, 28, 29, 31],
          [36, 38, 50, 61, 63],
          [64, 66, 100, 122, 128]]
 
k = 31
mp = {}
 
for i in range(n):
        for j in range(m):
                if(k==a[i][j]):
                        print("Found at (", i, ",", j, ")")
                         
        mp[a[i][j]] = [i, j]
  if k in mp:
    cout<<"("<<mp[k]<<",)"<<endl;
    print("This is how we can found using mapping: ")
    print("(", mp[k][0], ",", mp[k][1], ")")
else:
        print("Not Found")
2.4.Matritsalarni tartiblash algoritm
nxn   matritsasi   berilgan.   Muammo   berilgan   matritsani   qat'iy   tartibda
tartiblashdir.   Bu   erda   qat'iy   tartib   matritsaning   shunday   tartiblanganligini
anglatadiki,   qatordagi   barcha   elementlar   o'sish   tartibida   va   "i"   qatori   uchun,
bu erda 1 <= i <= n-1, "i" qatorining birinchi elementi. "i-1" qatorining oxirgi
elementidan katta yoki unga teng.
Kirish : mat[][] = { {5, 4, 7},
                    {1, 3, 8},
                    {2, 9, 6} }
Chiqish: 1 2 3
         4 5 6
         7 8 9
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
 
int main() {
        vector<vector<int>>v{{5, 4, 7},{1, 3, 8},{2, 9, 6}};
        int n=v.size();
16         vector<int>x;
        for(int i=0;i<n;i++){
          for(int j=0;j<n;j++){
            x.push_back(v[i][j]);
            }
        }
        sort(x.begin(),x.end());
        int k=0;
        for(int i=0;i<n;i++){
          for(int j=0;j<n;j++){
              v[i][j]=x[k++];
            }
        }
    cout<<"Sorted Matrix Will be:"<<endl;
        for(auto it:v){
          for(auto vt:it){
              cout<<vt<<" ";
            }cout<<endl;
        }
        return 0;
}
Phytondagi kodi:
v = [[5,4,7], [1,3,8], [2,9,6]]
n = len(v)
 
x = []
for i in range(n):
        for j in range(n):
                x.append(v[i][j])
 
x.sort()
k = 0
for i in range(n):
        for j in range(n):
                v[i][j] = x[k]
                k += 1
 
print("Sorted Matrix will be: ")
for i in range(n):
        for j in range(n):
                print(v[i][j], end=" ")
        print("")
17 III BOB.Matritsalarni qo’shish,ayirishva ko’paytirish
3.1.Matirtsalarni qo’shish
# include   <iostream>
using   namespace   std ;
int   main ()
{
     int  r, c, a[ 100 ][ 100 ], b[ 100 ][ 100 ], sum[ 100 ][ 100 ], i, j;
     cout  <<  "   Qatorlar sonini kiriting (1 dan 100 gacha): " ;
     cin  >> r;
     cout  <<  " Ustunlar sonini kiriting (1 dan 100 gacha): " ;
     cin  >> c;    
     cout  <<  endl  <<  "   1-matritsaning elementlarini kiriting: "  <<  endl ;
     for (i =  0 ; i < r; ++i)
        for (j =  0 ; j < c; ++j)
       {
            cout  <<  "a elementni kiriting"  << i +  1  << j +  1  <<  " : " ;
            cin  >> a[i][j];
       }
    cout  <<  endl  <<  "2-matritsaning elementlarini kiriting: "  <<  endl ;
     for (i =  0 ; i < r; ++i)
        for (j =  0 ; j < c; ++j)
       {
            cout  <<  "b elementni kiriting:"  << i +  1  << j +  1  <<  " : " ;
            cin  >> b[i][j];
       }
     for (i =  0 ; i < r; ++i)
         for (j =  0 ; j < c; ++j)
            sum[i][j] = a[i][j] + b[i][j];
     cout  <<  endl  <<  "2 ta matritsani yigindisi: "  <<  endl ;
     for (i =  0 ; i < r; ++i)
         for (j =  0 ; j < c; ++j)
        {
             cout  << sum[i][j] <<  "  " ;
             if (j == c -  1 )
                 cout  <<  endl ;
        }
     return   0 ;
}
18 3.2. Matirtsalarni ayirish
#include <bits/stdc++.h>
using namespace std;
#define N 4      
void subtract(int A[][N], int B[][N], int C[][N])  
{  
        int i, j;  
        for (i = 0; i < N; i++)  
                for (j = 0; j < N; j++)  
                        C[i][j] = A[i][j] - B[i][j];  
}  
   
// Driver code
int main()  
{  
        int A[N][N] = { {1, 1, 1, 1},  
                                        {2, 2, 2, 2},  
                                        {3, 3, 3, 3},  
                                        {4, 4, 4, 4}};  
   
        int B[N][N] = { {1, 1, 1, 1},  
                                        {2, 2, 2, 2},  
                                        {3, 3, 3, 3},  
                                        {4, 4, 4, 4}};  
   
        int C[N][N]; 
        int i, j;  
        subtract(A, B, C);  
   
        cout << "Result matrix is " << endl;  
        for (i = 0; i < N; i++)  
        {  
                for (j = 0; j < N; j++)  
                cout << C[i][j] << " ";  
                cout << endl;  
        }  
   
        return 0;  
}  
19 3.3.Matritsalarni ko’paytirish
# include   <iostream>
using   namespace   std ;
int   main () {
     int  a[ 10 ][ 10 ], b[ 10 ][ 10 ], mult[ 10 ][ 10 ], r1, c1, r2, c2, i, j, k;
     cout  <<  "Birinchi matritsa uchun satr ustunlarini kiriting: " ;
     cin  >> r1 >> c1
     cout  <<  " Ikkinchi matritsa uchun satr ustunlarini kiriting: " ;
     cin  >> r2 >> c2;
     while  (c1!=r2){
         cout  <<  "   Xato! birinchi matritsa ustuni ikkinchi qatorga teng emas." ;
         cout  <<  "   Birinchi matritsa uchun satr va ustunlarni kiriting: " ;
         cin  >> r1 >> c1;
         cout  <<  "   Ikkinchi matritsa uchun satr va ustunlarni kiriting: " ;
         cin  >> r2 >> c2; }
     cout  <<  endl  <<  "   1-matritsaning elementlarini kiriting:"  <<  endl ;
     for (i =  0 ; i < r1; ++i)
         for (j =  0 ; j < c1; ++j){
             cout  <<  "a elementni kiriting"  << i +  1  << j +  1  <<  " : " ;
             cin  >> a[i][j]; }
     cout  <<  endl  <<  "2 matritsani elementni kiriting:"  <<  endl ;
     for (i =  0 ; i < r2; ++i)
         for (j =  0 ; j < c2; ++j){
             cout  <<  "b elementni kiriting"  << i +  1  << j +  1  <<  " : " ;
             cin  >> b[i][j]; }
     for (i =  0 ; i < r1; ++i)
         for (j =  0 ; j < c2; ++j) {
            mult[i][j]= 0 ; }
     for (i =  0 ; i < r1; ++i)
         for (j =  0 ; j < c2; ++j)
             for (k =  0 ; k < c1; ++k) {
                mult[i][j] += a[i][k] * b[k][j]; }
     cout <<  endl  <<  "Matritsani chop etish"  <<  endl ;
     for (i =  0 ; i < r1; ++i)
     for (j =  0  ; j < c2; ++j){ 
         cout  <<  " "  << mult[i][j];
         if (j == c2 -1 )
              cout  <<  endl ;
    }
     return   0 ; }
20 Xulosa
Kurs   ishi   natijasida   men   Patrik   usuli   (3.1-bo'limga   qarang)   va   Zakrevskiy
usuli   (ustun   va   qator   qoplamasi)   bo'yicha   100   ×   100   o'lchamdagi   mantiqiy
matritsalarning   eng   qisqa   qoplamalarini   topish   imkonini   beruvchi   dasturni   ishlab
chiqdim   va   tuzatdim.   )   (3.2-bo'limga   qarang),   shuningdek,   mantiqiy   matritsalarni
optimallashtirish (kamaytirish) usuli ko'rib chiqiladi (3.3-bo'limga qarang).
Eng   qisqa   qoplamalarni   topish   algoritmlari,   ayniqsa,   nisbatan   katta   matritsa
o'lchamiga   ega   bo'lgan   odam   uchun   mashaqqatli,   shuning   uchun   men   ishlab
chiqqan   dastur   bu   ishni   juda   osonlashtiradi.Ushbu   algoritmlar   C++   Builder6.0
integratsiyalashgan muhitida amalga oshiriladi, bu mening fikrimcha, ushbu turdagi
vazifalarni hal qilish uchun eng mos keladi, chunki bu sizga eng qulay interfeysni
yaratishga imkon beradi.
21 Foydalanilgan adabiyotlar
1. Golovina   L.I.   Chiziqli   algebra   va   uning   ayrim   qo‘llanilishi.   M.:   Nauka,
1985. 392 b.
2. Ikromov X.D. Chiziqli algebra bo'yicha muammoli kitob. 1975. 162b.
3. Kostrikin A.I. Algebraga kirish. 2-qism. Algebra asoslari: Oliy maktablar
uchun darslik. M .: Fizika-matematika adabiyoti, 2001. 368s.
4. Kurosh A.G. Oliy algebra kursi. M.: Nauka, 1986. 431 b.
5. Proskuryakov I.V. Chiziqli algebra bo'yicha masalalar to'plami. Moskva:
Unimediastyle, 2002. 475 b.
6. Shevtsov G.S. Chiziqli algebra. Perm: PGU, 1996. 324 b.
7. Shneperman   L.B.   Algebra   va   sonlar   nazariyasidan   masalalar   to'plami.
1982 yil.
22     Ilovalar
# include   <iostream>
using   namespace   std ;
int   main () {
     int  a[ 10 ][ 10 ], b[ 10 ][ 10 ], mult[ 10 ][ 10 ], r1, c1, r2, c2, i, j, k;
     cout  <<  "Birinchi matritsa uchun satr ustunlarini kiriting: " ;
     cin  >> r1 >> c1
     cout  <<  " Ikkinchi matritsa uchun satr ustunlarini kiriting: " ;
     cin  >> r2 >> c2;
     while  (c1!=r2){
         cout  <<  "   Xato! birinchi matritsa ustuni ikkinchi qatorga teng emas." ;
         cout  <<  "   Birinchi matritsa uchun satr va ustunlarni kiriting: " ;
         cin  >> r1 >> c1;
         cout  <<  "   Ikkinchi matritsa uchun satr va ustunlarni kiriting: " ;
         cin  >> r2 >> c2; }
     cout  <<  endl  <<  "   1-matritsaning elementlarini kiriting:"  <<  endl ;
     for (i =  0 ; i < r1; ++i)
         for (j =  0 ; j < c1; ++j){
             cout  <<  "a elementni kiriting"  << i +  1  << j +  1  <<  " : " ;
             cin  >> a[i][j]; }
     cout  <<  endl  <<  "2 matritsani elementni kiriting:"  <<  endl ;
     for (i =  0 ; i < r2; ++i)
         for (j =  0 ; j < c2; ++j){
             cout  <<  "b elementni kiriting"  << i +  1  << j +  1  <<  " : " ;
             cin  >> b[i][j]; }
     for (i =  0 ; i < r1; ++i)
         for (j =  0 ; j < c2; ++j) {
            mult[i][j]= 0 ; }
     for (i =  0 ; i < r1; ++i)
         for (j =  0 ; j < c2; ++j)
             for (k =  0 ; k < c1; ++k) {
                mult[i][j] += a[i][k] * b[k][j]; }
     cout <<  endl  <<  "Matritsani chop etish"  <<  endl ;
     for (i =  0 ; i < r1; ++i)
     for (j =  0  ; j < c2; ++j){ 
         cout  <<  " "  << mult[i][j];
         if (j == c2 -1 )
              cout  <<  endl ;
    }
     return   0 ; }
23 24

Mavzu: “Matritsada qidiruv algoritmlari” Mundarija Mavzu: Matritsada qidiruv algoritmlari ......................................................................................................... 2 Kirish ............................................................................................................................................................. 2 I BOB.Matritsa haqida tushuncha .................................................................................................................. 4 1.1.Matritsalarni qayta ishlash .................................................................................................................. 5 1.2. Matritsani kiritish-chiqarish algoritmi ................................................................................................ 5 1.3. Matritsalarni qayta ishlash algoritmlariga misollar ............................................................................. 6 II BOB.Matritsalarni qidirish algoritmi tarixi va uning dasturi ........................................................................ 7 2.1.Matritsada muntazam qidiruv ............................................................................................................. 8 2.2.Matritsada ikkilik qidiruv ................................................................................................................... 11 2.3.Matritsada qidirsh algoritm dastulari c++ va phytonda kodlari tahlili ............................................... 14 2.4.Matritsalarni tartiblash algoritm ....................................................................................................... 16 III BOB.Matritsalarni qo’shish,ayirishva ko’paytirish ................................................................................... 18 3.1.Matirtsalarni qo’shish ........................................................................................................................ 18 3.2. Matirtsalarni ayirish .......................................................................................................................... 19 3.3.Matritsalarni ko’paytirish .................................................................................................................. 20 Foydalanilgan adabiyotlar ........................................................................................................................... 22 Ilovalar ........................................................................................................................................................ 23

Mavzu: Matritsada qidiruv algoritmlari Kirish Universitetga matematika bilan bog'liq mutaxassislik bo'yicha kirgan har qanday odam matritsalarni o'rganishga duch keladi. Matritsa operatsiyalari algebraning eng muhim bo'limidir. C + da dasturlash kursini o'rganar ekanmiz, biz faqat eng oddiy vazifalardan foydalandik, masalan, yig'indi va farqni topish, shuningdek, qatorlar / ustunlar bo'yicha saralashning har xil turlari va boshqalar. Bugungi kunda matematik dasturlash barcha dasturlashning muhim tarkibiy qismi hisoblanadi. Oddiy dasturlar tufayli katta va murakkab hisob-kitoblar oddiy holga keladi. Mikroelektronika fan va texnikaning eng tez va samarali rivojlanayotgan sohalaridan biridir. Biroq, sxemalarning rivojlanishi bilan birga, ishlab chiqilgan sxemalarning murakkabligi ham ortadi. Mantiqiy modeli matritsa, xususan, mantiqiy modeli bo'lgan sxema elementlari mavjud. Mikrosxemaning maydoni va uning ishlashi ko'p jihatdan matritsaning parametrlariga bog'liq. Shuning uchun, ustuvor vazifa, masalan, Mantiqiy matritsalarning eng qisqa qopqog'ini topish orqali elementning hajmini kamaytirishdir. Eng qisqa qamrovlarni izlashning maqsadga muvofiqligi mantiqiy funktsiyalarning DNF ni minimallashtirishda, mantiqiy sxemalarning ayrim turlarini sintez qilishda, mantiqiy tenglamalar tizimini echishda, eng oddiy diagnostika testlarini qidirishda, shuningdek, boshqa ko'plab muammolarni hal qilishda yuzaga keladi. bo'lib chiqadigan hal qilish usullarining samaradorligi Eng qisqa qoplamalarni topish algoritmlari, ayniqsa, nisbatan katta matritsa o'lchamiga ega bo'lgan odam uchun mashaqqatli ishdir, shuning uchun men ishlab chiqqan dastur bu ishni juda osonlashtiradi. Ushbu ishning dolzarbligi shundaki, bugungi kunda Yer sayyorasi aholisining yarmidan ko'pi kompyuterdan foydalanadi. Ularning ko'pchiligi o'z ishini turli manbalardan kerakli ma'lumotlarni, xoh u Internet, ma'lumotlar bazalari yoki mahalliy diskdagi fayllarni qidirishdan boshlaydi va agar qidiruv vaqti hatto bir soniyaga ko'paytirilsa, unda umumiy vaqt sarflangan kerakli ma'lumotlarni qidirayotgan barcha foydalanuvchilar 200 yildan oshadi. Shuning uchun qidiruv vaqtini minimal darajaga qisqartiradigan qidiruv algoritmlarini ishlab chiqish, saqlash va amalga oshirish juda muhimdir. Google infratuzilma bo‘yicha vitse-prezidenti Urs Xölzlening so‘zlariga ko‘ra, “Tezlikni saqlab qolish uchun bizda bitta oddiy qoida bor: qidiruv jarayonini sekinlashtiradigan funksiyalarni ishlatmang. Siz ajoyib yangi algoritm ixtiro qilishingiz mumkin, lekin agar u qidiruvni sekinlashtirsa, siz bu haqda unutishingiz, tuzatishingiz yoki sekinlashuvning o'rnini bosadigan boshqa o'zgarishlarni o'ylab topishingiz kerak bo'ladi. Bizda oilaviy byudjetga o'xshash "qat'iy kechikish byudjeti" mavjud. Agar siz 2

chiroyliroq ta'tilga chiqmoqchi bo'lsangiz-u, lekin byudjetingiz kengaymasa, boshqa joyni qisqartirishingiz kerak." Aynan shuning uchun ko'plab o'zini o'zi hurmat qiladigan dasturiy ta'minot ishlab chiqaruvchi kompaniyalarda umuman dasturiy ta'minot tezligiga va ayniqsa samarali qidiruv algoritmlarini ishlab chiqishga alohida e'tibor beriladi, ishlab chiqish guruhi darajalarni ko'rishi uchun ishlash doimiy ravishda nazorat qilinadi. xizmatlarning kechikishi. Shuning uchun ham bir necha yil oldin ishlar sekinlasha boshlaganida, asosiy e’tibor mahsulotlarni tezroq ishlab chiqarishga qaratildi. Tezlik muhandislik madaniyatining muhim qismidir. Tez qidiruvning asosi nafaqat ma'lumotni tezda topish, balki ushbu ma'lumotlarning so'rovga mos kelishiga ishonch hosil qilish imkonini beruvchi samarali qidiruv algoritmlarini ishlab chiqishdir, shuning uchun ushbu kurs ishining maqsadi qidiruv algoritmlarini o'rganish va tahlil qilishdir. 3

I BOB.Matritsa haqida tushuncha Matritsa - bu halqa yoki maydon elementlarining to'rtburchaklar jadvali (masalan, butun, haqiqiy yoki murakkab sonlar) shaklida yozilgan matematik ob'ekt bo'lib, uning elementlari kesishgan joyda joylashgan qatorlar va ustunlar to'plamidir. Matritsaning satrlari va ustunlari soni matritsaning hajmini aniqlaydi. Masalan, uchburchak matritsalar tarixan ko'rib chiqilgan bo'lsa-da, bugungi kunda faqat to'rtburchaklar matritsalar haqida gapiriladi, chunki ular eng qulay va umumiydir. Matritsalar matematikada chiziqli algebraik yoki differentsial tenglamalar tizimini ixcham tasvirlash uchun keng qo'llaniladi. Bunda matritsa qatorlari soni tenglamalar soniga, ustunlar soni esa noma’lumlar soniga mos keladi. Natijada chiziqli tenglamalar sistemalarining yechimi matritsalar ustidagi amallarga qisqaradi. Matritsa uchun quyidagi algebraik amallar aniqlanadi: 1. bir xil o'lchamdagi matritsalarni qo'shish; 2. mos o'lchamdagi matritsalarni ko'paytirish (ustunlari bo'lgan matritsa o'ng tomonda satrli matritsaga ko'paytirilishi mumkin ); 3. shu jumladan vektor matritsa bilan ko'paytirish (matritsani ko'paytirishning odatiy qoidasiga ko'ra; vektor bu ma'noda matritsaning maxsus holatidir); 4. matritsani asosiy halqa yoki maydonning elementi (ya'ni skaler) bilan ko'paytirish. Qo'shishga nisbatan matritsalar abel guruhini tashkil qiladi; agar biz skaler bilan ko'paytirishni ham ko'rib chiqsak, u holda matritsalar mos keladigan halqa (maydon ustidagi vektor fazosi) ustida modul hosil qiladi. Kvadrat matritsalar to'plami matritsani ko'paytirishda yopiladi, shuning uchun bir xil o'lchamdagi kvadrat matritsalar matritsani qo'shish va matritsani ko'paytirishda birlik bilan assotsiativ halqa hosil qiladi. 4

n o'lchovli chiziqli fazoda harakat qiluvchi har bir chiziqli operator n tartibli yagona kvadrat matritsa bilan bog'lanishi mumkinligi isbotlangan; va aksincha - n-tartibli har bir kvadrat matritsasi bu fazoda harakat qiluvchi yagona chiziqli operator bilan bog'lanishi mumkin. Matritsaning xossalari chiziqli operatorning xossalariga mos keladi. Xususan, matritsaning xos qiymatlari operatorning tegishli xos vektorlarga mos keladigan xos qiymatlari hisoblanadi. 1.1.Matritsalarni qayta ishlash Matritsa ikki o'lchovli massiv bo'lib, uning har bir elementi ikkita indeksga ega: qator raqami - i ; ustun raqami - j . Shuning uchun matritsa elementlari bilan ishlash uchun ikkita halqadan foydalanish kerak. Agar birinchi tsikl parametrining qiymatlari matritsa satrlari raqamlari bo'lsa, ikkinchisi parametrining qiymatlari ustunlar bo'ladi (yoki aksincha). Matritsani qayta ishlash shundan iboratki, dastlab birinchi qator (ustun) elementlari navbatma- navbat, keyin ikkinchisi va boshqalar ko'rib chiqiladi. oxirigacha. Masalalarni yechishda matritsalar ustida bajariladigan asosiy amallarni ko'rib chiqing. 1.2. Matritsani kiritish-chiqarish algoritmi Matritsalar, massivlar kabi, element bo'yicha kiritilishi (chiqish) kerak. Matritsa elementlarini kiritish blok diagrammasi rasmda ko'rsatilgan. 1-rasm. Matritsaning chiqishi kirishga o'xshash tarzda tashkil etilgan. 1-rasm 2-rasm Matritsalarni qayta ishlashning bir qancha masalalarini ko'rib chiqamiz. Ularni yechish uchun matritsalarning ayrim xossalarini o‘quvchiga eslatib o‘tamiz (2-rasm):  agar elementning satr raqami ustun raqamiga to'g'ri kelsa (i = j) , bu element matritsaning asosiy diagonalida joylashganligini anglatadi; 5