Learning path • 0 video courses • 25 total modules (12)
Bu giriş dərsi proqramlaşdırmanın "onurğa sütunu" olan alqoritmlərin nə olduğunu və onların proqramlaşdırma dillərindən necə müstəqil şəkildə mövcud olduğunu izah edir. Siz burada hər hansı bir problemi həll etmək üçün mürəkkəb prosesləri necə kiçik, məntiqli addımlara bölməyi öyrənəcəksiniz. Dərs həmçinin verilənlər strukturları ilə alqoritmlər arasındakı ayrılmaz əlaqəni göstərərək, gələcək dərslər üçün möhkəm təməl yaradır.
Bu dərsdə biz məlumatın abstrakt anlayışdan fiziki reallığa necə çevrildiyini araşdırırıq. İnsan dilindəki sözlərin kompüter yaddaşında cəmi iki simvolla (0 və 1) necə ifadə olunduğunu və bu sadəliyin arxasındakı böyük məntiqi öyrənirik. Həmçinin, tranzistorların elektrik siqnalları vasitəsilə bu rəqəmləri necə "həyata keçirdiyini" görərək rəqəmsal dünyanın təməlini kəşf edirik.
Bu dərsdə biz gündəlik istifadə etdiyimiz onluq say sistemi ilə kompüterlərin təməl dili olan ikilik (binary) sistemi arasındakı riyazi körpünü qururuq. Məlumatın "xanalar" məntiqi ilə necə artdığını və hər bir xananın əslində bir gücü (qüvvəti) necə təmsil etdiyini kəşf edirik. Öyrəndiyimiz çevirmə üsulları sayəsində proqramlaşdırmanın ən fundamental hesablamalarını həyata keçirməyi mənimsəyirik.
Bu dərsdə biz binary kodların (0 və 1) yalnız riyazi hesablamalar üçün olmadığını, onların eyni zamanda müxtəlif simvolları təmsil edən bir "kod dili" olduğunu öyrənirik. "Yüz" sözü nümunəsi ilə kontekst anlayışını qavrayaraq, kompüterin eyni binary ardıcıllığını (məsələn: 1000001) vəziyyətdən asılı olaraq həm 65 rəqəmi, həm də "A" hərfini kimi necə başa düşdüyünü kəşf edirik. Bu, rəqəmsal dünyada məlumatın interpretasiya edilməsinin təməlidir.
Bu dərsdə kompüter yaddaşının ən kiçik vahidi olan "Bit" anlayışını və qutuların sayını artıraraq ehtimalları necə çoxaltdığımızı öyrənirik. 8 bitin birləşərək yaratdığı "Bayt" (Byte) termininin arxasındakı sadə məntiqi və bu vahidin müxtəlif dillər üçün niyə bəzən yetərsiz qaldığını kəşf edirik. Sonda isə bir neçə baytı yan-yana qoyaraq milyonlarla simvolu və nəhəng rəqəmləri (Integer) necə ifadə etdiyimizi görərək verilənlər strukturlarına keçid üçün zəmin hazırlayırıq.
Bu dərsdə biz mürəkkəb bir problemi onun daha kiçik versiyalarına bölərək həll etməyi nəzərdə tutan rekursiya metodunu öyrənirik. "İç-içə qutular" bənzətməsi ilə bu strukturun vizual məntiqini qavrayır, riyazi faktorial nümunəsi ilə onun kod tərəfində necə canlandığını görürük. Dərs həmçinin rekursiv funksiyaların ən kritik hissəsi olan "durma nöqtəsini" izah edərək, proqramın sonsuz dövrə düşməsinin qarşısını necə alacağımızı göstərir.
Bu dərsdə biz məlumatların toplu halda saxlanması üçün ən fundamental struktur olan massivləri (Array) öyrənirik. Massivlərin yaddaşda mütləq "yan-yana" yerləşmə prinsipini və bu prinsipin gətirdiyi sürət üstünlüklərini "Sinema Salonu" bənzətməsi ilə kəşf edirik. Eyni zamanda, yaddaş israfı və yeni element əlavə edərkən yaranan çətinliklər kimi kritik çatışmazlıqları təhlil edərək, düzgün struktur seçiminin əhəmiyyətini dərk edirik.
Bu dərsdə biz massivlərin ən böyük problemi olan "yaddaşda məcburi köçürülmə" məşəqqətindən necə xilas olacağımızı öyrənirik. Linked List məntiqi ilə məlumatları yaddaşın müxtəlif yerlərində sərbəst şəkildə saxlayır, lakin onları bir-birinə görünməz "zəncirlərlə" bağlayırıq. Bu, bizə milyonlarla məlumatı yerindən tərpətmədən, siyahıya yeni bir elementi saniyələr içində əlavə etmək azadlığı verir.
Bu dərsdə biz indiyə qədər öyrəndiyimiz iki təməl verilənlər strukturunu yan-yana qoyaraq onların "güc balansını" təhlil edirik. Məlumatın yaddaşdakı fiziki düzülüşünün oxuma sürətinə, yaddaş israfına və redaktə (əlavə etmə/silmə) çevikliyinə necə təsir etdiyini real ssenarilər üzərindən öyrənirik. Sonda isə hansı vəziyyətdə hansı strukturun "qalib" gəldiyini müəyyən edən qərar vermə meyarlarını mənimsəyirik.
Bu dərsdə biz massiv və əlaqəli siyahıların üzərində qurulan, lakin özünəməxsus sərt qaydaları olan Stack (Yığın) strukturunu araşdırırıq. "Çirkli qablar" analogiyası vasitəsilə LIFO (Last In, First Out) prinsipinin necə işlədiyini və məlumatın niyə yalnız bir nöqtədən (təpədən) idarə olunduğunu öyrənirik. Həmçinin, proqramlaşdırma dünyasının təməl terminləri olan Push və Pop əməliyyatlarını mənimsəyərək, verilənlərin ardıcıl idarəetmə məntiqini qavrayırıq.
Bu dərsdə biz "ilk gələnə ilk xidmət" prinsipi ilə işləyən Queue (Növbə) strukturunu və onun proqramlaşdırmadakı əhəmiyyətini öyrənirik. FIFO (First In, First Out) məntiqini Stack-in LIFO prinsipi ilə müqayisə edərək, bu iki strukturun təməl fərqlərini aydınlaşdırırıq. Həmçinin, məlumatın bir tərəfdən əlavə edilib digər tərəfdən çıxarılması prosesini (Enqueue və Dequeue) real həyat nümunələri ilə analiz edirik.
Bu dərsdə biz axtarış prosesini ləngidən bütün maneələri aradan qaldıran Hash Table strukturuna giriş edirik. "Kafe menyusu" nümunəsi ilə bizə indeks yox, söz (etiket) verildiyi halda massivlərin sürətli erişim gücündən necə istifadə edəcəyimizi öyrənirik. Hash funksiyasının "sehrli" gücü ilə hər hansı bir sözü saniyələr içində yaddaşdakı dəqiq ünvanına necə çevirdiyimizi və Açar-Dəyər (Key-Value) məntiqini kəşf edirik.
Bu dərsdə biz Hash Table-ın beyni sayılan Hash funksiyasının hansı kriteriyalara cavab verməli olduğunu öyrənirik. Funksiyanın hər zaman eyni nəticəni verməsinin (sabitlik), hər məlumatı fərqli yerə yerləşdirməyə çalışmasının (unikallıq) və yaddaş sərhədlərini aşmamasının nə dərəcədə kritik olduğunu araşdırırıq. Sonda isə proqramlaşdırmanın qaçınılmaz reallığı olan "Toqquşma" (Collision) anlayışına giriş edirik.
Bu dərsdə biz Hash Table-ların qaçınılmaz reallığı olan "Toqquşma" (Collision) problemini və onun yarada biləcəyi data itkisini araşdırırıq. "Armud" və "Ananas" nümunəsi ilə eyni indeksə düşən məlumatların bir-birini silməməsi üçün Linked List (Zəncirləmə) metodunun necə xilaskar rolunda çıxış etdiyini öyrənirik. Həmçinin, bu həll yolunun axtarış sürətinə təsirini (trade-off) analiz edərək, ideal bir Hash Table balansını necə qurmalı olduğumuzu kəşf edirik.
Bu dərsdə biz bir problemi həll etmək üçün əlimizdə olan müxtəlif alqoritmlər arasında necə ədalətli seçim edəcəyimizi öyrənirik. Saniyələrin və ya proqramlaşdırma dillərinin subyektivliyindən uzaqlaşaraq, alqoritmləri hər bir kompüterdə keçərli ola biləcək universal bir tərəzidə — "Artım Sürəti" (Rate of Growth) metodu ilə çəkməyi kəşf edirik. Eyni zamanda, vaxt və yaddaşla yanaşı, insan əməyinin də bir resurs olduğunu nəzərə almağın əhəmiyyətini təhlil edirik.
Bu dərsdə alqoritmlərin hər zaman eyni sürətlə işləmədiyini, giriş verilənlərindən (input) asılı olaraq performansın necə köklü dəyişə biləcəyini öyrənirik. Sözlük nümunəsi ilə ən şanslı (Best) və ən bədbin (Worst) ssenarilər arasındakı fərqi vizuallaşdırır, real həyatda "orta halın" (Average) niyə daha mürəkkəb hesablandığını kəşf edirik. Sonda isə mühəndislərin niyə məhz ən pis ssenariyə odaklanaraq özlərini və sistemlərini sığortaladıqlarını başa düşürük.
Bu dərsdə biz alqoritmlərin performansını konkret rəqəmlərin (saniyələr və ya səhifə sayı) aldadıcılığından xilas edərək universal bir dilə — Big O notasiyasına keçiririk. Məlumatın həcmi (N) artdıqca zamanın necə dəyişdiyini riyazi olaraq necə ifadə edəcəyimizi və mürəkkəb tənlikləri "dominant faktor" məntiqi ilə necə sadələşdirəcəyimizi öyrənirik. Bu analiz sayəsində sən alqoritmin milyonlarla data qarşısındakı gələcək davranışını (ölçəklənə bilməsini) dəqiq proqnozlaşdıra biləcəksən.
Bu dərsdə biz sıralamanın sadəcə məlumatları nizamla düzmək deyil, həm də digər mürəkkəb alqoritmləri sürətləndirən bir "strateji silah" olduğunu öyrənirik. Dağınıq bir siyahıda iynə axtarmaqla, hər şeyin öz yerində olduğu sistemdə axtarış aparmaq arasındakı fərqi real ssenarilər üzərindən analiz edirik. Sıralamanın ən yaxın nöqtələri tapmaqda, təkrarlanan məlumatları təmizləməkdə və statistikanın təməli olan "mod" anlayışını hesablamaqda bizə necə vaxt qazandırdığını kəşf edirik.
Bu dərsdə biz sıralama alqoritmlərinin ən intuitiv formalarından biri olan Selection Sort-u (Seçərək sıralama) öyrənirik. Siyahıdakı ən kiçik elementi tapıb onu növbəti boş yerlə dəyişdirmək (swap) prinsipi ilə işləyən bu metod, alqoritmlərin zaman mürəkkəbliyini anlamaq üçün əla nümunədir. Biz həmçinin bu alqoritmin niyə "yerində" (in-place) sıralama hesab olunduğunu və yaddaşda necə qənaət etdiyini təhlil edirik.
Bu dərsdə biz sıralama əməliyyatını birbaşa deyil, problemi kiçik hissələrə bölərək həll edən Merge Sort alqoritmini öyrənirik. Sürətli alqoritmlərin böyük verilənlər qarşısında aciz qaldığı məqamda, "Böl və İdarə et" məntiqinin necə xilaskar olduğunu kəşf edirik. Biz burada təkcə bölməyi deyil, həm də iki sıralı siyahını minimum əməliyyatla necə peşəkarca birləşdirməyi (merging) mənimsəyirik.
Bu dərsdə biz sıralama alqoritmlərinin "sürət çempionu" sayılan Quick Sort-u və onun təməlində duran "Pivot" məntiqini öyrənirik. Bir dayaq nöqtəsi seçərək bütün siyahını onun ətrafında necə nizamlamağı və rekursiv olaraq problemləri necə kiçiltməyi kəşf edirik. Həmçinin, eyni Big O dərəcəsinə (O(nlogn)) sahib olmasına baxmayaraq, Quick Sort-un niyə Merge Sort-dan praktikada daha sürətli olduğunu texniki detallarla analiz edirik.
Bu dərsdə biz kompüter elmlərinin onurğa sütunlarından biri olan axtarış prosesinin mahiyyətini və bu gün niyə hər zamankından daha vacib olduğunu öyrənirik. Müasir dünyada datanın sürətlə artması (Big Data) qarşısında sadəcə məlumatı saxlamağın kifayət etmədiyini, ona saniyələr içində çatmağın həyati əhəmiyyətini analiz edirik. Dərs bizə axtarış alqoritmlərinin performansının proqram təminatının ümumi sürətinə necə təsir etdiyini göstərir.
Bu dərsdə biz axtarış alqoritmlərinin ən primitiv və intuitiv forması olan Linear Search-ü öyrənirik. Bu metodda biz hədəf məlumatı tapmaq üçün siyahının ən başından başlayaraq sona qədər hər bir elementi "gözdən keçirir" və bir-bir yoxlayırıq. Heç bir ilkin şərt (məsələn, siyahının sıralı olması) tələb etmədiyi üçün çox çevikdir, lakin məlumatların həcmi artdıqca səbrimizi sınağa çəkə bilər.
Bu dərsdə biz axtarış alqoritmlərinin ən effektiv növlərindən biri olan Binary Search-ü öyrənirik. Siyahının sıralı olması şərtindən istifadə edərək, hər addımda axtarış sahəsini necə yarıbayarı kiçiltdiyimizi və loqaritmik zaman mürəkkəbliyinə (O(logN)) necə nail olduğumuzu kəşf edirik. "Aşağı" (Low) və "Yuxarı" (High) göstəriciləri ilə yaddaş üzərində manevr etməyi öyrənərək, milyonlarla məlumatın içindən saniyənin mində biri qədər müddətdə hədəfi tapmağın sirrini mənimsəyirik.
Bu dərsdə biz həm sürətli axtarış, həm də sürətli əlavə etmə (insertion) imkanı verən Binary Search Tree strukturuna giriş edirik. Sıralı massivlərdə elementləri sürüşdürmək məcburiyyətindən xilas olaraq, məlumatları "Sol < Kök < Sağ" qaydası ilə necə nizamlayacağımızı öyrənirik. Həmçinin, ağacın formasının (balansının) performans üçün nə dərəcədə kritik olduğunu və O(logn) sürətini necə qoruyacağımızı analiz edirik.