Alqoritm

Bloga “Alqoritm” bölməsi əlavə etdim və ilk kitablarımı aldım

alqoritm
Written by Mushfiq Mammadov

Başlıqdan da göründüyü kimi bloga alqoritmlə bağlı bölmə əlavə etdim. Alqoritm mövzusu elə bir mövzudur ki, bunu dərindən öyrənmək üçün ikinci ali təhsil belə almaq istəyərəm. Hərdən facebook qruplarda alqoritmlə bağlı dərs tapşırıqlarını paylaşan tələbələr görəndə yaxşı mənada onlara qibtə edirəm. Deyirəm kaş mənim də 18-20 yaşlarım olardı, işim-gücüm də ancaq belə tapşırıqları etmək olaydı. Çünki çox qısa bir müddət HackerRank`da alqoritmlərlə məşğul olmuşdum, böyük avantajlarını hiss etmişdim, qısaca saysaq:

  • alqoritmik vərdişlər formalaşır;
  • məşğul olduğunuz proqramlaşdırma dilinin sintaksisinin daha yaxşı mənimsənilməsi ilə bağlı böyük faydası dəyir;
  • tapşırıqdan irəli gələn məsələlərdən dolayı proqramlaşdırma dilinin sizə görə yeni olan imkanlarının kəşf edilməsi ilə bağlı şərait yaranır;
  • cari tapşırığın digər istifadəçilər tərəfindən edilmiş alternativ həll variantlarını özünüzünkü ilə müqayisə etməklə həmin məsələ üçün daha qısa, optimal, performanslı kodun necə olacağı ilə bağlı bilgilər, yanaşmalar formalaşır və s.

HackerRank`da qarşıma sadə bir məsələ çıxmışdı. Deməli kvadrat matris verilib və matrisin diaqonallarında yerləşən elementlərinin cəminin (hər diaqonal ayrı-ayrı cəmlənir) bir-biri ilə fərqinin mütləq qiymətini tapmaq tələb olunurdu. İlk növbədə diaqonalda yerləşən elementləri tapmaq lazım idi. Bu matrisi ikiölçülü massiv kimi təsəvvür etsək, indeksləri bir-birinə bərabər olan elementlər ([0][0], [1][1], …,[n-1][n-1]) birinci diaqonala düşür, bu sadə qanunauyğunluqdur. Amma ikinci diaqonala düşən elementləri aşkar etmək üçün bir qanunauyğunluq tapdım və dövrdən istifadə edərək, dövr elementlərinin artma və azaltma əməliyyatlarına uyğun təyin etdim. Ancaq sonradan iş yoldaşımdan öyrəndim ki, ikinci diaqonala düşən elementləri təyin etmək üçün çox sadə riyazi qanunauyğunluq var: indekslərin cəmi matrisin ölçüsündən bir vahid kiçikdirsə, o zaman həmin element ikinci diaqonala düşür:

  •  [i][j]  -->  (i+j) == (n-1)

Bu bir növü məntiq məsələlərini xatırlatdı. Yadıma gəlir magistr imtahanına hazırlaşanda hərfli məntiq məsələləri var idi, çətin gəlirdi, ümumiyyətlə heç baxmırdıq. Amma sonradan öyrəndik ki, çox sadə yanaşması və həll metodu var. Onu öyrəndikdən sonra həmin tipli suallar artıq asan suallar sayılırdı bizim üçün. Alqoritm də bir növü elə gəldi mənə, ən azından sadə qanunauyğunluqları bilmək üçün bir müddət məşğul olub praktik vərdişlər formalaşdırmaq lazımdır.

 

Bəs alqoritm bilmədən proqram yazmaq mümkün deyil mi?

Bu məsələ ilə bağlı fikirlər fərqlidir. Əslində biz proqram yazarkən onun içərisində konkret olaraq ad qoymasaq da zaman-zaman alqoritmlərdən istifadə edirik. Adicə websaytda hazırladığımız “pagination”nın özü üçün belə müəyyən bir alqoritm qururuq. Bəs alqoritmlərlə bağlı fundamental nəzəri biliklər olmadan proqram yazmaq mümkün deyilmi? Təbii ki, mümkündür. Proqramlaşdırma ilə məşğul olan, proqram yazan şəxslərin belə deyək alt yapısında artıq müəyyən alqoritm qurma bacarığı mövcud olur, kimisində az, kimisində çox. Misal üçün, öz təcrübəmdən deyə bilərəm ki, texniki təhsilim olmadığına görə alqoritm mövzularını görməmişəm, birbaşa Java proqramlaşdırma dilindən başlamışam. Amma indiyə kimi yazdığım proyektlərdə bununla bağlı hər hansı bir çətinlik yaşamamışam, qarşılaşdığım problemlərin pis-yaxşı öhdəsindən gəlmişəm. Daha dərin bir şey lazım olduqda isə mövcud kitabxanalardan istifadə etmişəm. Amma bu o demək deyil ki, alqoritmlə məşğul olmağa, öyrənməyə ehtiyac yoxdur. Qətiyyən! Alqoritmin vacibliyi ilə bağlı Adil Əliyevin müsahibəsində bir paraqraf oxumuşdum, çox xoşuma gəlmişdi və elə o vaxtdan beynimdə ilişib qalmışdı:

