Капотты ашамыз: бұл серияны қалай оқу керек.
Серияның ашылуы белгілеу жүйесін орнатады: жад кестесі, жазба денесі, қадамдық көрініс, Go мысалдары — әр мақала үш бірдей сұраққа жауап береді: дерек қайда, көрсеткіш кімге нұсқайды, құн қайда жұмсалады.
Контейнер класын қолдана білу — деректер құрылымын түсіну деген сөз емес. append-ті бәрі шақыра алады, бірақ ол қашан бір-ақ қадам, ал қашан бүкіл массивті көшіріп тынады — жауабы API құжатында емес, жадта жатыр. Бұл серияда әр мақала бір құрылымды алып, капоттың астына дейін ашады: операция тізімін жаттамаймыз, ұяшықтар мен көрсеткіштерді сызып шығамыз — әр құнның қайдан шыққанын көзбен көрсетеміз.
Үш өзекті сұрақ.
Мұнда әр құрылым бірдей тергеуден өтеді — он бес мақалаға ортақ үш сұрақ:
- Дерек қайда
- Ол жадтың қай ұяшықтарын алып жатыр: қатар тізілген бір қатар ма, әлде көрсеткіштер арқылы бірін-бірі табатын шашыраңқы ұяшықтар ма? Осы бір таңдау кездейсоқ қатынауды, cache сәттілігін және көшіру құнын шешеді.
- Көрсеткіш кімге нұсқайды
- Әр көрсеткіш ұяшығында кімнің мекенжайы жатыр? Қосу, өшіру, өзгерту дегеніңіз түбінде бірнеше көрсеткішті қайта жазу — ал ретін шатастырсаңыз, тізбек жарты жолда үзіледі.
- Құн қайда жұмсалады
- Әр операция ұяшықтардың үстінен неше қадам жүреді? Қадам саны көлеммен бірге қалай өседі? Жауап саналады, жатталмайды — керек жерінде өлшеумен түйінделеді.
Бір белгілеу жүйесі.
Осы үш сұраққа жауап беру үшін бүкіл серияға ортақ бір белгілеу жүйесі қызмет етеді. Бұл әшекей емес: суреттегі әр нүкте, әр бағыттауыш — жадта шын бар нәрсенің бейнесі:
- —Жад кестесі: мекенжай бір баған, айнымалы бір баған, дерек бір баған. Ұяшықтың өз нөмірі сұр, ұяшықтың ішінде жатқан нөмір жасыл — көрсеткіште ешқандай сиқыр жоқ, мекенжай да дерек.
- —Жазба денесі: құрылым (struct) жадтағы қалпында сызылады. Бір ұяшық —
Valмәні, бір ұяшық —Nextкөрсеткіші, ана жасыл нүкте — көрсеткіштің тап өзі; соңында nil сызығы; head, cur дегендер — мекенжай салынған айнымалы қораптар. - —Қадамдық көрініс: процесс баяндаумен емес, қозғалыспен көрсетіледі. Түйіндер кадрдан кадрға өз басын сақтайды, тізбек өзгерсе жаңа орнына жылжып барады — ырғақ өз қолыңызда: ← → пернелерімен қадамдаңыз, не өзі жүріп шықсын:
Жазба денесі көріністе тірілді: бір ұяшық — мән, бір ұяшық — көрсеткіш, head — ішінде 0xC000 жатқан айнымалы қорап.
- Жазба денесі көріністе тірілді: бір ұяшық — мән, бір ұяшық — көрсеткіш, head — ішінде 0xC000 жатқан айнымалы қорап.
- Қызғылт сары түс әрқашан тек осы кадрдың жалғыз фокусына беріледі — бұл кадрда 11-дің Next ұяшығындағы 0xC010-ды бақылаңыз.
- Құрылым өзгерді — түйіндер қозғалады: 23 тізбектен шығып түбіне түсті, 11 енді соңғы түйін, оның Next ұяшығына nil сызығы қойылды.
- —Go коды: мысалдардың тілі — Go, себебі біреу-ақ: көрсеткіштер айқын жазылады.
*Nodeменnil— суреттегінің дәл өзі, сурет пен код арасында аударма шығыны жоқ. Бұл Go оқулығы емес: C әулетінің кез келген тілін оқи алсаңыз, мұндағы кодты да оқисыз. Тағы бір кілт сөйлемді осында қалдырамын, көрсеткіштер мақаласы сонымен құлып ашады: Go-да меншіктеу мен параметр берудің бір-ақ түрі бар — ұяшықтағы дерек көшіріледі; көшірілгені мән бе, мекенжай ма — нені өзгерте алатыныңыз соған байланысты.
type Node struct {
Val int
Next *Node
}Қалай оқу керек.
Он бес мақала тәуелділік ретімен тізілген, бірі-біріне алдын ала белгі тастап отырады: Іргетас (күрделілік, көрсеткіштер) → Сызықтық (массив пен кесінді, байланысқан тізім, қос бағытты тізім, стек пен кезек) → Рекурсия мен ағаштар (рекурсия, ағаш пен BST, аралау, теңгерімді ағаштар, үйме) → Хеш пен граф (хеш-кесте, граф) → Түйін (сұрыптау — бүкіл серия бір мәселенің басында тоғысады). Ретімен оқыған тиімдірек; жеке мақала да өз алдына оқылады — алдыңғы қорытындыға сүйенген жер артқа сілтеме беріп отырады.
Серияның қазақша нұсқасы бірте-бірте жарияланады: мақалалар шыққан сайын жол картасындағы атаулар басылатын сілтемеге айналады.
Әр мақаланың ырғағы бірдей: алдымен құрылым сызылады, сосын операциялар көріністе қозғалады, соңында код түседі — төрелік керек жерде сөз өлшеуге беріледі. Суреттерді үлкейтуге, көріністі қадамдауға болады; баспа мен ЖИ-оқырман нұсқасы бір стоп-кадр емес, кадрлардың толық тізімін алады.
Капот ашылды — келесі мақала «қадам санаудан» басталады.
— Талқылау
GitHubТүсініктемелер.
Түсініктемелер GitHub Discussions негізінде жұмыс істейді. Әңгімені мақала мазмұны төңірегінде өрбітіп, ұстамды әрі ізетті болыңыз.
Түсініктемелер әзірге жүктелмеді. Кейінірек бетті жаңартып көріңіз немесе талқылауға тікелей GitHub Discussions бетінде қатысыңыз.