Big O notation - Algoritm
samaradorligini hisoblash
Big O notation - bu algoritm qancha vaqt ishlashi haqida
gapirish uchun foydalanadigan til . Muammoga turli
yondashuvlarning samaradorligini shu tarzda solishtiramiz.
Tasavvur qiling-a, sizda 10 ta ob'ekt ro'yxati bor va siz
ularni tartibda saralashni xohlaysiz. Buni amalga oshirish
uchun siz foydalanishingiz mumkin bo'lgan bir qancha
algoritmlar mavjud, ammo barcha algoritmlar bir xil
tarzda tuzilgan emas.
Bu algoritmlarni solishtirishning oddiy usuli va ular
qancha vaqt ishlashini anglatadi.
Big O notations
Algoritm samaradorligining
soddalashtirilgan tahlili. U quyidagilarni
hisobga oladi:
1. Kirish hajmi bo'yicha murakkablik, N
2. Mashina mustaqilligi (mashinalarning apparatini
hisobga olmaydi)
3. Kompyuterning asosiy bosqichlari
4. Vaqt va joy ( ishchi xotira ) O tartibini bildiradi (nem. " Ordnung von").
n - kirishni ifodalash uchun zarur bo'lgan bit
birliklaridagi kirish hajmi
Umumiy qoidalar
Konstantalarga e'tibor bermang (faqat uzoq
muddatli o'sishni hisobga oladi)
5n O(n) ga aylanadi
Shartlar boshqalar tomonidan hukmronlik
qiladi
O(1) < O( logn ) < O(n) < O( nlogn ) < O(n 2 ) < O(2 n
) < O(n!)
Pastroq tartib shartlariga e'tibor bermang
Doimiy vaqt algoritmlari - O(1)
Kirish hajmi uchun olingan vaqt
Doimiy vaqt algoritm berilgan vazifani
bajarish uchun bajarishi kerak bo'lgan
operatsiyalar soni kirish hajmiga bog'liq
emasligini anglatadi.
Big O notatsiyasida biz quyidagi O(1) dan
foydalanamiz.
Vazifani bajarish uchun qancha
ma'lumot qo'shishingizdan qat'i nazar,
vaqt miqdori o'zgarmaydi.
Algoritmning eng tezkor turi
Doimiy vaqt
O(1) “Big oh of one”
X = 10 + (5 * 2);
Kirish hajmi (X) mustaqil
muhim emas
kod/algoritmni qayta ishlashga ta'sir qilmaydi
Demak, bu O(1)
Doimiy vaqt
O(1) “Big oh of one”
X = 10 + (5 * 2);
Y = 20 - 2;
System.out.print ("x + y");
Umumiy vaqt = O(1) + O(1) + O(1) = 3 * O(1)
Biz konstantalarni tashlaganimiz uchun biz bu kodni
chaqiramiz
O(1) “Big oh of one”
Doimiy vaqt algoritmlari - O(1) Misol
1
2
int n = 5000;
System.out.println ("Hey - sizning kiritishingiz: " + n);
1
2
3
4
int n = 5000;
System.out.println ("Sizning kiritishingiz: " + n);
System.out.println ("Yaxshi narsalar bilan: " + n);
System.out.println ("Va yana: " + n);
Yuqoridagi n nima ekanligi muhim emas . Ushbu kod qismi
ishlashi uchun doimiy vaqt talab etiladi. Bu n ning
o'lchamiga bog'liq emas .
Ushbu ikkita kod bitini ko'rib
chiqing:
Logarifmik vaqt algoritmlari - O(log n)
Logarifmik vaqt algoritmlarning
ishlash vaqti kirish hajmining
logarifmiga proportsional ekanligini
anglatadi. Big O belgisida bu odatda
O (log n) sifatida ifodalanadi.
Doimiy vaqtdan keyin keyingi eng
tez
Bo'l va zabt et strategiyasini o'z
ichiga olgan har qanday kod
Ikkilik qidiruv algoritmi O(log n)
Logarifmik vaqt algoritmlari - O(log n)
- Misol
1
2
3
int n = 8;
for( int i = 1; i < n; i = i * 2){
System.out.println ("Hey - men ko'rish bilan
bandman: " + i );
}
1
2
3
Hey - Men ko'rish bilan bandman: 1
Hey - Men ko'rish bilan bandman: 2
Hey - Men ko'rish bilan bandman: 4
n 8 bo'lganligi sababli , chiqish quyidagicha bo'ladi:
Bizning oddiy algoritmimiz log 2 (8) = 3 marta ishladi .
O (log n)
Bu erda muhim narsa shundaki, ish vaqti kirishning
logarifmiga mutanosib ravishda o'sadi (bu holda, 2-
bazaga log):
Kirish ma'lumotlarining bir
qismini e'tiborsiz
qoldiradigan har qanday
algoritm O (log (n)) deb
hisoblanishi mumkin.
N = Kirish qiymati, masalan,
massivdagi elementlar soni
Logarifm - asosiy tamoyillar
8 ni olish uchun nechta 2 ni
ko'paytiramiz?
2x2x2=8
Shunday qilib, logarifm 3 ga teng
Biz buni shunday yozamiz
log 2 (8) = 3
Lineer vaqt algoritmlari - O(n)
Keyingi eng tezkor
algoritm
Chiziqli vaqt - bu vaqt
bo'yicha ketma-ket
ko'rinadigan tushuncha
bo'lib, biror narsaga olib
boradigan voqealar
silsilasi: boshlanishi va
oxiri.
Uning kirish hajmiga
to'g'ridan-to'g'ri
proportsional ravishda
Chiziqli vaqt O(n) misoli
Y = 5 + (20 * 20) //O (1)
Diapazondagi x uchun (O, n); //O(N)
printx;
Umumiy vaqt = O(1) + O(N) = O(N)
Chiziqli vaqt (O(N)) doimiy vaqtdan (O(1)) ancha uzoq
davom etganligi sababli, u hukmronlik qiladi va samarali
ravishda ahamiyatsiz bo'lib qoladi.
Bu sikl 0 dan n gacha raqamlarni chop etadi
Chiziqli vaqt algoritmlari - O(n) - Misol
1
2
3
for( int i = 0; i < n; men ++) {
System.out.println ("Hey - men ko'rish bilan bandman: " + i
);
}
Bu kod N marta ishlaydi. Biz buni amalga oshirish uchun qancha vaqt
ketishini aniq bilmaymiz - va biz bu haqda tashvishlanmaymiz.
uning kiritish hajmida chiziqli bo'ladi , n.
Algoritmlarni chiziqli ravishda quyidagicha belgilaymiz: O(n).
1
2
3
4
5
for( int i = 0; i < n; men ++) {
System.out.println ("Hey - men ko'rish bilan bandman: " + i
);
System.out.println ("Hmm.. Yana bir ko'rib chiqamiz: " + i
);
System.out.println ("Va boshqasi: " + i );
}
Polinomli vaqt algoritmlari - O(n p )
Kvadrat vaqt algoritmlari
sifatida ham tanilgan
Odatda nested for looplar bilan
belgilanadi.
Agar massivingizda 10 ta
element bo'lsa va algoritmingiz
Polinom vaqtida ishlayotgan
bo'lsa, siz 10 * 10 = 100 qadamni
bajarasiz.
Polinomli vaqt algoritmlari – O(n p ) - Misol
Diapazondagi x uchun (O, n); //O(N)
printx;
(0, n) diapazondagi x uchun; //O(N 2 )
(0, n) diapazonidagi y uchun;
Chop etish x * y; // O(1)
Uchta ichki halqalar bormi? O(N3 ) to'rt? O(N 4 ) va
hokazo
Polinomli vaqt algoritmlari – O(n p ) - Misol
8 2 = 64 marta ishlaydi
Bu O(n 2 ) algoritmi, chunki u ikkita halqaga ega
Agar biz boshqa for loopini joylashtirsak, bu O(n 3 ) algoritmiga aylanadi.
O(n 2 ) O(n 3 ) dan tezroq , O(n 4 ) dan tezroq va hokazo.
1
2
3
4
5
for( int i = 1; i <= n; men ++) {
for( int j = 1; j <= n; j++ ) {
System.out.println ("Hey - men ko'rish bilan bandman: "
+ i + " va " + j);
}
}
Ko'p nomli umumiy atama bo'lib, kvadrat (n 2 ) , kub (n 3 ) , kvart (n 4 ) va
boshqalarni o'z ichiga oladi. funktsiyalari.
Bubble Sort - Polinomli vaqt algoritmi
Massiv uzunligini kiriting. ( int )
100
massivida '99' element mavjud.
Men "4950" tekshiruvini o'tkazdim
Bajarish vaqti "0" daqiqa "0" soniya "0" Millisekundlar
Massiv uzunligini kiriting. ( int )
60000
massivida '59999' element mavjud.
Men "1799970000" tekshiruvini amalga oshirdim
Bajarish vaqti "0" daqiqa "14" soniya "344" Millisekundlar
Ko'p nomli murakkablik qancha ko'p ma'lumotga ega bo'lsangiz, shuncha ko'p
tekshiruvlar o'tkazishingiz kerak va uni bajarish uchun ko'proq vaqt kerak
bo'ladi.
polinomi hisoblanadi . Uning ikkita halqasi bor.
Agar ma'lumotlar allaqachon tartiblangan bo'lsa, unda murakkablik chiziqli o
(n) bo'ladi, chunki tsikl faqat bir marta ishlashi kerak.
Massiv uzunligiga
qarab bajarilish
vaqtidagi katta
farqga e'tibor bering.
Qabariqli tartiblash
kattaroq ma'lumotlar
massivlari uchun
unchalik samarali
emas. Samaradorlik
keskin pasayadi.
Ishlash vaqtining narxi, uskunaning ishlashini
omil sifatida tan olish.
Big O Notation apparatning ishlashini hisobga
olmaydi.
Protsessor tezligi, xotira ( odatda RAM), tarmoqli
kengligi, kechikish, saqlash maydoni, quvvat -
barchasi algoritm tezligiga ta'sir qiladi.
Albatta, algoritmning samaradorligi hali ham
muhim rol o'ynaydi, ammo biz xom ashyoning
ishlashini e'tiborsiz qoldira olmaymiz.