“…Məsələn, mobil tətbiqin yazılması indiki zamanda heç də çətin deyil, amma qarşıya tapşırıq qoyulanda ki, bu tətbiq mobil qurğunun (telefon, planşet və s.) batareyasına filan meyarlara görə qənaət etməlidir (batareya tez bitməsin deyə), internet trafikini filan limitdən çox istifadə etməməlidir (müştərini xərcə salmamaq üçün), filan imkanın icra vaxtı filan qədər millisaniyəni keçməməlidir (tətbiq bezdirici olmasın deyə), o zaman optimal alqoritmlər, əməliyyat sisteminin dərinlikləri, şəbəkənin necə işləməsi, riyaziyyat, optimallaşdırma və s. vacibliyi açıq-aydın görünür…”.

Sadə bir misal götürək. Tutaq ki, bizdən 1-dən 1000-dək ədədlərin cəmini tapmaq tələb olunur. Bir proqramçı kimi ilk olaraq ağıla gələn for dövründən istifadə etməklə bunu həll etməkdir:

  • int n = 1000, sum = 0;
    for (int i = 1; i <= n; i++) sum += i;

Koddan da göründüyü kimi cəmin hesablanması üçün təxminən 1000 toplama əməliyyatı gedir. Hər dəfə dövr şərtinin yoxlanılması, i-nin qiymətinin artırılması əməliyyatlarını də nəzərə alsaq baş verən əməliyyatların sayının əslində daha çox olduğunu görərik. Amma biz “Ədədi silsilə” barədə məlumatlı olsaq, bu cəmi sadəcə 4 əməliyyatın köməkliyi ilə tapa bilərik:

  • int n = 1000;
    int sum = (1 + n) * n / 2;

Bu kodun digər avantajı isə odur ki, n-nin qiymətinin artması əməliyyatların sayına təsir göstərmir. Amma dövr ilə bunu etdikdə əməliyyatların sayı n-nin qiymətinə müvafiq olaraq artır. Və buradan da aşkar görünür ki, bəzi mövcud riyazi qanunauyğunluqları və alqoritmləri bilməklə performans baxımından xeyli irəli düşmək mümkündür.

 

İlk kitablarımı aldım

Alqoritmlə bağlı son olaraq etdiyim tapşırıqların birindən sonra alqoritmlə bağlı fundamental nəzəri bilikləri öyrənmək və müəyyən praktik vərdişlər qazanmaq üçün bu mövzuya müəyyən bir zaman ayırmaqla bağlı qərar qəbul etdim. Səbəb nə idi? Əslində verilən alqoritmi etmişdim və yoxlamışdım, verilən tələbləri tam olaraq ödəyirdi. Amma yenə də iki çatışmazlıq hiss etdim:

  1. Alqoritmi tapmağa çox zaman sərf etdim. Fikirləşirəm ki, əgər mövcud yanaşma və üsulları bilsəydim, ola bilsin daha qısa müddətə və daha rahat şəkildə edə bilərdim;
  2. Başa düşdüm ki, alqoritmin, tapşırıqda istənilən bütün tələbləri ödəməsi heç də hər şey demək deyil. Təklif edilən həll variantı optimal həll variantına nisbətən də olsa yaxın olmalıdır. Məsələn, ola bilər ki, alqoritmi qurmaq üçün 4 dövrdən istifadə etmisiniz, halbuki onu 1 dövr ilə də etmək mümkündür.

Kitab olaraq isə seçimim aşağıdakı iki kitab oldu:

  1. “Bilişim Matematiği”, Rifat Çölkesen
  2. “Algoritmalara Giriş” (türkcəyə tərcümə)

alqoritm-kitablarim

Yuxarıda qeyd etdiyim ədədi silsilə ilə bağlı nümunəyə birinci kitabda “Bölüm 1”-də də rastladım, motivasiya mövzusu olaraq verilmişdi. İkinci kitab isə əsas müəlliflərindən biri CORMEN olan məşhur alqoritm kitabının türkcəyə tərcüməsidir. Orijinal kitabdan oxumaq daha yaxşı olardı, amma onun qiyməti bundan təxminən 4-5 dəfə baha gəlib çıxırdı 🙂 Bir neçə nəfərin tərcümənin keyfiyyətli olması ilə bağlı qeydlərini gördüm, ona görə bunu almaq qərarına gəldim.

