2-mavzu. Algoritmlar samaradorligini baholash Tayanch so’zlar (1)
3-ta’rif. f(n)funksiya Θ(g(n)) deyiladi, agar shunday musbat c1, c2 va N sonlar mavjud bo’lsaki, ular uchun barcha n>=N larda quyidagi tengsizlik o’rinli bo’lsa: c1*g(n)<=f(n)<=c*2g(n). Misollar
Endi biz bir nechta misollarda assiptotik funcsiyalarni aniqlashni ko’rib chiqamiz.
Sodda sikl yordamida massiv elementlari yig’indisini hisoblashdan boshlaymiz. for (i = sum = 0; i < n; i++) sum += a[i]; Avval 2 ta o’zgaruvchini inisializatsiya qilamiz, sikl n ta iteratsiyadan iborat bo’lib, har bir qadamda yig’indi qiymati sum va i ni qiymati yangilanadi. Demak, algoritm vazifani to’liq yechish uchun 2+2n marta amallar bajarishi kerak bo’ladi, ya’ni bu holda assimptotik funksiya O(n) bo’ladi.
Agar ichma-ich joylashgan sikllar bo’lsa assimptotik funksiya darajasi ham ortib boradi. Buni quyidagi barcha nul holatdan boshlanuvchi massiv ostilarini yig’indisini hisoblash misolida ko’rish mumkin. Uning kodi: for (i = 0; i < n; i++) { for (j = 1, sum = a[0]; j <= i; j++) sum += a[j]; cout<<< i <<Sikl i ni initsializatsiya qilishdan boshlanadi, demaktashqi sikl n marta ishlaydi, va har bir ishlaganda ichki sikldagi 2 ta amal i marta, 3ta amal n marta takroran bajariladi. U holda bajarilgan amallar soni 1+3n + ∑2i=1+3n+n(n-1)=O(n)+ O(n^2) = O(n^2) kabi bo’ladi. Demak, masalani hal qilish uchun O(n^2) tartibdagi sonda amallar bajarilishi kerak.
Agar ichma-ich joylashgan sikllar bo’lsa assimptotik funksiya darajasi ham ortib boradi. Buni quyidagi barcha nul holatdan boshlanuvchi massiv ostilarini yig’indisini hisoblash misolida ko’rish mumkin. Uning kodi: for (i = 0; i < n; i++) { for (j = 1, sum = a[0]; j <= i; j++) sum += a[j]; cout<<< i <<Sikl i ni initsializatsiya qilishdan boshlanadi, demaktashqi sikl n marta ishlaydi, va har bir ishlaganda ichki sikldagi 2 ta amal i marta, 3ta amal n marta takroran bajariladi. U holda bajarilgan amallar soni 1+3n + ∑2i=1+3n+n(n-1)=O(n)+ O(n^2) = O(n^2) kabi bo’ladi. Demak, masalani hal qilish uchun O(n^2) tartibdagi sonda amallar bajarilishi kerak.
Assimptotik funksiyani aniqlash iterasiyalar soni o’zgaruvchan bo’lganda qiyinlashadi. Bu holat quyidagicha misolda ko’rinishi mumkin.
Assimptotik funksiyani aniqlash iterasiyalar soni o’zgaruvchan bo’lganda qiyinlashadi. Bu holat quyidagicha misolda ko’rinishi mumkin.
Elementlari o’sish tartibida joylashgan eng uzun qism massivning uzunligini aniqlash kerak bo’lsin. Masalan, [1 8 1 2 5 0 11 12] massivda tartiblangan elementlardan iborat eng uzun qism massiv [1 2 5] bo’lib, uning uzunligi 3 ga teng. Eng uzun osuvchi qism massivni aniqlash kodi quyidagicha bo’ladi:
for(i=0,length=1; i for(i1=i2=k =i;k< n-1 &&a[k] if(length length =i2-i1 +1; } Agar massiv elementlari kamayuvchi bo’lsa, tashqi sikl n-1 marta ishlaydi, xar bir tashqi sikl iterasiyasida ichki sikl 1 marta bajariladi. Demak, bu holda samaradorlik O(n) bo’ladi. Agar elementlar o’suvchi tartibda joylashgan bo’lsa bu algoritm past samara beradi. Chunki bu holda tashqi sikl n-1 marta bajariladi, ichki sikl esa n-1-i xar bir i 0,1,… n-2 uchun, demak, bu xolda algoritm samaradorligi O(n^2) bo’ladi
Agar massiv elementlari kamayuvchi bo’lsa, tashqi sikl n-1 marta ishlaydi, xar bir tashqi sikl iterasiyasida ichki sikl 1 marta bajariladi. Demak, bu holda samaradorlik O(n) bo’ladi. Agar elementlar o’suvchi tartibda joylashgan bo’lsa bu algoritm past samara beradi. Chunki bu holda tashqi sikl n-1 marta bajariladi, ichki sikl esa n-1-i xar bir i 0,1,… n-2 uchun, demak, bu xolda algoritm samaradorligi O(n^2) bo’ladi
Eng yahshi, o’rtacha va eng yomon algoritmlar.
Yuqoridagi misollarga asoslanib shuni aytish mumkinki, algoritmlar samaradorligi bo’yicha 3 hil bolishi mumrin: 1) Eng yomon holat bunda algoritm masalani echish uchun maksimal sondagi amallarni bajarishni talab qiladi; 2) Eng yaxshi holat bunda algoritm masalani echish uchun minimal sondagi amallarni bajarishni talab qiladi; 3) Ortacha holat bunda algoritm masalani echish uchun maksimal va minimal sonlar orasidagi sondagi amallarni bajarishni talab qiladi.
Sodda hollarda ortacha samaradorlikni aniqlash algoritmga mumkin bolgan kirishlar, har bir kirish uchun algoritm asosida bajarilayotgan etaplar sonini aniqlash, barcha kirishlar uchun qadamlar sonini aniqlash va ularning hammasini qoshib hisoblangandan song kirishlar soniga bolish yordamida amalda oshiriladi.