Informatika. Algoritmlash va dasturlash asoslari

Algoritm tushunchasi informatika uchun axborot tushunchasi kabi asosiy hisoblanadi. Algoritmning turli xil ta'riflari mavjud, chunki bu tushuncha juda keng va fan, texnologiya va kundalik hayotning turli sohalarida qo'llaniladi.

Algoritm - ob'ektni boshlang'ich holatdan yakuniy holatga o'tkazish jarayonini tavsiflovchi tushunarli va aniq harakatlar ketma-ketligi.

Ijrochi algoritm shaxs (retseptlar, turli ko'rsatmalar, matematik hisoblar uchun algoritmlar) yoki texnik qurilma bo'lishi mumkin. Turli xil mashinalar (kompyuterlar, sanoat robotlari, zamonaviy maishiy texnika) mavjud rasmiy ijrochilar algoritmlar. Rasmiy ijrochidan hal qilinayotgan muammoning mohiyatini tushunish talab etilmaydi, lekin buyruqlar ketma-ketligini aniq bajarish talab etiladi.

Algoritm turli usullarda yozilishi mumkin (og'zaki tavsif, grafik tavsif - blok-sxema, dasturlash tillaridan biridagi dastur va boshqalar). Dastur - bu yozilgan algoritm.

Algoritm (dastur) yaratish uchun siz quyidagilarni bilishingiz kerak:

    muammoning dastlabki ma'lumotlarining to'liq to'plami (ob'ektning dastlabki holati);

    algoritmni yaratish maqsadi (ob'ektning yakuniy holati);

    ijrochining buyruqlar tizimi (ya'ni, bajaruvchi tushunadigan va bajarishi mumkin bo'lgan buyruqlar to'plami).

Olingan algoritm (dastur) quyidagi xususiyatlar to'plamiga ega bo'lishi kerak:

    diskretlik (algoritm alohida bosqichlarga bo'linadi - buyruqlar);

    noaniqlik (har bir buyruq ijrochining yagona mumkin bo'lgan harakatini belgilaydi);

    tushunarlilik (algoritmning barcha buyruqlari ijrochining buyruqlar tizimiga kiritilgan);

    samaradorlik (ijrochi masalani chekli bosqichlarda hal qilishi kerak).

Algoritmlarning aksariyati ham xususiyatga ega ommaviy xarakter (xuddi shu algoritmdan foydalanib, ko'plab shunga o'xshash muammolarni hal qilish mumkin).

Yuqorida ta'kidlanganidek, bir xil algoritmni turli yo'llar bilan yozish mumkin. Algoritm yozilishi mumkin tabiiy til. Shunday qilib, biz retseptlar, ko'rsatmalar va boshqalardan foydalanamiz. Rasmiy ijrochilar uchun mo'ljallangan ro'yxatga olish algoritmlari uchun maxsus dasturlash tillari... Har qanday algoritmni tasvirlash mumkin grafik jihatdan blok diagramma shaklida... Buning uchun maxsus nota tizimi ishlab chiqilgan:

Belgilanish Tavsif Eslatmalar (tahrirlash)
Algoritmning boshlanishi va tugashi
Ma'lumotlarni kiritish va chiqarish. Ma'lumotlar chiqishi ba'zan boshqacha nomlanadi:

Harakat Hisoblash algoritmlarida bu topshiriq
Vilka Vilkalar - novdalar va halqalarni amalga oshirish uchun zarur bo'lgan komponent
Parametr bilan tsikl boshlanishi
Oddiy jarayon Dasturlash, protseduralar yoki pastki dasturlarda
Bloklar orasidagi o'tish

Ikki miqdorni jamlash algoritmini blok-sxema shaklida tasvirlashga misol keltiramiz:

Algoritmni tasvirlashning bu usuli odamlar uchun eng grafik va tushunarli hisoblanadi. Shuning uchun formal bajaruvchilarning algoritmlari odatda birinchi navbatda blok-sxema shaklida ishlab chiqiladi va shundan keyingina ulardan biri bo'yicha dastur tuziladi.

Dasturchi atipik algoritmik tuzilmalarni loyihalash va ulardan foydalanish qobiliyatiga ega, ammo bu shart emas. Har qanday o'zboshimchalik bilan murakkab algoritm uchta tipik tuzilma asosida ishlab chiqilishi mumkin: ketma-ketlik, tarmoqlanish va takrorlash. Bunday holda, tuzilmalar ketma-ket joylashtirilishi yoki bir-biriga joylashtirilishi mumkin.

Chiziqli tuzilish (quyidagicha).

Eng oddiy algoritmik tuzilma hisoblanadi chiziqli. Unda barcha amallar yozilish tartibida bir marta bajariladi.

Tarmoqlanish.

V to'liq dallanish mantiqiy ifoda (shart) qiymatiga qarab bajaruvchining harakatlarining ikkita varianti mavjud. Agar shart rost bo'lsa, u holda faqat birinchi bo'lim bajariladi, aks holda faqat ikkinchi bo'lim bajariladi.

Ikkinchi filial bo'sh bo'lishi mumkin. Ushbu tuzilma deyiladi to'liq bo'lmagan dallanish yoki o'tish.

Bir nechta filiallardan strukturani qurish mumkin " tanlash"(Ko'p tarmoqli), bu ikkitadan emas, balki tanlaydi ko'proq pudratchining harakatlari uchun variantlar, bir qancha shartlarga bog'liq... Faqat bitta filialning bajarilishi juda muhim - bunday tuzilmada shartlarning tartibi muhim bo'ladi: agar bir nechta shartlar bajarilsa, ulardan faqat bittasi ishlaydi - yuqoridan birinchi.


Tsikl (takrorlash).

Velosipedbir xil buyruqlar ketma-ketligini bir necha marta takrorlashni tashkil qilish imkonini beradi- u tsiklning tanasi deb ataladi. Har xil turdagi aylanish algoritmlarida takrorlashlar soni mantiqiy ifoda (shart) qiymatiga bog'liq bo'lishi mumkin yoki strukturaning o'zida qattiq kodlangan bo'lishi mumkin. Tsikllar mavjud: " d O», « P ko'z», hisoblagich bilan tsikllar.“do” va “p oka” sikllarida mantiqiy ifoda (shart) sikl tanasidan oldin kelishi mumkin ( oldingi shart tsikli) yoki tsiklni tugatish ( keyingi holat davri).

C ikly« d O"- tsikl tanasining takrorlanishi shart bajarilgunga qadar:

C ikly « P ko'z"- tsikl tanasining takrorlanishi holatidaamalga oshirildi ( rost):

C hisoblagichli ikli (parametrli)- halqa tanasining ma'lum bir necha marta takrorlanishi:

Yordamchi algoritm (kichik dastur, protsedura).

Yordamchi algoritm asosiy algoritmdan bir necha marta kirish mumkin bo'lgan moduldir. Yordamchi algoritmlardan foydalanish algoritm hajmini sezilarli darajada qisqartirishi va uni ishlab chiqishni soddalashtirishi mumkin.

Murakkab algoritmlarni ishlab chiqish usullari.

Murakkab algoritmlarni ishlab chiqishning ikkita usuli mavjud:

Vazifalarni ketma-ket tafsilotlash usuli("Yuqoridan pastga") dastlabki murakkab masala kichik vazifalarga bo'linadi. Kichik muammolarning har biri alohida ko'rib chiqiladi va hal qilinadi. Agar biron bir kichik vazifa qiyin bo'lsa, ular ham kichik vazifalarga bo'linadi. Jarayon pastki vazifalar elementar vazifalarga qisqartirilguncha davom etadi. So'ngra alohida kichik muammolarning yechimlari dastlabki masalani yechish uchun yagona algoritmga yig'iladi. Usul keng qo'llaniladi, chunki u bir nechta dasturchilarga bir vaqtning o'zida mahalliy kichik vazifalarni hal qilishning umumiy algoritmini ishlab chiqish imkonini beradi. Bu dasturiy mahsulotlarning jadal rivojlanishi uchun zaruriy shartdir.

Yig'ish usuli("Bottom-up") tipik vazifalarni hal qilishni amalga oshiradigan dasturiy modullar majmuasini yaratishdir. Murakkab masalani yechishda dasturchi ishlab chiqilgan modullardan yordamchi algoritmlar (protseduralar) sifatida foydalanishi mumkin. Ko'pchilik allaqachon o'xshash modul to'plamlariga ega, bu murakkab algoritmni yaratishni sezilarli darajada soddalashtiradi va tezlashtiradi.

Boshqaruv - ob'ektlarning maqsadli o'zaro ta'siri, ularning ba'zilari boshqaruvchi, boshqalari esa boshqariladi.

Eng oddiy holatda, ikkita bunday ob'ekt mavjud:

Kompyuter fanlari nuqtai nazaridan nazorat harakatlari nazorat axboroti sifatida qaralishi mumkin. Ma'lumot buyruqlar shaklida uzatilishi mumkin. Oldindan belgilangan maqsadga olib boradigan ob'ektni boshqarish uchun buyruqlar ketma-ketligi deyiladi nazorat qilish algoritmi... Binobarin, boshqaruv obyektini boshqarish algoritmining ijrochisi deb atash mumkin. Yuqoridagi misolda boshqaruv ob'ekti boshqaruv ob'ekti bilan nima sodir bo'lishini "ko'rmasdan" ishlaydi ( ochiq tsiklni boshqarish). Ushbu boshqaruv sxemasi deyiladi ochiq... Boshqaruvning boshqa sxemasi boshqaruv ob'ektida sodir bo'ladigan jarayonlar haqidagi ma'lumotlarni hisobga olishi mumkin:

Bunday holda, boshqaruv algoritmi ushbu ma'lumotni tahlil qilish va boshqaruv ob'ektining holatiga qarab keyingi harakatlar to'g'risida qaror qabul qilish uchun etarlicha moslashuvchan bo'lishi kerak ( qayta aloqa nazorati). Ushbu boshqaruv sxemasi deyiladi yopiq.

Batafsilroq, nazorat jarayonlari o'rganiladi. kibernetika... Bu fan jamiyatdagi, tabiatdagi va texnologiyadagi eng xilma-xil boshqaruv jarayonlari o'xshash tarzda sodir bo'ladi, bir xil tamoyillarga bo'ysunadi, deb da'vo qiladi.

Ko'pincha "Dasturchiga algoritmlar kerakmi" kabi maqolalar mavjud va ularning barchasi taxminan bir xil shablonga ega. Maqola muallifi odatda shunday deb yozadi: “Men N yil davomida 1C da saytlar/skriptlar yozyapman va hech qachon algoritmlar yoki maʼlumotlar tuzilmalaridan foydalanmaganman. Shuningdek, unda misol tariqasida qizil-qora daraxtlar yoki boshqa ekzotik tuzilmalar keltiriladi, ular muallif ishlayotgan hududda umuman uchramaydi. Bunday maqolalar ma'lum bir sohada dasturchilar murakkab ma'lumotlar tuzilmalaridan foydalanmasliklari va NP muammolarini hal qilmasliklari bilan bog'liq.

Bunday savolni shakllantirishning o'zi tubdan noto'g'ri. Sanoatdagi mutaxassisliklar soni doimiy ravishda o'sib bormoqda va .netda saytlar yozadigan odam ekzotik OT ostida ARM arxitekturasida sensorlar uchun drayverlarni yozadigan odamdan butunlay boshqacha ishlarni qiladi. Keling, avval algoritm nima ekanligini aniqlaylik. Norasmiy ravishda, Kormen algoritmni kirish sifatida bir yoki bir nechta qiymatlarni qabul qiladigan va natijada bir yoki bir nechta qiymatlarni qaytaradigan aniq belgilangan protsedura sifatida belgilaydi. Rasmiy ravishda, algoritm turli xil hisoblash modellarida aniqlanadi: Turing mashinasida yoki lambda hisobi yordamida bajarilishi mumkin bo'lgan operatsiyalar. Demak, biror narsani bajaradigan deyarli har qanday kod algoritmdir. Ma’lum bo‘lishicha, “dasturchiga algoritmlar kerakmi” degan savolni “dasturchi kod yozishni bilishi kerakmi” deb tarjima qilish mumkin. To'g'ri savol shunday bo'lishi kerak: "X sanoatidagi dasturchi ilg'or algoritmlarni va hisoblash nazariyasi tafsilotlarini bilishi kerakmi?"

Agar siz ushbu maqolalarning barchasini ko'rib chiqsangiz, ularni yozgan odamlar universitetlardan juda ko'p murakkab materiallarni - algoritmik tahlil, murakkab algoritmlar va ma'lumotlar tuzilmalari ko'rinishida o'rganishga majbur bo'lishlari uchun xafa bo'lganini payqadingiz. foydasi yo'q.... Darhaqiqat, maqola mualliflari universitetlardan xafa bo'lishadi, chunki ular mualliflarning kelajakdagi ish sohasini oldindan aytib bera olmadilar va ularga faqat minimal zarur ko'nikmalar to'plamini bera olmadilar. Darhaqiqat, oddiy saytlar va skriptlarni yozish uchun sizga algoritmlar va ma'lumotlar tuzilmalari bo'yicha maxsus bilim kerak emas. Yoki bu hali ham kerakmi?

Keling, universitet dasturchisi muvaffaqiyatli martaba uchun zarur ko'nikmalarga ega bo'lishi uchun nimani o'rgatishi kerakligi haqida o'ylab ko'raylik. Kutubxonalarmi? Ramkalar? Ular eskirib bormoqda, interfeyslar o'zgarib bormoqda, ularning barchasi ko'pincha bir tilda yoziladi, talabalar sanoatda hech qachon foydalana olmaydi. Hammaga veb-saytlar yozishni o'rgatish uchunmi? Yoki hammaga OS yozishni o'rgating? Ta'lim imkon qadar keng auditoriyani qamrab olishi va imkon qadar keng ko'nikmalar to'plamini taqdim etishi kerak. Dasturchi birinchi navbatda muammolarni tahlil qilish va hal qila olishi kerak - bu informatika bitiruvchilari egallashi kerak bo'lgan asosiy ko'nikma. Kod yozish oddiygina muammolarni hal qilish uchun ishlatiladigan zarur vositadir. Kelajakda sizga qanday ko'nikmalar kerakligini kim biladi? Shunday qilib, o'qitish nazariyasi ta'lim nuqtai nazaridan eng maqbuldir. Olingan ko'nikmalar har qanday sohada qo'llanilishi mumkin va yaxshi bilim bazasiga ega kutubxona yoki ramkani o'rganish qiyin bo'lmaydi. Algoritmlarga bo'lgan ehtiyoj haqida savol beradigan odamlar, qoida tariqasida, bu sohada ma'lum bilimga ega bo'lishlari paradoksaldir. Hisoblash nazariyasi sohasida bilimga ega bo‘lmagan va bu haqda g‘urur bilan baqirib, ularga kerak emasman, deb baqirgan birorta ham odamni eslolmayman.

Shunday qilib, siz vakuumda mavhum dasturchisiz, siz o'n yildan ortiq vaqt davomida veb-saytlarni perchinlash va mijozlar / kompaniyalar uchun bir xil turdagi oddiy vazifalarni hal qilish bilan shug'ullanasiz. Siz o'z joyingizda o'zingizni yaxshi va qulay his qilasiz va hisoblash va algoritmik tahlil nazariyasi bo'yicha darsda behuda vaqt sarflaganingiz uchun juda og'riqli, bu sizga hech narsa bermadi. Ertalab bir chashka qahva ustida sigaret tutib, hayotning zaifligi haqida chuqur falsafiy mulohaza yuritar ekansiz: nima uchun murakkab masalalarni yechmaydigan dasturchilar algoritmlar va tahlil asoslarini bilishlari kerak, deb o‘ylaysiz. Qisqa javob - malakali odam bo'lish va mavjud vositalardan, jumladan, yozayotgan tilingizdan samarali foydalanish. Algoritmlar va tahlil nazariyasi nafaqat AVL va qizil-qora daraxtlar shaklida ekzotik algoritmlar va ma'lumotlar tuzilmalarini o'rgatadi. Shuningdek, u ma'lumotlarni qanday samarali tashkil etish, maksimal ishlash uchun kod yozish, tizimda qayerda to'siq bo'lishi mumkinligi va u bilan qanday kurashish haqida tushunchalar beradi. Siz velosipedlarni yozmaslik va har safar arzimas narsa qilishingiz kerak bo'lganda Google-ga yugurmaslik uchun tayyor echimlar bilan tanishasiz.

Tahlil nazariyasi va algoritmlar haqidagi bilimlar aslida hamma dasturchilar tomonidan har kuni qo'llaniladi, shunchaki, biz bu narsalarga shunchalik ko'nikib qolganmizki, bu haqda o'ylamaymiz ham. Qaysi muammoni hal qilsangiz ham - bu ma'lumotlar bazasidan ma'lumotlarni oladigan oddiy sayt bo'ladimi yoki serverdagi bash skripti bo'ladimi, siz qandaydir ma'lumotlar strukturasidan foydalanasiz. Hech bo'lmaganda ibtidoiy massiv va, ehtimol, murakkabroq narsa. Tillar bizga juda ko'p turli xil tuzilmalarni beradi, ularning aksariyati bir-birini almashtiradi. Bizda ko'pincha turli xil ilovalar bilan bir xil mavhum turdagi bir nechta o'zgarishlar mavjud. Misol uchun, C ++ da vektor va ro'yxat ma'lumotlar tuzilmalari mavjud. Ular bir-biridan qanday farq qiladi va bir yoki boshqasini ishlatishning afzalliklari va kamchiliklari qanday? C++ da xarita qanday amalga oshiriladi va u multimapdan nimasi bilan farq qiladi? Ro'yxat Pythonda qanday amalga oshiriladi - massiv yoki bog'langan ro'yxat orqali va u bilan ishlashning eng yaxshi usuli qanday? Nima uchun C# da ArrayList-dan foydalanish va uning o'rniga List-dan foydalanish istalmagan? SortedDictionary qanday amalga oshiriladi va Lug'at o'rniga ishlatilsa, dastur bajarilishiga qanday ta'sir qiladi? Davom etish qanday ishlaydi, uni qachon ishlatish kerak va uni qo'llashda nojo'ya ta'sirlar bo'ladimi? Deyarli har bir tilda topilgan kurried funksiyalaridan oxirgi marta qachon foydalangansiz? Agar siz C++ dagi xarita xash-jadval sifatida amalga oshirilgan deb o'ylasangiz, adashasiz. U qizil-qora daraxtlarda, xesh-jadval unordered_map-da amalga oshiriladi. Dinamik dasturlashni ham eslatib o'tishimiz kerak. Bu nima ekanligini, rekursiv funktsiyalarni qanday qilib optimal tarzda qayta yozishingiz mumkinligini va xotira nima ekanligini tushunish ko'pincha oyog'ingizga o'q tegmaslikka yordam beradi. Shunday qilib, siz yozayotgan tildan to'liq va samarali foydalanish uchun siz hech bo'lmaganda ma'lumotlar tuzilmalari, ular nima ekanligi va dasturingizning bajarilishiga qanday ta'sir qilishi haqida yuzaki ma'lumotga ega bo'lishingiz kerak.

Ammo kutubxonalar haqida nima deyish mumkin? Axir ular juda ko'p muammolarni hal qilishadi! Kutubxonalardan samarali foydalanish uchun siz ularni ham tushunishingiz kerak. Birinchidan, kutubxonadagi funktsiyalarning yon ta'siri yoki xatti-harakati bo'lishi mumkin, ularni siz algoritmlarni tushunmasdan bilib bo'lmaydi. Bunday holatda xatolik yuzaga kelgandan so'ng, siz uni uzoq vaqt va qat'iyat bilan ushlashga urinib ko'rishingiz va qachon oldini olish mumkinligini hal qilishingiz mumkin. Ikkinchidan, turli xil vositalar va kutubxonalar ko'pincha "sozlanishi" kerak - ularga qanday algoritmlar, ma'lumotlar tuzilmalari va texnologiyalardan ichki foydalanish kerakligini aytib berish. Asosiy ma'lumotga ega bo'lmasangiz, siz mana o'qishga borishingiz yoki tasodifiy tanlashingiz kerak bo'ladi. Uchinchidan, kutubxona yoki ramkaning API-ga oddiy qo'ng'iroq qilish orqali hal qilib bo'lmaydigan ko'plab vazifalar mavjud. Bu holatda nima qilasiz? Mumkin echimlarni izlash va do'stingizdan yordam so'rash uchun soatlab sarflaysizmi? To'rtinchidan, ko'p vazifalarni bir necha qator kodlar yoki o'rnatilgan til vositalari yordamida juda oddiy hal qilish mumkin. Agar siz har bir aksirishni hal qilish uchun kutubxonani tortib olsangiz, unda sizning dasturlaringiz diskda yuzlab megabayt yoki undan ko'proq hajmni egallagan, serverdagi barcha xotirani egallab oladigan va shu bilan birga juda kam funksionallikka ega bo'lgan ulkan yirtqich hayvonlarga aylanadi. Bundan tashqari, bog'langan kutubxonalar to'plamining mavjudligi muvofiqlik muammolariga olib keladi va dastur bir loyihada bir nechta kutubxonalarning g'alati xatti-harakati tufayli tasodifiy ishlamay qolishi mumkin. Kutubxonalardan o‘ylamasdan foydalanish dahshatli oqibatlarga olib kelishi mumkin va faqat kutubxonalardan foydalanishni biladigan, lekin oddiygina masalani o‘zi hal qila olmaydigan ishlab chiquvchilar hech qachon qadrlanmaydi, chunki ularning yechimlari raqobatbardosh bo‘lmaydi.

Men bilan o'n yildan ortiq tajribaga ega bir dasturchi ishladi. Bir paytlar biz foydalanadigan kutubxona o'sha paytda qo'llab-quvvatlamagan funktsiyaga muhtoj edik: vizual komponentlardan birida ibtidoiy matnni o'rash. Ushbu "dasturchi" buni standart vositalar bilan amalga oshirish mumkin emasligini ko'rdi va darhol bunday funktsiyani amalga oshirish mumkin emasligini e'lon qildi. Muammoni analitik miyaga ega uchinchi kurs stajyori hal qildi, u ikki soat ichida oddiy algoritm yozdi va uni kerakli komponentga kiritdi. Men .netda veb-sayt shaklida boshqa loyihani meros qilib oldim. Asosiy sahifa bir nechta kichik grafiklardan iborat bo'lib, uni yuklash uchun deyarli 10 soniya kerak bo'ldi. Ma'lum bo'lishicha, dastlab ushbu loyihani amalga oshirgan odam ma'lumotlar bazasidan uzoq vaqt va afsuski ma'lumotlarni olib, keyin ularni grafiklarga bog'lagan uch qavatli uyali halqalarning dahshatli tuzilmalarini to'plagan. Bir oz refaktoringdan so'ng, sahifa deyarli bir zumda yuklana boshladi.

Dasturchi algoritm va tahlil nazariyasini bilmasdan ishlay oladimi? Balki bunday “dasturchilar” ko‘pdir. Ularni dasturchilar deb atash qiyin bo'lardi. Ko'pgina dasturchilar menga intervyu olish uchun kelishadi, ular o'n-o'n besh yillik tajribaga ega va ular nima qilayotganlarini va nima uchun ekanligini tushunmaydilar. Ularning o'z joyi bor, ular bir yildan ortiq turmasdan kompaniyadan kompaniyaga o'tadilar. Qoida tariqasida, ular hal qilishlari mumkin bo'lgan kichik vazifalar to'plamiga ega va agar siz bir chetga qadam qo'ysangiz, u holda odam yo'qoladi va u o'zini yangi ko'nikmalarga o'rgatishi kerak. Bunday odamlar loyihaga taklif qilinadi va ular imkon qadar tezroq ulardan xalos bo'lishadi, chunki ular universitetdan nimani bilishlari kerakligini bilish uchun velosipedlarni qayta ixtiro qilish va mana o'qish uchun ko'p vaqtlarini behuda sarflashadi. Ular odatda ko'p martaba va beqaror daromadga ega emaslar.

Oxir-oqibat, agar siz bu bilimsiz ishni bajarishingiz mumkin bo'lsa, nima uchun algoritmlarni va tahlil nazariyasini bilishingiz kerak? O'z kasbining malakali mutaxassisi bo'lish, martaba o'sishi va hamkasblari tomonidan hurmatga sazovor bo'lish. Belgilangan vazifalarni samarali hal qilish va g'ildirakni qayta ixtiro qilmaslik uchun. Yuzlab megabayt disk maydonini egallagan ko'p sonli uchinchi tomon kutubxonalari bilan yirtqich hayvonlarni yozmaslik uchun ular serverda juda ko'p xotirani iste'mol qiladilar va oyning fazasiga qarab tasodifiy sabablarga ko'ra muntazam ravishda tushib qolishadi. Yozayotgan tilingizdan unumli foydalanish uchun. Muammoni hal qilish uchun kutubxona va texnologiyani tanlash bo'yicha ongli va mazmunli qarorlar qabul qilish. Agar sizning vazifangiz SQL so'rovini yozish va konsolga buyruq berish bo'lsa, men sizni xafa qilmoqchiman: siz dasturchi emassiz, siz foydalanuvchisiz, sizga haqiqatan ham algoritmlar va unga o'xshash boshqalar kerak emas va siz o'z vaqtingizni behuda sarf qildingiz. universitetda vaqt, chunki bunday ish uchun kurslarni tugatish yoki o'zingiz bir nechta kirish kitoblarini o'qish kifoya.

Algoritmlarni o'rganish va bilishning ahamiyatini tushunish uchun birinchi qadam algoritm nimani anglatishini aniq belgilashdir. Mashhur "Algoritmlar: Qurilish va tahlil" kitobiga ko'ra (Kormen, Leiserson, Rivest, Shtayn), "algoritm - bu ma'lum bir qiymat yoki qiymatlar to'plami bo'lgan va natijasi bo'lgan har qanday aniq belgilangan hisoblash protsedurasidir. chiqish (chiqish) qiymat yoki qiymatlar to'plami ". Boshqacha qilib aytganda, algoritmlar aniq belgilangan maqsadga erishish uchun yo'l xaritalariga o'xshaydi. Fibonachchi ketma-ketligi a'zolarini hisoblash uchun kod bo'lagi ma'lum bir algoritmni amalga oshirishdir. Hatto ikkita raqamni qo'shish uchun oddiy funktsiya oddiy bo'lsa ham, algoritmdir.

Ba'zi algoritmlar, masalan, Fibonachchi ketma-ketligini hisoblash uchun, intuitiv va mantiqiy fikrlash va muammolarni hal qilishning tug'ma qobiliyatlari bilan bog'liq. Shunga qaramay, ko'pchiligimiz murakkab algoritmlarni o'rganishdan adashmaymiz, shunda kelajakda biz ularni mantiqiy muammolarni yanada samarali hal qilish uchun qurilish bloklari sifatida ishlatishimiz mumkin. Haqiqatan ham, odamlar elektron pochta xabarlarini tekshirish yoki musiqa tinglashda qancha murakkab algoritmlardan foydalanishini bilib hayron bo'lishingiz mumkin. Ushbu maqola algoritmlarni o'rganishning muhimligini ko'rsatish uchun amaliy misollar bilan algoritm tahlilining ba'zi asosiy g'oyalarini taqdim etadi.

Algoritmni bajarish vaqtini tahlil qilish

Algoritmning eng muhim jihatlaridan biri uning tezligidir. Muammoni hal qiladigan algoritmni topish ko'pincha oson, lekin agar algoritm juda sekin bo'lsa, u qayta ko'rib chiqish uchun qaytib keladi. Algoritmning aniq tezligi algoritm qayerda ishlashiga, shuningdek, amalga oshirish tafsilotlariga bog'liq bo'lganligi sababli, kompyuter olimlari odatda kirishga nisbatan bajarish vaqti haqida gapirishadi. Misol uchun, agar kirish N ta butun sondan iborat bo'lsa, u holda algoritm N 2 ga proportsional bajarilish vaqtiga ega bo'lishi mumkin, bu O (N 2) sifatida ifodalanadi. Bu shuni anglatadiki, agar siz algoritmni amalga oshirishni N o'lchamdagi kirishga ega kompyuterda ishga tushirsangiz, u C * N 2 soniya davom etadi, bu erda C kirish hajmiga qarab o'zgarmaydigan ba'zi bir doimiydir.

Biroq, ko'pgina murakkab algoritmlarning bajarilish vaqti nafaqat kiritilgan ma'lumotlarning hajmiga, balki boshqa ko'plab omillarga ham bog'liq. Misol uchun, agar to'plam allaqachon tartiblangan bo'lsa, butun sonlar to'plamini saralash algoritmi tezroq bo'lishi mumkin. Qatlning eng yomoni va o'rtacha ijro ishi haqida gapirish odatiy holdir. Eng yomon bajarilish vaqti - bu algoritmning eng yomon kiritish bilan maksimal bajarish vaqti. O'rtacha bajarilish holati - barcha mumkin bo'lgan kirishlar bo'yicha algoritmning o'rtacha ishlash vaqti. Ushbu ikki turdagi ish vaqtining eng yomoni eng osoni va shuning uchun odatda berilgan algoritm uchun mos yozuvlar sifatida ishlatiladi. Algoritmning eng yomon va o'rtacha bajarilish vaqtini aniqlash jarayoni juda murakkab bo'lishi mumkin, chunki odatda barcha mumkin bo'lgan kirishlar uchun algoritmni ishga tushirish mumkin emas.

Tartiblash

Saralash ko'pincha dasturchilar tomonidan qo'llaniladigan algoritmning yaxshi namunasidir. Elementlar guruhini saralashning eng oson usuli bu guruhdan eng kichik elementni olib tashlash va uni birinchi o'ringa qo'yishdan boshlashdir. Keyin ikkinchi eng katta element olib tashlanadi va ikkinchi o'ringa qo'yiladi va hokazo. Afsuski, ushbu algoritmning ishlash vaqti O (N 2) bo'lib, u elementlarning kvadratiga mutanosib ravishda vaqtni oladi. Agar biz milliardlab narsalarni saralashimiz kerak bo'lsa, unda bu algoritm 10 18 amalni talab qiladi. Oddiy ish stoli kompyuterlari sekundiga taxminan 10 9 operatsiyani bajaradi deb faraz qilsak, bu milliard elementni saralashni tugatish uchun yillar kerak bo'ladi.

Yaxshiyamki, tezkor saralash, yig'ish saralash va birlashtirish kabi bir qator ilg'or algoritmlar mavjud. Bu algoritmlar ish vaqti O (N * Log (N)) ga ega. Shunday qilib, milliardlab narsalarni saralash uchun zarur bo'lgan operatsiyalar soni shunchalik oqilona darajaga kamayadiki, hatto eng arzon ish stoli kompyuter ham bunday tartibni amalga oshirishi mumkin. Milliardlab kvadrat operatsiyalar o'rniga (10 18), bu algoritmlar faqat 10 milliard operatsiyani (10 10) talab qiladi, ya'ni. 100 million tezroq.

Eng qisqa yo'l

Bir nuqtadan ikkinchi nuqtaga eng qisqa yo'lni topish algoritmlari ko'p yillar davomida tadqiq qilingan. Ushbu algoritmlarni qo'llash bo'yicha ko'plab misollar mavjud, ammo taqdimotning soddaligi uchun biz quyidagi bayonotga amal qilamiz: bir nechta ko'cha va chorrahalarga ega bo'lgan shaharda A nuqtadan B nuqtagacha eng qisqa yo'lni topish talab qilinadi. Ushbu muammoni hal qilish uchun juda ko'p turli xil algoritmlar mavjud va ularning barchasi o'zlarining afzalliklari va kamchiliklariga ega. Ular bilan tanishishdan oldin oddiy qo'pol kuch algoritmining bajarilish vaqtini ko'rib chiqamiz. Agar algoritm A dan B gacha bo'lgan barcha mumkin bo'lgan yo'lni ko'rib chiqsa (bu tsikllarni hosil qilmaydi), hatto A va B kichik shaharchada bo'lsa ham, bizning hayotimizda tugashi dargumon. Ushbu algoritmning bajarilish vaqti eksponent bo'lib, u ba'zi C uchun O (C N) sifatida belgilanadi. C ning kichik qiymatlari uchun ham N o'rtacha katta bo'lganda C N astronomik raqamga aylanadi.

Ushbu muammoni hal qilishning eng tezkor algoritmlaridan biri O (E * V * Log (V)) ish vaqtiga ega, bu erda E - yo'l segmentlari soni va V - kesishmalar soni. 10 000 ta chorraha va 20 000 ta yoʻl segmentiga ega boʻlgan shahardagi eng qisqa yoʻlni topish uchun algoritm taxminan 2 soniya vaqt oladi (odatda har bir chorrahada 2 ta yoʻl segmenti mavjud). Ushbu algoritm Dijkstra algoritmi sifatida tanilgan, u ancha murakkab va ustuvor navbatdagi ma'lumotlar strukturasidan foydalanishni talab qiladi. Biroq, ba'zi hollarda, hatto bunday ish vaqti juda sekin (masalan, Nyu-Yorkdan San-Fransiskogacha bo'lgan eng qisqa yo'lni toping - AQShda millionlab chorrahalar mavjud), bunday hollarda dasturchilar ish vaqtini yaxshilashga harakat qilishadi. evristika deb ataladi. Evristik - bu vazifaga tegishli bo'lgan narsaning taxminiy qiymati. Eng qisqa yo'lni topish vazifasida, masalan, bir nuqtaning belgilangan joydan qanchalik uzoqligini bilish foydali bo'lishi mumkin. Buni bilib, siz tezroq algoritmni ishlab chiqishingiz mumkin (masalan, A * qidiruv algoritmi ba'zi hollarda Dijkstra algoritmiga qaraganda ancha tezroq ishlaydi). Bunday yondashuv har doim ham algoritmning eng yomon holatda bajarilish vaqtini yaxshilamaydi, lekin real hayotdagi ko'pgina ilovalarda algoritm tezroq ishlay boshlaydi.

Taxminiy algoritmlar

Ba'zan hatto eng ilg'or evristikaga ega eng ilg'or algoritm ham eng tezkor kompyuterda juda sekin ishlaydi. Bunday hollarda yakuniy natijaning aniqligini kamaytirish kerak. Eng qisqa yo'lni olishga harakat qilish o'rniga, siz o'zingizni eng qisqa yo'ldan 10% ko'proq yo'l bilan cheklashingiz mumkin.

Aslida, hozirda ma'lum bo'lgan algoritmlar juda sekin optimal natija beradigan juda ko'p muhim vazifalar mavjud. Ushbu muammolarning eng mashhur guruhi NP (deterministik bo'lmagan polinom) deb ataladi. Agar muammo NP-to'liq yoki NP-qiyin deb nomlansa, bu hech kim optimal echimni olishning etarlicha yaxshi usulini bilmasligini anglatadi. Bundan tashqari, agar kimdir bitta NP-qiyin muammoni hal qilish uchun samarali algoritm ishlab chiqsa, u holda bu algoritm barcha NP-qiyin masalalarga qo'llanilishi mumkin.

NP-qiyin muammoning yaxshi namunasi sayohatchi sotuvchi muammosidir. Sotuvchi N shaharga tashrif buyurishni xohlaydi va u bir shahardan boshqasiga ko'chib o'tish uchun qancha vaqt kerakligini biladi. Savol shundaki, u qanchalik tez barcha shaharlarga tashrif buyurishi mumkin? Ushbu muammoni hal qilishning eng tez ma'lum algoritmi juda sekin - va ko'pchilik bu har doim shunday bo'lishiga ishonadi - shuning uchun dasturchilar yaxshi yechimni beradigan, lekin ko'pincha optimal bo'lmagan algoritmlarni izlaydilar.

Tasodifiy algoritmlar

Ba'zi muammolarni hal qilishda qo'llaniladigan yana bir yondashuv algoritmni tasodifiy qilishdir. Ushbu yondashuv eng yomon holatda algoritm vaqtini yaxshilamaydi, lekin ko'pincha o'rta holatda yaxshi ishlaydi. Tezkor saralash algoritmi randomizatsiyadan foydalanishning yaxshi namunasidir. Eng yomon holatda, tezkor saralash algoritmi elementlar guruhini O (N 2) da tartiblaydi, bu erda N - elementlar soni. Agar ushbu algoritmda randomizatsiya ishlatilsa, unda eng yomon holat ehtimoli ahamiyatsiz bo'lib qoladi va o'rtacha hisobda tezkor tartiblash algoritmi O (N * Log (N)) vaqtida ishlaydi. Boshqa algoritmlar O (N * Log (N)) ish vaqtini eng yomon holatda ham kafolatlaydi, ammo ular o'rtacha sekinroq. Ikkala algoritm ham N * Log (N) ga mutanosib ish vaqtiga ega bo'lsa-da, tezkor tartiblash algoritmi kichikroq doimiy omilga ega - ya'ni. u C * N * Log (N) ni talab qiladi, boshqa algoritmlar esa 2 * C * N * Log (N) dan ortiq operatsiyalarni talab qiladi.

Tasodifiy raqamlardan foydalanadigan boshqa algoritm raqamlar guruhi uchun medianani qidiradi va uning o'rtacha ishlash vaqti O (N). Bu raqamlarni saralaydigan va o'rtachani oladigan va O (N * Log (N)) da ishlaydigan algoritmga nisbatan ancha tezroq. O (N) vaqt ichida medianani topishga imkon beruvchi deterministik algoritmlar (tasodifiy emas) mavjud, ammo tasodifiy algoritmni tushunish osonroq va ko'pincha bu deterministik algoritmlarga qaraganda tezroq ishlaydi.

Median qidiruv algoritmining asosiy g'oyasi raqamlar orasidan tasodifiy sonni tanlash va guruhdagi qancha raqam tanlangan raqamdan kamligini hisoblashdir. Aytaylik, N ta son bor, ularning K soni tanlangan sondan kichik yoki teng. Agar K N ning yarmidan kam bo'lsa, biz mediana tasodifiy sondan katta bo'lgan (N / 2-K) th son ekanligini bilamiz, shuning uchun biz tasodifiy sondan kichik yoki unga teng bo'lgan K raqamlarni o'chirib tashlaymiz. Endi biz mediana o'rniga (N / 2-K) eng kichik sonni topmoqchimiz deylik. Algoritm bir xil, biz tasodifiy raqamni tanlaymiz va tasvirlangan amallarni takrorlaymiz.

Siqish

Algoritmlarning yana bir klassi ma'lumotlarni siqish uchun mo'ljallangan. Bu algoritm kutilgan natijaga ega emas (masalan, saralash algoritmi), lekin buning oʻrniga baʼzi mezonlarga muvofiq optimallashtirishni amalga oshiradi. Ma'lumotni siqish holatida algoritm (masalan, LZW) ma'lumotlarni iloji boricha kamroq baytni egallashga harakat qiladi, lekin shu bilan birga, uni asl ko'rinishiga ochish mumkin. Ba'zi hollarda bu turdagi algoritmlar boshqa algoritmlar kabi usullardan foydalanadi, natijada yaxshi natijaga erishiladi, lekin optimal emas. Masalan, JPG va MP3 ma'lumotlarni shunday siqib chiqaradiki, yakuniy natija asl nusxadan pastroq, lekin hajmi kichikroq bo'ladi. MP3 siqish asl audio faylning har bir jihatini saqlamaydi, lekin fayl hajmini sezilarli darajada qisqartirish bilan birga maqbul sifatni ta'minlash uchun etarli tafsilotlarni saqlashga harakat qiladi. JPG formati bir xil printsipga amal qiladi, ammo tafsilotlar butunlay boshqacha, chunki maqsad audio emas, balki tasvirni siqishdir.

Nima uchun algoritmlarni bilish juda muhim?

Algoritmlardan to'g'ri foydalanish uchun barcha tilga olingan algoritm turlarini bilish muhimdir. Agar siz muhim dasturiy ta'minotni ishlab chiqishingiz kerak bo'lsa, unda siz algoritmingiz tezligini taxmin qilishingiz kerak. Sizning taxminingizning to'g'riligi algoritmlarni bajarish vaqtini tahlil qilish mahoratingizga bog'liq. Bundan tashqari, siz algoritmlarning tafsilotlarini bilishingiz kerak, bu dastur tez ishlamaydigan yoki qabul qilinishi mumkin bo'lmagan natijalarni beradigan maxsus holatlarni bashorat qilishga imkon beradi.

Albatta, ilgari o'rganilmagan muammolarga duch keladigan paytlaringiz bo'ladi. Bunday hollarda siz yangi algoritmni o'ylab topishingiz yoki eski algoritmni qaytadan qo'llashingiz kerak. Algoritmlar haqida qanchalik ko'p bilsangiz, muammoning to'g'ri echimini topish ehtimoli shunchalik yuqori bo'ladi. Ko'pgina hollarda, yangi vazifa osongina eskisiga qisqartirilishi mumkin, ammo bu eski vazifalarni tubdan tushunishni talab qiladi.

Misol sifatida, tarmoq kalitlari qanday ishlashini ko'rib chiqing. Kommutatorga N ta kabel ulangan va ushbu kabellarga kelgan ma'lumotlar paketini qabul qiladi. Kommutator avval paketlarni tahlil qilishi va keyin ularni to'g'ri kabel orqali qaytarib yuborishi kerak. Kommutator, kompyuter kabi, diskret rejimda ishlaydi - paketlar doimiy ravishda emas, balki diskret oraliqlarda yuboriladi. Tez almashtirish har bir intervalda imkon qadar ko'proq paketlarni yuborishga intiladi, aks holda ular to'planib qoladi va kalit "halokatga uchraydi". Algoritmning maqsadi har bir intervalda paketlarning maksimal sonini jo'natish, shuningdek, boshqalardan oldin kelgan paketlar ham boshqalarga qaraganda tezroq yuborilishi tartibini ta'minlashdir. Bunday holda, "barqaror moslik" deb nomlanuvchi algoritm ushbu muammoni hal qilish uchun mos ekanligi ma'lum bo'ldi, garchi bu birinchi qarashda aniq bo'lmasa ham. Muammo va yechim o'rtasidagi bunday bog'lanishlarni faqat allaqachon mavjud algoritmik bilimlar yordamida aniqlash mumkin.

Haqiqiy misollar

Eng so'nggi algoritmlarni talab qiladigan haqiqiy muammolarni hal qilishning ko'plab misollari mavjud. Kompyuterda qiladigan deyarli hamma narsa kimdir juda uzoq vaqt davomida ishlab chiqayotgan algoritmlarga bog'liq. Hatto eng oddiy dasturlar ham xotirani boshqarish va qattiq diskdan ma'lumotlarni yuklash uchun sahna ortida ishlaydigan algoritmlarsiz mavjud bo'lmaydi.

Murakkab algoritmlardan foydalanish bo'yicha o'nlab misollar mavjud, ammo biz ikkita muammoni muhokama qilamiz, ularni hal qilish TopCoder-da ba'zi muammolarni hal qilish kabi ko'nikmalarni talab qiladi. Birinchi muammo maksimal oqim muammosi sifatida tanilgan, ikkinchisi esa dinamik dasturlash bilan bog'liq - bu usul ko'pincha muammolarni imkonsiz ko'rinadigan chaqmoq tezligida hal qilishga imkon beradi.

Ko'pincha "Dasturchiga algoritmlar kerakmi" kabi maqolalar mavjud va ularning barchasi taxminan bir xil shablonga ega. Maqola muallifi odatda shunday deb yozadi: “Men N yil davomida 1C da saytlar/skriptlar yozyapman va hech qachon algoritmlar yoki maʼlumotlar tuzilmalaridan foydalanmaganman. Shuningdek, unda misol tariqasida qizil-qora daraxtlar yoki boshqa ekzotik tuzilmalar keltiriladi, ular muallif ishlayotgan hududda umuman uchramaydi. Bunday maqolalar ma'lum bir sohada dasturchilar murakkab ma'lumotlar tuzilmalaridan foydalanmasliklari va NP muammolarini hal qilmasliklari bilan bog'liq.

Bunday savolni shakllantirishning o'zi tubdan noto'g'ri. Sanoatdagi mutaxassisliklar soni doimiy ravishda o'sib bormoqda va .netda saytlar yozadigan odam ekzotik OT ostida ARM arxitekturasida sensorlar uchun drayverlarni yozadigan odamdan butunlay boshqacha ishlarni qiladi. Keling, avval algoritm nima ekanligini aniqlaylik. Norasmiy ravishda, Kormen algoritmni kirish sifatida bir yoki bir nechta qiymatlarni qabul qiladigan va natijada bir yoki bir nechta qiymatlarni qaytaradigan aniq belgilangan protsedura sifatida belgilaydi. Rasmiy ravishda, algoritm turli xil hisoblash modellarida aniqlanadi: Turing mashinasida yoki lambda hisobi yordamida bajarilishi mumkin bo'lgan operatsiyalar. Demak, biror narsani bajaradigan deyarli har qanday kod algoritmdir. Ma’lum bo‘lishicha, “dasturchiga algoritmlar kerakmi” degan savolni “dasturchi kod yozishni bilishi kerakmi” deb tarjima qilish mumkin. To'g'ri savol shunday bo'lishi kerak: "X sanoatidagi dasturchi ilg'or algoritmlarni va hisoblash nazariyasi tafsilotlarini bilishi kerakmi?"

Agar siz ushbu maqolalarning barchasini ko'rib chiqsangiz, ularni yozgan odamlar universitetlardan juda ko'p murakkab materiallarni - algoritmik tahlil, murakkab algoritmlar va ma'lumotlar tuzilmalari ko'rinishida o'rganishga majbur bo'lishlari uchun xafa bo'lganini payqadingiz. foydasi yo'q.... Darhaqiqat, maqola mualliflari universitetlardan xafa bo'lishadi, chunki ular mualliflarning kelajakdagi ish sohasini oldindan aytib bera olmadilar va ularga faqat minimal zarur ko'nikmalar to'plamini bera olmadilar. Darhaqiqat, oddiy saytlar va skriptlarni yozish uchun sizga algoritmlar va ma'lumotlar tuzilmalari bo'yicha maxsus bilim kerak emas. Yoki bu hali ham kerakmi?

Keling, universitet dasturchisi muvaffaqiyatli martaba uchun zarur ko'nikmalarga ega bo'lishi uchun nimani o'rgatishi kerakligi haqida o'ylab ko'raylik. Kutubxonalarmi? Ramkalar? Ular eskirib bormoqda, interfeyslar o'zgarib bormoqda, ularning barchasi ko'pincha bir tilda yoziladi, talabalar sanoatda hech qachon foydalana olmaydi. Hammaga veb-saytlar yozishni o'rgatish uchunmi? Yoki hammaga OS yozishni o'rgating? Ta'lim imkon qadar keng auditoriyani qamrab olishi va imkon qadar keng ko'nikmalar to'plamini taqdim etishi kerak. Dasturchi birinchi navbatda muammolarni tahlil qilish va hal qila olishi kerak - bu informatika bitiruvchilari egallashi kerak bo'lgan asosiy ko'nikma. Kod yozish oddiygina muammolarni hal qilish uchun ishlatiladigan zarur vositadir. Kelajakda sizga qanday ko'nikmalar kerakligini kim biladi? Shunday qilib, o'qitish nazariyasi ta'lim nuqtai nazaridan eng maqbuldir. Olingan ko'nikmalar har qanday sohada qo'llanilishi mumkin va yaxshi bilim bazasiga ega kutubxona yoki ramkani o'rganish qiyin bo'lmaydi. Algoritmlarga bo'lgan ehtiyoj haqida savol beradigan odamlar, qoida tariqasida, bu sohada ma'lum bilimga ega bo'lishlari paradoksaldir. Hisoblash nazariyasi sohasida bilimga ega bo‘lmagan va bu haqda g‘urur bilan baqirib, ularga kerak emasman, deb baqirgan birorta ham odamni eslolmayman.

Shunday qilib, siz vakuumda mavhum dasturchisiz, siz o'n yildan ortiq vaqt davomida veb-saytlarni perchinlash va mijozlar / kompaniyalar uchun bir xil turdagi oddiy vazifalarni hal qilish bilan shug'ullanasiz. Siz o'z joyingizda o'zingizni yaxshi va qulay his qilasiz va hisoblash va algoritmik tahlil nazariyasi bo'yicha darsda behuda vaqt sarflaganingiz uchun juda og'riqli, bu sizga hech narsa bermadi. Ertalab bir chashka qahva ustida sigaret tutib, hayotning zaifligi haqida chuqur falsafiy mulohaza yuritar ekansiz: nima uchun murakkab masalalarni yechmaydigan dasturchilar algoritmlar va tahlil asoslarini bilishlari kerak, deb o‘ylaysiz. Qisqa javob - malakali odam bo'lish va mavjud vositalardan, jumladan, yozayotgan tilingizdan samarali foydalanish. Algoritmlar va tahlil nazariyasi nafaqat AVL va qizil-qora daraxtlar shaklida ekzotik algoritmlar va ma'lumotlar tuzilmalarini o'rgatadi. Shuningdek, u ma'lumotlarni qanday samarali tashkil etish, maksimal ishlash uchun kod yozish, tizimda qayerda to'siq bo'lishi mumkinligi va u bilan qanday kurashish haqida tushunchalar beradi. Siz velosipedlarni yozmaslik va har safar arzimas narsa qilishingiz kerak bo'lganda Google-ga yugurmaslik uchun tayyor echimlar bilan tanishasiz.

Tahlil nazariyasi va algoritmlar haqidagi bilimlar aslida hamma dasturchilar tomonidan har kuni qo'llaniladi, shunchaki, biz bu narsalarga shunchalik ko'nikib qolganmizki, bu haqda o'ylamaymiz ham. Qaysi muammoni hal qilsangiz ham - bu ma'lumotlar bazasidan ma'lumotlarni oladigan oddiy sayt bo'ladimi yoki serverdagi bash skripti bo'ladimi, siz qandaydir ma'lumotlar strukturasidan foydalanasiz. Hech bo'lmaganda ibtidoiy massiv va, ehtimol, murakkabroq narsa. Tillar bizga juda ko'p turli xil tuzilmalarni beradi, ularning aksariyati bir-birini almashtiradi. Bizda ko'pincha turli xil ilovalar bilan bir xil mavhum turdagi bir nechta o'zgarishlar mavjud. Misol uchun, C ++ da vektor va ro'yxat ma'lumotlar tuzilmalari mavjud. Ular bir-biridan qanday farq qiladi va bir yoki boshqasini ishlatishning afzalliklari va kamchiliklari qanday? C++ da xarita qanday amalga oshiriladi va u multimapdan nimasi bilan farq qiladi? Ro'yxat Pythonda qanday amalga oshiriladi - massiv yoki bog'langan ro'yxat orqali va u bilan ishlashning eng yaxshi usuli qanday? Nima uchun C# da ArrayList-dan foydalanish va uning o'rniga List-dan foydalanish istalmagan? SortedDictionary qanday amalga oshiriladi va Lug'at o'rniga ishlatilsa, dastur bajarilishiga qanday ta'sir qiladi? Davom etish qanday ishlaydi, uni qachon ishlatish kerak va uni qo'llashda nojo'ya ta'sirlar bo'ladimi? Deyarli har bir tilda topilgan kurried funksiyalaridan oxirgi marta qachon foydalangansiz? Agar siz C++ dagi xarita xash-jadval sifatida amalga oshirilgan deb o'ylasangiz, adashasiz. U qizil-qora daraxtlarda, xesh-jadval unordered_map-da amalga oshiriladi. Dinamik dasturlashni ham eslatib o'tishimiz kerak. Bu nima ekanligini, rekursiv funktsiyalarni qanday qilib optimal tarzda qayta yozishingiz mumkinligini va xotira nima ekanligini tushunish ko'pincha oyog'ingizga o'q tegmaslikka yordam beradi. Shunday qilib, siz yozayotgan tildan to'liq va samarali foydalanish uchun siz hech bo'lmaganda ma'lumotlar tuzilmalari, ular nima ekanligi va dasturingizning bajarilishiga qanday ta'sir qilishi haqida yuzaki ma'lumotga ega bo'lishingiz kerak.

Ammo kutubxonalar haqida nima deyish mumkin? Axir ular juda ko'p muammolarni hal qilishadi! Kutubxonalardan samarali foydalanish uchun siz ularni ham tushunishingiz kerak. Birinchidan, kutubxonadagi funktsiyalarning yon ta'siri yoki xatti-harakati bo'lishi mumkin, ularni siz algoritmlarni tushunmasdan bilib bo'lmaydi. Bunday holatda xatolik yuzaga kelgandan so'ng, siz uni uzoq vaqt va qat'iyat bilan ushlashga urinib ko'rishingiz va qachon oldini olish mumkinligini hal qilishingiz mumkin. Ikkinchidan, turli xil vositalar va kutubxonalar ko'pincha "sozlanishi" kerak - ularga qanday algoritmlar, ma'lumotlar tuzilmalari va texnologiyalardan ichki foydalanish kerakligini aytib berish. Asosiy ma'lumotga ega bo'lmasangiz, siz mana o'qishga borishingiz yoki tasodifiy tanlashingiz kerak bo'ladi. Uchinchidan, kutubxona yoki ramkaning API-ga oddiy qo'ng'iroq qilish orqali hal qilib bo'lmaydigan ko'plab vazifalar mavjud. Bu holatda nima qilasiz? Mumkin echimlarni izlash va do'stingizdan yordam so'rash uchun soatlab sarflaysizmi? To'rtinchidan, ko'p vazifalarni bir necha qator kodlar yoki o'rnatilgan til vositalari yordamida juda oddiy hal qilish mumkin. Agar siz har bir aksirishni hal qilish uchun kutubxonani tortib olsangiz, unda sizning dasturlaringiz diskda yuzlab megabayt yoki undan ko'proq hajmni egallagan, serverdagi barcha xotirani egallab oladigan va shu bilan birga juda kam funksionallikka ega bo'lgan ulkan yirtqich hayvonlarga aylanadi. Bundan tashqari, bog'langan kutubxonalar to'plamining mavjudligi muvofiqlik muammolariga olib keladi va dastur bir loyihada bir nechta kutubxonalarning g'alati xatti-harakati tufayli tasodifiy ishlamay qolishi mumkin. Kutubxonalardan o‘ylamasdan foydalanish dahshatli oqibatlarga olib kelishi mumkin va faqat kutubxonalardan foydalanishni biladigan, lekin oddiygina masalani o‘zi hal qila olmaydigan ishlab chiquvchilar hech qachon qadrlanmaydi, chunki ularning yechimlari raqobatbardosh bo‘lmaydi.

Men bilan o'n yildan ortiq tajribaga ega bir dasturchi ishladi. Bir paytlar biz foydalanadigan kutubxona o'sha paytda qo'llab-quvvatlamagan funktsiyaga muhtoj edik: vizual komponentlardan birida ibtidoiy matnni o'rash. Ushbu "dasturchi" buni standart vositalar bilan amalga oshirish mumkin emasligini ko'rdi va darhol bunday funktsiyani amalga oshirish mumkin emasligini e'lon qildi. Muammoni analitik miyaga ega uchinchi kurs stajyori hal qildi, u ikki soat ichida oddiy algoritm yozdi va uni kerakli komponentga kiritdi. Men .netda veb-sayt shaklida boshqa loyihani meros qilib oldim. Asosiy sahifa bir nechta kichik grafiklardan iborat bo'lib, uni yuklash uchun deyarli 10 soniya kerak bo'ldi. Ma'lum bo'lishicha, dastlab ushbu loyihani amalga oshirgan odam ma'lumotlar bazasidan uzoq vaqt va afsuski ma'lumotlarni olib, keyin ularni grafiklarga bog'lagan uch qavatli uyali halqalarning dahshatli tuzilmalarini to'plagan. Bir oz refaktoringdan so'ng, sahifa deyarli bir zumda yuklana boshladi.

Dasturchi algoritm va tahlil nazariyasini bilmasdan ishlay oladimi? Balki bunday “dasturchilar” ko‘pdir. Ularni dasturchilar deb atash qiyin bo'lardi. Ko'pgina dasturchilar menga intervyu olish uchun kelishadi, ular o'n-o'n besh yillik tajribaga ega va ular nima qilayotganlarini va nima uchun ekanligini tushunmaydilar. Ularning o'z joyi bor, ular bir yildan ortiq turmasdan kompaniyadan kompaniyaga o'tadilar. Qoida tariqasida, ular hal qilishlari mumkin bo'lgan kichik vazifalar to'plamiga ega va agar siz bir chetga qadam qo'ysangiz, u holda odam yo'qoladi va u o'zini yangi ko'nikmalarga o'rgatishi kerak. Bunday odamlar loyihaga taklif qilinadi va ular imkon qadar tezroq ulardan xalos bo'lishadi, chunki ular universitetdan nimani bilishlari kerakligini bilish uchun velosipedlarni qayta ixtiro qilish va mana o'qish uchun ko'p vaqtlarini behuda sarflashadi. Ular odatda ko'p martaba va beqaror daromadga ega emaslar.

Oxir-oqibat, agar siz bu bilimsiz ishni bajarishingiz mumkin bo'lsa, nima uchun algoritmlarni va tahlil nazariyasini bilishingiz kerak? O'z kasbining malakali mutaxassisi bo'lish, martaba o'sishi va hamkasblari tomonidan hurmatga sazovor bo'lish. Belgilangan vazifalarni samarali hal qilish va g'ildirakni qayta ixtiro qilmaslik uchun. Yuzlab megabayt disk maydonini egallagan ko'p sonli uchinchi tomon kutubxonalari bilan yirtqich hayvonlarni yozmaslik uchun ular serverda juda ko'p xotirani iste'mol qiladilar va oyning fazasiga qarab tasodifiy sabablarga ko'ra muntazam ravishda tushib qolishadi. Yozayotgan tilingizdan unumli foydalanish uchun. Muammoni hal qilish uchun kutubxona va texnologiyani tanlash bo'yicha ongli va mazmunli qarorlar qabul qilish. Agar sizning vazifangiz SQL so'rovini yozish va konsolga buyruq berish bo'lsa, men sizni xafa qilmoqchiman: siz dasturchi emassiz, siz foydalanuvchisiz, sizga haqiqatan ham algoritmlar va unga o'xshash boshqalar kerak emas va siz o'z vaqtingizni behuda sarf qildingiz. universitetda vaqt, chunki bunday ish uchun kurslarni tugatish yoki o'zingiz bir nechta kirish kitoblarini o'qish kifoya.

Turli darajadagi murakkablikdagi ilovalarni yozish uchun, avvalo, buni qanday qilish kerakligi haqida bilimga ega bo'lishingiz kerak. Va algoritmlar va dasturlashning eng asoslaridan boshlash maqsadga muvofiqdir. Bu erda biz ular haqida maqola doirasida gaplashamiz.

Bu murakkab texnik fanning nomi bo'lib, uning vazifasi ma'lumotlardan foydalangan holda ma'lumotlarni yaratish, qayta ishlash, uzatish, saqlash va ko'paytirish usullarini tizimlashtirishdir.U shuningdek, maqsadga erishishga yordam beradigan ishlash tamoyillari va boshqaruv usullarini o'z ichiga oladi. “Informatika” atamasining oʻzi fransuz tilidan kelib chiqqan boʻlib, “axborot” va “avtomatlashtirish” soʻzlarining gibrididir. Bu ma'lumotlarni to'plash, qayta ishlash va uzatishning yangi texnologiyalarini ishlab chiqish va tarqatish tufayli paydo bo'ldi, bu ularni kompyuter tashuvchilarida mahkamlash bilan bog'liq edi. Bu kompyuter fanining kelib chiqishi. Algoritmlash va dasturlash asoslari ushbu fanning eng muhim sohalaridan biridir.

U nima ish qiladi?

Informatika quyidagi vazifalarni bajaradi:

  1. Kompyuter texnikasi va dasturiy ta'minotini qo'llab-quvvatlash.
  2. Inson va kompyuter komponentlarining bir-biri bilan o'zaro ta'sirini ta'minlash vositalari.

"Interfeys" atamasi ko'pincha texnik qismga murojaat qilish uchun ishlatiladi. Bu erda bizda bepul dastur mavjud. Algoritmlash va dasturlash asoslari har doim ommaviy tarqatish mahsulotlarini yaratishda qo'llaniladi, ular keng auditoriyani "yutishi kerak". Darhaqiqat, mashhurlik uchun ishlab chiqilgan dastur ishlashi va optimal ko'rinishi kerak.

Algoritm taqdimoti

Ular sezilarli darajada yozilishi mumkin. Eng mashhurlari quyidagilardir:

  1. Og'zaki va formulali tavsif. Bu barcha individual holatlarda o'zaro ta'sir xususiyatlarini tushuntirib beradigan matn va aniq formulalarni joylashtirishni nazarda tutadi.
  2. Blok diagrammasi. Bu dasturning o'zida va boshqa ilovalar yoki kompyuterning apparat komponenti bilan o'zaro ta'sirining o'ziga xos xususiyatlarini tushunishga imkon beradigan grafik belgilar mavjudligini nazarda tutadi. Ularning har biri alohida funktsiya, protsedura yoki formula uchun javobgar bo'lishi mumkin.
  3. Bu aniq holatlar uchun tavsiflashning alohida usullarini yaratishni nazarda tutadi, ular vazifalarning xususiyatlari va ketma-ketligini ko'rsatadi.
  4. Operator sxemalari. Bu prototip yaratishni nazarda tutadi - u alohida operandlar bosib o'tadigan yo'llar asosida o'zaro ta'sirni ko'rsatadi.

Psevdokod. Dasturning asosiy qismining eskizi.

Algoritm yozuvi

Dastur, funksiya yoki protseduraning o'z prototipini yaratishni qanday boshlash kerak? Buning uchun quyidagi umumiy tavsiyalardan foydalanish kifoya:

  1. Har bir algoritm uning ma'nosini tushuntiruvchi o'z nomiga ega bo'lishi kerak.
  2. Boshlanish va oxirning mavjudligiga ishonch hosil qiling.
  3. Kirish va chiqish ma'lumotlarini tavsiflash kerak.
  4. Muayyan ma'lumotlar bo'yicha muayyan harakatlar amalga oshiriladigan buyruqlarni belgilashingiz kerak.

Yozib olish usullari

Algoritm ko'rinishlari beshtagacha bo'lishi mumkin. Ammo yozishning faqat ikkita usuli bor:

  1. Rasmiy va og'zaki. Bu tavsifning asosan formulalar va so'zlar yordamida amalga oshirilishi bilan tavsiflanadi. Mazmuni, shuningdek, bu holda algoritm bosqichlarini bajarish ketma-ketligi har qanday shaklda tabiiy kasbiy tilda yoziladi.
  2. Grafika. Eng keng tarqalgan. U blokli belgilar yoki algoritm sxemalaridan foydalanadi. Ularning orasidagi aloqa maxsus chiziqlar yordamida ko'rsatiladi.

Biz dasturiy ta'minot tuzilmasini ishlab chiqamiz

Uchta asosiy tur mavjud:

  1. Chiziqli. Ushbu tuzilma bilan barcha harakatlar navbat bilan ketma-ket va faqat bir marta amalga oshiriladi. Diagramma bajarilish tartibiga qarab yuqoridan pastgacha joylashtirilgan bloklar ketma-ketligiga o'xshaydi. Qabul qilingan birlamchi va oraliq ma'lumotlar hisoblash jarayonining yo'nalishiga ta'sir qila olmaydi.
  2. Tarmoqlanish. Amalda, murakkab muammolarni hal qilishda keng qo'llanilishi topildi. Shunday qilib, agar dastlabki shartlarni yoki oraliq natijalarni hisobga olish zarur bo'lsa, unda kerakli hisob-kitoblar ularga muvofiq amalga oshiriladi va olingan natijaga qarab hisoblash jarayonining yo'nalishi o'zgarishi mumkin.

Tsiklik. Ko'p vazifalar bilan ishlashni osonlashtirish uchun dastur kodining ba'zi qismlarini ko'p marta takrorlash mantiqan. Qancha marta va nima qilish kerakligini belgilamaslik uchun tsiklik tuzilmadan foydalaning. U berilgan shart bajarilgunga qadar takrorlanadigan buyruqlar ketma-ketligini ta'minlaydi. Looplardan foydalanish dastur yozishning murakkabligini sezilarli darajada kamaytirishi mumkin.

Dasturlash

Qaysi dasturlarda yaratilishi muhim. Shuni ta'kidlash kerakki, ularning ko'pchiligi muayyan ish sharoitlari uchun (masalan, brauzerda) "o'tkirlashgan". Umuman olganda, dasturlash tillari ikki guruhga bo'linadi:

  1. Funktsional.
  2. Operator:

Protsessual emas;

Protsessual.

Ulardan qaysi biri tez-tez ishlatilishini taxmin qila olasizmi? Operator-protsessual javob. Ular mashinaga yo'naltirilgan yoki mustaqil bo'lishi mumkin. Birinchisiga assemblerlar, avtokodlar, ramziy kodlash kiradi. Mustaqillar o'z yo'nalishi bo'yicha quyidagilarga bo'linadi:

  • protsessual;
  • muammoli;
  • ob'ekt.

Ularning har biri o'z doirasiga ega. Ammo dasturlarni yozish uchun (foydali ilovalar yoki o'yinlar) ko'pincha ob'ektga yo'naltirilgan tillar qo'llaniladi. Albatta, siz boshqalardan foydalanishingiz mumkin, ammo haqiqat shundaki, ular omma uchun yakuniy iste'mol mahsulotlarini yaratish uchun eng rivojlangan. Ha, va agar siz qaerdan boshlash haqida aniq tasavvurga ega bo'lmasangiz, men sizga algoritmlash va ob'ektga yo'naltirilgan dasturlash asoslariga e'tibor berishingizni maslahat beraman. Endi bu juda mashhur yo'nalish bo'lib, unda siz ko'plab o'quv materiallarini topishingiz mumkin. Umuman olganda, algoritmlashtirish va dasturlash tillarining asoslari hozir malakali ishlab chiquvchilarning etishmasligi tufayli kerak bo'lib, ularning ahamiyati kelajakda o'sib boradi.

Xulosa

Algoritmlar bilan (va keyinchalik dasturlar bilan) ishlaganda, eng kichikigacha barcha tafsilotlarni o'ylab ko'rishga harakat qilish kerak. Keyinchalik, kodning har bir ishlanmagan bo'limining identifikatsiyasi faqat qo'shimcha ishlarga, ishlab chiqish xarajatlarining ko'payishiga va vazifani bajarish muddatiga olib keladi. Barcha nuanslarni puxta rejalashtirish va ishlab chiqish vaqt, kuch va pulni sezilarli darajada tejaydi. Xo'sh, endi ular aytishlari mumkinki, ushbu maqolani o'qib chiqqandan so'ng sizda algoritmlar va dasturlash asoslari haqida tushuncha bor. Bu bilimlarni qo'llash uchungina qoladi. Agar siz mavzuni batafsil o'rganmoqchi bo'lsangiz, men "Algoritmlash va dasturlash asoslari" (Semakin, Shestakov) 2012 kitobini tavsiya qilishim mumkin.