Uploaded by Islom Xayrullayev

algoritm

advertisement
O‘ZBEKISTON RESPUBLIKASI AXBOROT TEXNOLOGIYALARI VA
KOMMUNIKATSIYALARINI RIVOJLANTIRISH VAZIRLIGI
MUHAMMAD AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI SAMARQAND
FILIALI
"Kompyuter injiniring" kafedrasi
№ 1 мustaqil ta’lim ish hisoboti
Fan___________“ Algoritmlarni loyihalash”___________________
Guruh
ATS-21-08
Talaba
Xayrullayev Islom
Nazriy savol javoblari.
Birinchi nazariy savolning javobi.
Mavjud algoritmlarning ko’pchilig xotira va tezlik o’rtasida tanlovni taklif
qiladi. Masala tez ishlashi va katta xotira egallashi yoki sekin ishlashi va kichik
xotira hajmini egallashi mumkin. Bu holatda eng odatiy misollardan biri eng
qisqa masofani topish masalasi bo’la oladi. Bunda siz o’zaro bog’liq bo’lgan
shahar orasidagi istalgan ikki nuqta orasidagi eng qisqa masofani topishingiz
kerak bo’ladi. Bunda biz barcha nuqtalar orasidagi qisqa masofalarni aniqlab
ularni jadval shaklida saqlab qo’yishimiz mumkin. Va biz eng qisqa masofani
aniqlashimizga
to’g’ri kelganda shunchaki jadvaldan ma’lumotni olib
qo’yishimiz mumkin bo’ladi.
Natijani shu zahoti olishimiz mumkin, ammo bu juda katta hajm talab
qiladi. Masalan biror katta xaritada 10 minglab nuqtalar bo’lishi mumkin va
bizning jadvalimiz buning uchun
10 milliarddan ortiq ma’lumotni saqlashiga
to’g’ri keladi va bu taxminan 10GB ga yaqin xotirani band etishi mumkin.
Ushbu holatdan hajm-vaqt murakkabligi kelib chiqadi. Shunda algoritm
vaqt bo’yicha ishlash tezligi yoki hajm bo’yicha ishlash tezligi bilan baholanadi.
Biz asosiy e’tiborni vaqt bo’yicha murakkablikka qaratamiz lekin shu
bilan birga foydalaniladigan xotira hajmini ham aniq belgilashimizga to’g’ri
keladi.
Ikkinchi nazariy savolning javobi.
Bitta masalani hal qilish uchun turli xil algoritmlarni ko'rib chiqsak, ular qancha hisoblash
resurslarini (ishlash vaqti, xotira) talab qilishini tahlil qilish va eng samaralisini tanlash foydalidir.
Albatta, biz hisoblashning qaysi turidan foydalanilganligi to'g'risida kelishib olishimiz kerak ..
Algoritmning ishlash vaqti bilan biz bajaradigan elementar qadamlar sonini tushunamiz. Aytaylik,
psevdokodning bir qatorida belgilangan miqdordagi operatsiyalar talab qilinadi (masalan, ba'zi
murakkab harakatlarning og'zaki tavsifi bo'lmasa - masalan, "hamma nuqtalarni x-koordinata
bo'yicha saralash"). Qo'ng'iroq qilish (qo'ng'iroq qilish) protsedurasini (ma'lum miqdordagi
operatsiyalarni oladi) va uning bajarilishini (bajarilishini) farqlashingiz kerak, ular uzoq davom
etishi mumkin.
Algoritmning murakkabligi bu vazifaning o'lchamiga qarab talab qilinadigan manbaning kattaligi
tartibini (vaqt yoki qo'shimcha xotira) aks ettiradigan qiymatdir.
Shunday qilib, biz algoritmning vaqtinchalik T (n) va fazoviy V (n) murakkabligini ajratamiz.
Murakkablikni baholashni ko'rib chiqishda biz vaqtinchalik murakkablikdan foydalanamiz.
Fazoviy murakkablik ham shunga o'xshash tarzda baholanadi. Baholashning eng oson usuli bu
eksperimental usul, ya'ni algoritmni dasturlash va natijada olingan dasturni bir nechta vazifalar
bo'yicha bajarish dasturlarning bajarilish vaqtini baholash. Biroq, bu usul bir qator
kamchiliklarga ega. Birinchidan, eksperimental dasturlash, ehtimol qimmat jarayon. Ikkinchidan,
shuni yodda tutish kerakki dasturlarning bajarilish vaqtiga quyidagi omillar ta'sir qiladi:
1. Dastur algoritmining vaqt murakkabligi;
2. bajariladigan dasturning kompilyatsiya qilingan kodining sifati;
Dasturni bajarish uchun ishlatiladigan mashina ko'rsatmalari.
Ikkinchi va uchinchi omillarning mavjudligi algoritmning vaqt murakkabligini o'lchashning tipik
birliklaridan foydalanishga imkon bermaydi (soniya, millisekundlar va boshqalar), chunki agar siz
turli xil dasturchilar (har bir algoritmni kim dasturlasa) bir xil algoritm uchun har xil baholarni
olish mumkin. o'z), turli xil kompilyatorlar va turli xil kompyuterlar.
Ko'pincha, algoritmning vaqt murakkabligi kiritish hajmiga bog'liq. Odatda algoritmning vaqt
murakkabligi n o'lchamidagi kirish ma'lumotlarini T (n) tartibiga to'g'ri keladi, deyiladi.
Amaliyotda T (n) ning aniq qiymatini aniqlash juda qiyin. Shuning uchun ular O-simvolizmidan
foydalanib, asimptotik munosabatlarga murojaat qilishadi.
Keyinchalik muhokama qilinadigan algoritmning bajarilish vaqtini nazariy jihatdan hisoblaydigan
usul mavjud.
Uchinchi nazariy savolning javobi.
Algoritmlarni tahlil qilishning asosiy vazifasi kirish ma'lumotlari hajmining oshib borishi bilan
resurslarga bo'lgan talabni (vaqt va xotira xarajatlari) o'lchash usullarini aniqlashdir. Shundan
so'ng, o'sish sur'ati qonuniyatlarini tavsiflash uchun zarur bo'lgan matematik mexanizm ishlab
chiqiladi. Kirish ma'lumotlari hajmini oshirish bilan turli xil funktsiyalar; "bitta funktsiya
boshqasiga qaraganda tezroq o'sadi" iborasi nimani anglatishini aniqlab olishga yordam beradi.
Ba'zi hollarda, yaxshi bajarilish vaqtiga erishish yanada murakkab ma'lumotlar tuzilmalaridan
foydalanishga bog'liq va bo'lim oxirida biz bunday ma'lumotlar strukturasining juda foydali
misolini ko'rib chiqamiz: ustuvor navbatlar va ularni uyum(kucha, heap) asosida amalga oshirish.
Asosiy maqsad - hisoblash muammolarining samarali algoritmlarini izlash. Ushbu umumiylik
darajasida kompyuterni hisoblashning butun sohasi ushbu mavzu bilan bog'liq bo'lib tuyuladi;
bizning yondashuvimiz boshqalardan qanday farq qiladi? Algoritmlarni ishlab chiqishda umumiy
mavzular va loyihalash tamoyillarini aniqlashga harakat qilamiz. Bizni samarali algoritmlarni
loyihalashning asosiy usullarini minimal ma'lumot bilan namoyish etuvchi paradigmatik
masalalar va usullar qiziqtiradi.
Algoritmni bajarilish qadami - bu ijrochi tomonidan bitta ko‘rsatmaning bajarilishidir. Bir
masalani hal etuvchi ikkita algoritmdan kam qadam talab qilinayotgani samaraliroqdir.
Samaradorlik o‘lchovi - bu bor-yo‘g‘i qadamlar sonidir. Lekin chuqurroq e’tibor berib qarasak bu
ta’rifdagi mujmal tomonlarni aniqlaymiz. Ba’zan avval uchragan algoritmlardagidan ko‘ra vaziyat
murakkabroq bo’ladi.
Algoritmlar murakkabligi bilan ham farqlanishi mumkin. Algoritmning murakkabligini uning
matnidagi satrlar soni bilan o‘lchaymiz. Shu bilan birga quyidagi ikki satrni bir tuzilmaning ikki
qismi bo‘lgani uchun hisoblaymiz.
To`rtinchi nazariy savolning javobi.
Oliy matematika kursidan malumki aniq integrallar asosan N‘yuton-Leybnits formulasi bilan
hisoblanadi. Yani quyidagi formula bilan hisoblanadi:
Bu yerda F(x) funktsiya f(x) funktsiyaning boshlangich funktsiyasi. а-integralning quyi b-esa
yuqori chegarsi. Nyuton–Leybnits formulasi bizga ma‘lumki elementar funktsiyalar uchun
foydalanish qulayrok.
Lekin har qanday f(x) funktsiyaning boshlangich funktsiyasi elementar funktsiya bulavermaydi,
yani integrallash murakkab bo’ladi. Bunday aniq integrallarni N‘yuton-Leybnits formulasi bilan
hisoblab bulmaydi. Bunday hollarda integrallarni taqribiy hisoblash usularidan foydalanib
integrallarning taqribiy qiymatlari topiladi.
2-amaliy mashg’ulot topshiriqlari
1-topshiriq
Quyidagi masalalar uchun algoritm va dastur kodini yozing.
1. Bir o`lchamli sonli massivni manfiy elеmеntlari massivni eng kichik elеmеntini
kvadratiga almashtirilsin
Kiruvchi ma’lumotlar: Birinchi satrda n (1<=n <=100). Ikkinchi satrda n ta butun son
(-100<=a[i]<=100).
7
46 23 2704 34 6 2704 52
46 23 -52 34 6 -18 52
Algoritm:
1. Massivni o`qib olamiz va eng kichik elementni topamiz.
2. Eng kichik elementni kvadratiga oshiramiz.
3. Yangi massivni chiqaramiz.
Dastur kod:
n = int(input()) # massiv uzunligini o'qiyapmiz
a = list(map(int, input().split())) # massivni o'qiyapmiz
# eng kichik elementni topamiz
min_elem = a[0]
for i in range(1, n):
if a[i] < min_elem:
min_elem = a[i]
# kvadratiga oshiramiz
min_elem = min_elem ** 2
# yangi massivni chiqaramiz
for i in range(n):
if a[i] == min_elem:
a[i] = min_elem
print(a)
3-amaliy mashg’ulot topshiriqlari
1-topshiriq
Quyidagi masalalar uchun algoritm va dastur kodini yozing Quyidagi transsendent
tenglamani oraliqni teng ikkiga bo’lish va oddiy iteratsiya usuli yordamida yechimini aniqlovchi
dastur tuzing:
17) x2+4sinx=0
import math
def f(x):
return x**2 + 4*math.sin(x)
def bisection(a, b, tol):
if f(a)*f(b) >= 0:
print("Bisection method fails.")
return None
else:
while (b-a)/2 > tol:
c = (a+b)/2
if f(c) == 0:
return c
elif f(c)*f(a) < 0:
b=c
else:
a=c
return (a+b)/2
def simple_iteration(x0, tol):
max_iter = 100
i=0
while i < max_iter:
x1 = -math.sqrt(-4*math.sin(x0))
if abs(x1 - x0) < tol:
return x1
x0 = x1
i += 1
print("Simple iteration method fails.")
return None
# main program
a = -5
b=5
tol = 1e-6
# use bisection to find an interval containing the root
x_interval = bisection(a, b, tol)
# use simple iteration to find the root within the interval
if x_interval is not None:
x_root = simple_iteration(x_interval, tol)
if x_root is not None:
print("The solution is:", x_root)
f(x) funksiyasi berilgan transsendental tenglamani aniqlaydi. bisection()
funksiyasi tenglamaning ildizini oz ichiga olgan intervalni topish uchun
bisektsiya usulini amalga oshiradi. simple_iteration()` funksiyasi interval
ichida ildizni topish uchun oddiy takrorlash usulini amalga oshiradi. Asosiy
dastur avval ildizni o'z ichiga olgan intervalni topish uchun bisektsiyadan
foydalanadi, so'ngra shu oraliq ichidagi ildizni topish uchun oddiy iteratsiyadan
foydalanadi. Agar yechim topilsa, u konsolga chop etiladi.
E'tibor bering, ushbu dastur berilgan oraliqda faqat bitta ildiz borligini taxmin
qiladi. Agar bir nechta ildiz bo'lsa yoki hech qanday ildiz bo'lmasa, dastur
muvaffaqiyatsiz bo'lishi yoki noto'g'ri natijalar berishi mumkin.
2-topshiriq
Quyidagi masalalar uchun algoritm va dastur kodini yozing.
Quyidagi transsendent tenglamani Nyuton va Vatarlar usuli yordamida yechimini aniqlovchi
dastur tuzing:
17) sin(x/2)+1=x2
Ma'lumotlar:
- Tenglama: sin(x/2) + 1 = x^2
- Boshlang'ich taxmin: x0 = 1
- Funksiyani aniqlash: f(x) = sin(x/2) + 1 - x^2
- Funksiyani differensialini aniqlash: f'(x) = cos(x/2)/2 - 2x
- Birinchi taxminni aniqlash: x1 = x0 - f(x0)/f'(x0) = 1 - (sin(1/2) + 1 1)/(cos(1/2)/2 - 2) = 0.7834
- Ikkinchi taxminni aniqlash: x2 = x1 - f(x1)/f'(x1) = 0.7834 - (sin(0.3917) + 1
- 0.7834^2)/(cos(0.3917)/2 - 1.5668) = 0.7559
- Keyingi taxminlarni ham shu tartibda hisoblash va natijada quyidagi yechimni
topish mumkin: x = 0.7559 (to'g'ri 4 ta raqamdan keyin).
Vatarlar usulida esa boshlang'ich taxmin tasodifiy sonlar orasidan tanlanadi,
misol uchun x0 = 0.5 bo'lishi mumkin. Keyingi taxminlar esa Nyuton usuliga
o'xshash tartibda hisoblanadi.
Dastur kodlari:
Nyuton usuli:
def f(x):
return math.sin(x/2) + 1 - x**2
def f_der(x):
return math.cos(x/2)/2 - 2*x
def newton_method(x0, tol=1e-6, max_iter=100):
for i in range(max_iter):
fx = f(x0)
if abs(fx) < tol:
return x0
x0 -= fx/f_der(x0)
return None
x0 = 1
x = newton_method(x0)
print("Newton usuli:", round(x, 4))
Vatarlar usuli:
def vatar_method(x0, tol=1e-6, max_iter=100):
for i in range(max_iter):
fx = f(x0)
if abs(fx) < tol:
return x0
x0 = fx + math.sqrt(fx**2 + 4*x0**2)
return None
x0 = 0.5
x = vatar_method(x0)
x = newton_method(x)
print("Vatarlar usuli:", round(x, 4))
Download