Kitabları ötəri vərəqləmişəm, izahlarda inteqral, limit, loqarifma, kombinezon, sin, cos, çoxluqlardan tutmuş, elmə məlum olan, amma hələ ki, mənə məlum olmayan bir çox riyazi işarələr var 😀 Mən bu kitabları bədii ədəbiyyat kimi gecələr yatmazdan əvvəl oxumağı planlaşdırırdım, amma içinə göz atandan sonra gördüm ki, fikirləşdiyim qədər asan olmayacaq 🙂

Daha yaxşı olar ki, alqoritm mövzusu web proqramlaşdırmaya başlayana kimi bitirilmiş olsun, çünki web`də proqram yazdıqdan sonra alqoritm mövzusuna qayıtmaq çox sıxıcı ola bilər. Öz timsalımda görmüşəm ki, sırf alqoritmlə məşğul olanda adam daha çox gərgin olur, bəzən istədiyin şeyi tapa bilməyəndə isə əməlli demotivasiya, stress, aqressiya yaranır 😀 Çalışıb bu mövzunun başını daha erkən yaşlarda bağlamaq lazımdır, 30-lu yaşlarda texnologiya öyrənməyə yoğunlaşmaq əvəzinə alqoritm öyrənmək əlavə əziyyətdir. Amma bir məsələ də var ki, əgər həvəsiniz varsa və mənimsəmə qabiliyyətiniz yaxşıdırsa, işlədiyiniz şirkətdə istifadə olunan və yaxud hər hansı bir yeni texnologiyanı ilkin istiqamət, göstərişlər almaqla və yaxud sərbəst şəkildə öyrənə bilərsiniz. Amma vaxtında öyrənməmisinizsə alqoritmin fundamental əsaslarını sizə kimsə öyrətməyəcək, işin gedişində də sizdən bunları kimsə tələb etməyəcək. Ancaq öz təşəbbüsünüzlə öyrənsəniz öyrənəcəksiniz, yoxsa ki, qalacaq. “Heç olmamağındansa, gec olmağı yaxşıdır” məsəlindən yola çıxaraq fikirləşirəm ki, heç olmasa bir dəfə də olsa oxumaq lazımdır, dərindən bilgi olmasa belə adi təsəvvürün özü belə çox faydalıdır. Çünki təsəvvür də bilgi qədər önəmlidir, ideya formalaşdırır. Hər hansı bir məsələni həll etmək lazım gəldikdə, problemlə üzləşdikdə artıq təsəvvür olaraq xatırlayırsan ki, buna hansı üsul, metod ilə yanaşmaq olar və ən azından nəyi axtarmalı, nəyi araşdırmalı olduğunu bilirsən.

Allah səbr və enerji versin bu kitabların axırına çıxa bilim İnşallah, bel ağrıları da mərdiməzarlıq etməsə təbii ki. Kitabları bitirdikdən sonra məsələ və problemlərə yanaşmamın hansı formada dəyişəcəyi özüm üçün də maraqlıdır. Kitabda rastıma çıxan maraqlı məqamları vaxt olduqca bu bölmə altında paylaşmağa çalışacam. Həmçinin də intervülərdə alqoritmlə bağlı mənə verilən tapşırıqları da bu bölmədə qeyd edəcəm İnşallah.

Sonda isə fərqində olmadan yaza biləcəyim doğru-yanlış fikirlərə görə Sizlərin üzürünə sığınıram 🙂 Razılaşdığınız yaxud razılaşmadığınız məqamları, həmçinin tövsiyələriniz olarsa, çəkinmədən komment bölümündə qeyd edə bilərsiniz.

About the author

Mushfiq Mammadov

5 Comments

    • Salam. Hələ ki, birinci kitabın 4-cü bölümündəyəm. Bəyənmədiyim bir-iki nüans var, amma ümumi olaraq normaldır. Kitab haqqında yekun fikirlərimi oxuyub bitirdikdən sonra qeyd edəcəm İnşallah. Necə əldə etməyə gəlincə isə 2-ci kitabı iş yoldaşım Türkiyədə olarkən xahiş etmişdim o alıb gətirmişdi. 1-ci kitabı isə Türkiyədə mağazalarda tapa bilmədiyi üçün online olaraq mover.az vasitəsilə sifariş etmişdim və 6 günə gətirmişdilər.

    • Salam. Kitab ortalarına qədər normal idi, amma ortadan sonra bir neçə elementar və ciddi xətalarla qarşılaşdım. Bir neçə dəfə oldu ki, nümunələri başa düşmək üçün xeyli zaman sərf elədim, amma sonra başa düşdüm ki, nümunədə xəta var imiş. Mündəricat olaraq çox faydalı kitabdır, amma məndə elə təsir bağışladı ki, kitab hələ çiydir, yazılıb amma sonradan yaxşı “reviziya” olunmayıb.
      Amma soruşsanız ki, faydası dəydimi? Bəli, həddindən çox. Məqalədə adı keçən 2-ci – “Algoritmalara Giriş” kitabını oxumağa başlayanda başa düşdüm ki, bu kitabın çox faydası dəyib, onu oxumasaydım mənə daha çətin olardı.

Leave a Comment

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.