Dastlab men bu proyektni dasturchi (software engineer) bo'lish uchun o'qish kerak bo'lgan mavzularning qisqacha ro'yxati sifatida yaratdim,
ammo bu proyekt bugun siz ko'rib turgan katta ro'yxatga aylandi. Ushbu o'quv rejasidan o'tib, men Amazon-ga dasturchi sifatida ishga yollandim!
Ehtimol, menga o'xshab o'qishingizga to'g'ri kelmaydi. Baribir sizga kerak bo'lgan hamma narsa shu yerda.
Bu erda keltirilgan narsalar sizni har qanday dasturiy ta'minot kompaniyalari, shu jumladan gigantlar: Amazon, Facebook, Google va Microsoft-da o'tkaziladigan texnik suhbatga yaxshi tayyorlaydi.
Bu mening web dasturchisi (web developer) darajasidan katta kompaniyada ishlaydigan dastur injineri (software engineer) darajasiga chiqish uchun qilgan ko'p oylik o'qish rejam.
Bu proyekt yangi dasturchi injinerlar uchun juda forydali. Va yana, oddiy programmistlikdan (masalan web yoki mobildan) dastur injinerlikka (dastur injinerlaridan computer science bilimlari talab qilinadi) o'tmoqchi bo'lganlar uchun foydali.
Agar sizda dasturchilik bo'yicha ko'p yillik tajribangiz bo'lsa, shuni bilingki: Google, Amazon, Facebook, va Microsoftga o'xshagan katta kompaniyalar dastur injinerlikni (software engineer) oddiy dasturchilikdan (software/web developer) farqli deb kuradi va ular computer science bilimini talab qiladi.
Agar siz reliability engineer yoki operations engineer bo'lmoqchi bo'lsangiz, unda siz ixtiyoriy ro'yxatdan ko'proq o'qing (tarmoq, xavfsizlik va boshqalar).
Ushbu loyihani boshlaganimda, men stack bilan heap-ni farqini bilmas edim,
Big-O ni nimaligini bilmas edim, tree-lar yoki graph-lar haqida hech qanday tushunchaga
ega emas edim. Agar tartiblash algoritmini (sorting) yozishni so'rashganda, aniq qovun tushirgan
bo'lar edim. Umrimda ishlatgan data strukturalarni hammasini tayyor holda ishlatganman
(built-in library) va ularning asosida nimalar yotishini umuman bilmas edim.
Juda ko'p kod yozgan bo'lsamda, lekin men hech qachon qandaydir data strukturani noldan yozmaganman
Bu uzoq vaqt talab qiladigan jarayon bo’lib, sizga bir necha oy kerak bo'lishi mumkin.
Agar siz allaqachon bu narsalarni ko'pini bilsangiz, bu resurslar sizni ko'p vaqtingizni olmaydi.
Qanday foydalanish kerak?
Quyida foydalanish qoidalari berilgan bo'lib, bosqichlarni yuqoridan pastga tartibda bajarishingiz kerak.
Men natijalarni kuzatish uchun vazifalar ro'yxatini o'z ichiga olgan Github markupidan foydalanmoqdaman.
Bu kabi elementlarni tekshirishingiz uchun yangi "branch" yarating, so'ngra shunchaki qavs ichiga x qo'shib, ro'yxat elementlarini belgilashingiz mumkin: [x]
Branch-ni o'zingizga fork qiling va quyidagi buyruqlarni ketma-ketlikda bajaring:
Ba'zi video darsliklarni faqat Coursera yoki EdX platformalari orqali ro'yxatdan o'tgan holda olish mumkin.
Ular MOOC (ommaviy ochiq onlayn kurs) deb nomlanadi.
Ba'zan darslar sessiyada bo'lmaganligi sababli siz bir necha oy kutishingizga to'g'ri keladi.
Bepul va har doim ham ochiq ommaviy manbalarni yaratishda o'z hissangizni qo'shishingizni xohlagan bo'lar edim.
Bu manbalar Youtube dagi video darsliklar ham bo'lishi mumkin. Masalan menga universitet
maruzalaridan foydalanish yoqadi.
100 dan ortiq ma'lumotlar tuzilmalari va algoritmlarga oid mashqlari bilan amaliy mashg'ulotlarni olib boring va sizni intervyu jarayoniga tayyorlanishingizga yordam beradigan maxsus mentordan ko'rsatma oling.
Ko'pincha orzuyingizdagi ish joyiga intervyudan o'tishingizda faqat texnik salohiyatingiz emas balki o'zingizni qanday tuta olishingiz, xulqingiz ham katta ahamiyatga ega.
Intervyu uchun bitta dasturlash tilini tanlang
Intervyuning kodlash qismini bajarish uchun o'zingizga qulay bo'lgan dasturlash tilidan foydalanishingiz mumkin,
lekin yirik kompaniyalar quyida berilgan tillarning biridan foydalanishni talab qilishlari mumkin:
C++
Java
Python
Shuningdek quyidagilarni ham ishlatishingiz mumkin:
** Yuqorida aytilganidek siz intervyu uchun bitta dasturlash tilini tanlashingiz kerak **
Mening tilga oid tavsiyalarim. Menda barcha tillar uchun resurslar yo'q shuning uchun sizda qo'shimcha ma'lumot bo'lsa
tavsiya qilishingiz mumkin.
Agar siz bulardan birini o'qib chiqsangiz, masalalarni yechishda kerak bo'lgan barcha data strukturalar
va algoritmlari bo'yicha bilimlarga ega bo'lishingiz kerak.
** Loyihadagi video resurslarni o'tkazib yuborishingiz mumkin**, agar ko'rib chiqishni xohlamasangiz.
Mazkur ro'yxat bir necha oylar davomida shakllanganligi sababli biroz qo'ldan chiqdi.
Bu yerda men ba'zi yo'l qo'ygan xatoliklar bor, bu esa sizlarga yaxshiroq tajriba orttirishingizga yordam beradi.
1. Bularning barchasini eslab qolmaysiz
Men soatlab videolar ko'rardim va eslatmalar yozib qo'yar edim, va bir necha oydan so'ng hammasini eslab qola olmas edim.
Men yozib olgan eslatmalarim va fleshkartalarim yordamida takrorlab chiqishim uchun 3 kun sarfladim.
Men qilgan xatolarni siz ham takrorlamasligingiz uchun iltimos o'qib chiqing:
Menga tavsiya qilingan kurs (shaxsan o'zim ko'rib chiqmaganman): Learning how to Learn.
2. Fleshkartalar(kartochkalar) ishlating
Muammoni yechish uchun, men fleshkartalar uchun sayt yaratdim, u yerga 2 turdagi fleshkartalar joylanadi: umumiy eslatmalar va kod.
Har bir karta o'z formatiga ega.
Vebsaytdan telefon yoki tabletdan ham xoxlagan joyda foydalana olishim uchun mobilga moslangan sayt yaratdim.
Yodingizda bo'lsin, menda assembly language va Python triviyalaridan tortib, machine learning va statistikani
o'z ichiga olgan kartalarim bor. Bu esa talab qilinadigan narsalardan ham ko'p hisoblanadi.
(Ya'ni bularning barchasini siz bir vaqtda o'zlashtirgan bo'lishingiz shart emas)
Fleshkartalardagi eslatmalar : Birinchi marta fleshkartadagi javobni topa olganingizda uni o'zlashtirilganlar qatoriga qo'shmang. Aksincha xuddi shu kartani
ajratib qo'ying va bir necha marta javob bering toki haqiqatdan ham javobni anglab yetguningizgacha.
Takrorlash natijasida ma'lumot miyangizga chuqurroq joylashadi.
Fleshkartalar uchun bir necha marta menga tavsiya qilingan alternativ vebsayt Anki.
Bu sizning eslab qolishingizga yordam berish uchun takrorlash sistemasini ishlatadi.
Buni ishlatish qulay va barcha platformalarda mavjud va cloud bn sinxronizatsiya qilingan. iOS platformalari
uchun narxi $25, lekin boshqa platformalar uchun tekin.
3. Ma'lumotlar tuzilmalari va algoritmlarini o'rganish jarayonida coding intervyu savollariga javob topishni boshlang.
O'rganayotgan narsalaringizni masalalar yechishda qo'llab ketishingiz kerak,
aks holda o'rganganlaringizni tez unutishingiz mumkin.
Shaxsan menda shunday bo'lgan. Biror bir mavzuni masalan bog'langan ro'yxatlar (linked lists) ga oid mavzuni
o'rganganingizdan keyin agar o'zingizni shu mavzuda erkin
his qilishni boshlasangiz coding intervyu kitoblaridan linked list ga oid masala yechishga urinib ko'ring.
So'ng, keyingi mavzuga o'ting. Bir qancha vaqtdan keyin yana ortga qaytib linked listga yoki
rekursiyaga oid masala yeching. Asosiysi o'rganish jarayonida ko'proq masalalarni yechishda davom eting.
Sizni ishga bilimingiz uchun emas, bilimingizni qo'llay olishingiz uchun qabul qilishadi.
Men sizlarga tavsiya qiladigan kitoblar va saytlar bor.
Ko'proq ko'rish uchun havolaga o'ting:: Coding Question Practice.
4. Takrorlang, takrorlang va yana takrorlang
Menda ASCII, OSI stack, Big-O notations va boshqa mavzularda eslatma varaqlarim bor.
Ularni biroz bo'sh vaqtim bo'lganda o'rganaman.
Masalalar yechish jarayonida biroz tanaffus oling va o'zingizni fleshkartalaringizni takrorlab chiqing.
5. Diqqatingizni bir joyga jamlang
Atrofimizda juda ko'p narsalar bizni chalg'itib qo'yadi va qimmatli vaqtimizni oladi.
Shuningg uchun diqqatni jamlash va konsentratsiya qilish oson emas. Buning bir usuli,
matnsiz biron musiqa tinglang, bu esa diqqatingizni jamlashingizga yordam beradi.
Bu proyekt nimalarni o'z ichiga olmaydi
Bular keng tarqalgan texnologiyalar lekin bu proyekt ularni o'z ichiga olmaydi:
SQL
Javascript
HTML, CSS, va boshqa front-end texnologiyalar
Kunlik reja
Bazi mavzular bir kun oladi, va bazilariga bir necha kunlar kerak bo'ladi. Bazilari faqat o'rganish, kod yozish kerak emas.
Har kuni bitta mavzu olib, videolarini ko'rib, quyidagi tillarda kodda yozib chiqaman:
C - struct-lardan va struct * oladigan funksiyalarni ishlatgan holda
C++ - built-in tiplarni ishlatmagan holda
C++ - built-in tiplarni ishlatgan holda, masalan STL-ning std::list
Python - built-in tiplarni ishlatgan holda (Python-ni mashq qilish uchun)
va testlar yozgan holda (oddiy assert() ishlatib)
siz Java yoki boshqa tilda qilishingiz mumkin
Sizga bularni hammasi kerak emas. Intervyu uchun sizga faqat bitta til kerak.
Nega turlicha yozish kerak?
Mashq, mashq, mashq, ko'nglim ayniguncha. Shunda muammosiz tushimda ham qila olaman.
Pastgi darajada (low level) yoza olish uchun (masalan, garbage collection ishlatmagan holda)
Har kunlik ishda built-in tiplardan bemalol foydalana olish uchun (production-da array listni yoki linked listni boshidan yozib o'tirmaymanku)
Har bir mavzuni tepadagi tarzda o'qiyolmashim mumkin, lekin harakat qilaman.
Bu qisqacha kitob, lekin C ni sizga ancha o'rgatadi va agar ozgina mashq qilsangiz tezda mohir bo'lib ketasiz.
C ni tushunish dasturlar va xotira qanday ishlashini tushinishga yordam beradi
Massivlar va ko'rsatgichlar(pointerlar) yordamida kod yozishni mashq qiling va massivning index-iga
o'tish uchun indexing o'rniga pointer matematikasini ishlating.
Massivimiz elementlarini ushlab turadigan ichki (private) massiv
int massivni elementlarni saqlash uchun ishlatsak bo'ladi, faqat uning xususiyatlaridan foydalanmaslik kerak
16 dan boshlang, agar boshlanayotgan son kattaroq bo'lsa 2 ning darajalarini ishlating(2 - 16, 32, 64, 128)
size() - Massivdagi elementlar soni
capacity() - massiv o'z ichiga olishi mumkin bo'lgan elementlar soni
is_empty() - Massiv bo'sh yoki yo'qligini tekshirish
at(index) - Ko'rsatilgan index-dagi massiv elementini qaytaradi.
Agar berilgan index massiv indexlaridan tashqarida bo'lsa xatolik qaytaradi.
push(item)
insert(index, item) - Ko'rsatilgan index-ga elementni qo'shadi, index-dagi eski element(lar)ni esa o'zidan o'ngga ko'chiradi
prepend(item) - Massivning birinchi elementidan oldin yangi element qo'shish
pop() - Massivning oxirgi elementini o'chiradi va o'chirilgan elemntni qaytaradi.
delete(index) - Massiv elementini index bo'yicha o'chiradi, Qolgan elementlar chapga ko'chiriladi
remove(item) - Berilgan qiymatni izlaydi va shu qiymatga ega index-larni barchasini o'chiradi
find(item) - Berilgan qiymatni izlaydi va shu qiymatga ega birinchi index-ni qaytaradi, agar topilmasa -1 qaytaradi
resize(new_capacity) // private function
Massiv hajmi to'lganda, uni ikki baravar oshirish uchun o'lchamini o'zgartiring
Massivda element olib tashlanganda, agar hajmi umumiy hajmning 1/4 ga teng bo'lsa, hajmini yarimiga o'zgartiring
Ish vaqt xarajati (Time)
O(1) Oxiriga qo'shish yoki olib tashlash (ko'proq joy ajratish uchun amortizatsiya qilingan), index, yoki o'zgartirish
O(n) boshqa joyga qo'shish yoki olib tashlash
Ish joy xarajati (Space)
elementlar xotirada yonma yon joylashgan, shuning uchun yaqinlik yordam beradi
bo'sh joy kerak = (massiv hajmi >= n) * element hajmi, agar 2n bo'lsa ham O(n) hisoblanadi
Yodda tuting: siz "pointer to pointer" nimaligini tushuningiz kerak:
(funksiyaga pointer berilganda, funksiya pointer ko'rsatib turgan adresni o'zgartirishi mumkin)
Bu sahifa "pointer to pointer" ni tushinish uchun foydali. Lekin bunday list traversal stilini tavsiya etmayman chunki kodni o'qish va uni maintain qilish qiyin.
linked-list dan foydalangan holda kodda yozaman (tail pointer bilan):
enqueue(value) - qiymatni queue-ni oxiriga qo'yadi
dequeue() - queue-ni boshidagi elementni o'chirib uni qiymatini qaytaradi
empty()
belgilangan o'lchamli massivdan foydalangan holda kodda yozaman:
enqueue(value) - mavjud xotirani oxiriga qiymatni qo'yadi
dequeue() - queue-ni boshidagi elementni o'chirib uni qiymatini qaytaradi
empty()
full()
Ish xarajati:
queue uchun linked-list ishlatib, list boshiga enqueue qilish va ohiridan dequeue qilish - bu yomon yondashuv
chunki har safar dequeue qilinganda O(n) vaqt ketadi
enqueue: O(1) (amortized, linked list va massiv [probing])
get_max - o'chirmagan holda, max elementni qaytaradi
get_size() - mavjud elementlar sonini qaytaradi
is_empty() - true qaytaradi agar heap bo'sh bo'lsa
extract_max - o'chirgan holda, max elementni qaytaradi
sift_down - extract_max operatsiyasi uchun kerak
remove(i) - x indeksda joylashgan elementni o'chiradi
heapify - massivdan heap yaratadi, heap_sort operatsiyasi uchun kerak
heap_sort() - tartiblanmagan massivni olib, max heap yoki min heap dan foydalangan holda uni joyida tartiblangan massivga aylantiradi
Sorting (Saralash)
[ ] Eslatmalar:
- sorting bilan ishlang va eng yaxshi/eng yomon holatlarni, har birining o'rtacha murakkabligini biling:
- bubble sort ishlatmang - agar n <= 16 bo'lmasa, O(n^2)-bu juda yomon
- [ ] Algoritmlarni saralashdagi barqarorlik (stability) ("Quicksort barqarormi?")
- [Sorting Algorithm Stability](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)
- [Stability In Sorting Algorithms](http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms)
- [Stability In Sorting Algorithms](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/)
- [Sorting Algorithms - Stability](http://homepages.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf)
Linked list-da qaysi algoritmlardan foydalanish mumkin? Qaysi massivlarda? Qaysilarini ikkalasida ham ishlatsa bo'ladi?
Men linked listni saralashni maslahat bermayman, lekin merge tartiblash algoritmini qilsa bo'ladi.
Katta ehtimollik bilan sizni intervyuingizda dinamik dasturlash masalalari bo'lmaydi, lekin shunday masalani dinamik dasturlashga mosligini aniqlay olishni o'rganish arzigulik
Bu mavzu qiyin bo'lishi mumkin. Chunki har bir DP bilan yechsa bo'ladigan masala uchun "recursion relation" o'ylab topish kerak va bu narsa qiyin bo'lishi mumkin
kerakli patternni tushinib yetguncha ko'p DP masalalarni ko'rib chiqishni maslahat beraman
Videolar:
Skiena videolarini kuzatib tushinish qiyin bo'lishi mumkin chunki u ko'rish uchun juda kichik bo'lgan doskadan bazida foydalanadi
"Design Patterns: Elements of Reusable Object-Oriented Software" kitobi dizayn patternlar uchun defakto resursligini bilaman, lekin Head First kitobi yangi o'rganuvchilar uchun ancha yaxshiroq.
Sotuvchi sotuvchi va ryukzak muammosi kabi NP-ning eng mashhur klasslari haqida bilish,
va intervyu beruvchisi ularni niqob bilan so'raganda ularni taniy olish.
Process uchun kerakli resurslar (xotira: kod, statik xotira, stack, heap, va hamda file descriptorlar, i/o)
Thread uchun kerakli resurslar (tepadagilarni (stackdan tashqari) bitta processda bo'lgan boshqa threadlar bilan baham ko'radi, lekin har birini o'zini pc, stack counter, registerlar, and stacklari bor)
Forklash bu aslida "copy on write" operatsiya. Bu degani fork qilingan processdan nusxa ko'chirish fork process birinchi marta xotiraga yozganda bo'ladi.
Context almashtirish
Operatsion tizm va uni ushlab turgan hardware context almashtirishni qanday qiladi?
Trie-larning turli xili mavjuddir.Bazilarida prefiks bor bo'lsa bazilarida esa yo'q, va bazilari yo'lni kuzatish uchun bitlar o'rniga string ishlatishadi.
Tizim Dizayni, Scalability, Ma'lumotlar bilan ishlash
agar sizda 4+ yil ish tajribasi bo'lsa intervyularda sizga tizim dizayn savolli tushadi
Scalability va Tizim Dizayn juda katta mavzular hisoblanadi.
Chunki katta ko'lamni traffikni ko'tara oladigan software/hardware- ni dizayn qilish uni ko'p qirralarini e'tiborga olishni talab qiladi
Buni ustida bir talay vaqt o'tkazasiz
Qirralar:
Scalability
Katta miqdordagi data to'plamlarni bitta qiymatga agregatlash
bitta data to'plamni boshqasiga o'tkazish
Haddan tashqari katta miqdordagi data bilan ishlash
Tizim dizayn
funksional to'plami
interfeyslar
klaslar ierarxiyasi
malum bir cheklovlar ostida tizimni dizayn qilish
soddaligi va mustahkamligi
afzalliklar va kamchiliklar o'rtasidagi muvozanat
ijro tahlili (performance analysis) va optimallashtirish
Servislarni bir biriga bog'laydigan texnologiyalar haqida o'rganish uchun pastroqdagi "Xabar almashish, Serializatsiya, va Queue Tizimlar" qismni ko'ring
Bundanda ko'proq narsa o'rganish, Video Seriyalar seksiyadagi "Ulkan Datasetlarni Qazish" video seriyasini ko'ring
Tizim dizayn qilish jarayonini mashq qilish: Bu yerda qog'ozda yozib yechish uchun bir nechta misollar bor. Har birini real proyektlarda qanday yechishgani haqida maqolalari ham bor:
Yuqoridagi barcha "computer science" mavzularini bilb oldingiz, endi coding bo'yicha masalalarga javob berishni mashq qilish vaqti keldi.
**Coding masalalarini yechishga tayyorlanish bu javoblarni yodlab qolish emas **
Masalalar yechishni mashq qilish nima uchun zarur:
Muammoni aniqlash va kerakli ma'lumotlar tuzilmalari va algoritmlari mos keladigan joyni topa olish
Masala uchun kerakli talablarni to'plash
Xuddi intervyudagi kabi muammoni yechish uchun qadam baqadam yurish
Doskada yoki qog'ozda kod yozish, kompyuterda emas
Yechimlarizga ish joyi xarajati va ish vaqti xarajatini aniqlash
Yechimlaringizni testlash
Suhbatda metodik, kommunikativ muammolarni hal qilish uchun ajoyib kirish qismi mavjud.
Siz buni dasturlash uchun intervyu kitoblaridan ham topa olishingiz mumkin
lekin men buni ular ichida juda foydali deb topdim:
Algorithm design canvas
Uyingizda doska yo'qmi? Bu tabiy. Men o'zgacha insonman, menda kotta doskam bor. Doska o'rniga, rasm chizish uchun
mo'ljallangan daftar ishlating. Shunda divanda o'tirib, mashq qilishingiz mumkin. Bu mening "divanga mo'ljallangan doskam".
Men rasmda qalamimni ham qo'shganman qulaylik uchun. Agar siz ruchkadan foydalansangiz, o'chirish istagi paydo bo'lishi mumkin.
Tez Chalkashib ketadi. Shuning uchun men qalam va o'chirg'ichdan foydalanaman.
'Cracking The Coding Interview' kitobini Resume prep qismini va 'Programming Interviews Exposed' kitobini orqasini ko'ring
Intervyuga yaqin kelganda quydagilar haqida o'ylab yuring
Sizdan so'rashlari mumkin bo'lgan 20 tacha intervyu savollarini o'ylab toping (pastagi savollarga o'xshagan). Har biri uchun 2-3 javobiz bo'lsin.
Siz amalga oshirgan biror narsa haqida hikoyangiz bo'lsin
Nega bu ishni xohlayapsiz?
Siz yechgan mushkul masala/muammo?
Qanday qiyinchiliklar bo'lgan?
Siz ko'rgan eng yaxshi/eng yomon dizaynlar?
Mavjud produktni takomillashtirish uchun g'oyalar?
Qanday holda yaxshi ishlaysiz, yolg'iz yoki jamoda?
Sizni qanday ko'nikmalaringiz/mahoratlaringiz bu ish o'rinida katta foyda bo'ladi va nega?
[x ishda / y proyektda] sizni eng ko'p zavqlantirgan narsa?
[x ishda / y proyektda] siz duch kelgan eng katta muammo?
[x ishda / y proyektda] siz duch kelgan eng mashaqqatli bug?
[x ishda / y proyektda] siz nima o'rgandingiz?
[x ishda / y proyektda] siz nimani yaxshiroq qilgan bo'lardingiz?
Intervyuver uchun savollaringizni tayyorlab qo'ying
Mening savollarimning bazilari (Bu savollarga javobni bilsam ham ularni fikrlarini yoki jamoaviy nuqtai nazarlarini bilishni xoxlayman):
Jamoangiz qanchalik katta?
Sizning dasturlash siklingiz qanday tarzda o'tadi? waterfall/sprintlar/ yoki agile ishlatasizmi?
Deadline-lar ga shoshilish odatiy holmi? Yoki erkinlik ko'proqmi?
Jamoangizda qarorlar qanday qabul qilinadi?
Haftasiga nechi marta jamooaviy meeting-lar tashkil etiladi?
Sizning ishdagi atmosferangiz sizga konsentratsiya qilishga yordam beradimi?
Hozirda nima ustida ishlayapsizlar?
Bunda sizga nima ko'proq yoqadi?
Ish hayoti qanday tarzda o'tadi?
Ish va shaxsiy hayot balansi qanday yo'lga qo'yilgan?
Ishga qabul qilinganingizdan so'ng
Tabriklaymiz!
O'rganishda davom eting.
Hech qachon tugatgan bo'lmaymiz.
*****************************************************************************************************
*****************************************************************************************************
Ushbu bandning ostidagi hamma narsalar ixtiyoriydir.
Ularni o'rganish orqali siz ko'proq CS tushunchalariga ega bo'lasiz va har qanday dasturiy injinerlik
ishi uchun yaxshi tayyorlangan bo'lasiz. Siz ancha mukammal dasturchi darajasiga erishasiz.
*****************************************************************************************************
*****************************************************************************************************
Qo'shimcha kitoblar
O'zingizni qiziqtirgan mavzuga chuqur sho'ng'ishingiz uchun resurslar
Kitob 2004-yilda nashr etilgan va bir oz eskirgan, lekin kompyuterni qisqa vaqta tushunish uchun zo'r resurs
Muallif HLA ni kashf etgan. Shunday ekan, HLA haqida gaplar va namunalarga skeptik qarang. Keng ishlatilmaydi lekin assembly qanday ko'rinishini ko'rsatadigan namunalar
Bu boblar sizga kompyuterni tushunishda yaxshi bilim poydevori bo'ladi
Chapter 2 - Numeric Representation
Chapter 3 - Binary Arithmetic and Bit Operations
Chapter 4 - Floating-Point Representation
Chapter 5 - Character Representation
Chapter 6 - Memory Organization and Access
Chapter 7 - Composite Data Types and Memory Objects
Muhim: Bu kitobni o'qish siz uchun cheklangan qiymatga ega. Bu kitob algoritmlar va data strukturalar tahlili uchun zo'r, lekin yaxshi kod yozishni o'rgatmaydi. O'zingiz to'g'ri yechim topishingiz kerak bo'ladi
CLR nomi bilan ham tanilgan (bazida CLRS chunki Stein keyinroq kitob mualliflariga qo'shilgan)
Boshlang'ich bir ikki boblari muammolarga ajoyib yechimlar taqdim qiladi, lekin bu shunchaki kirish.
Bu kitob dastur dizayn va arxitekturasi uchun qo'llanma
Qo'shimcha o'rganish
Men bularni har tomonlama rivojlangan dasturchi bo'lishingizga yordam berish va ba'zi texnologiyalar va algoritmlar xabardor bo'lishingiz uchun qo'shdim
texnologiyalar va algoritmlar, Natijada sizda kattaroq asboblar qutisi bo'ladi.
Kamida bitta balanced binary tree turini biling (va uni qanday yozishni ham biling)
"Balanced search tree-lar orasida, AVL va 2/3 tree-lar hozir o'tmishga aylangan, va red-black tree-lar ancha mashhurroq.
Xususan qiziqarli bo'lgan o'z-o'zini tashkil qiladigan data struktura bu splay tree. Splay tree
har safar key so'ralganda uni rotatsiyadan foydalangan holda root-ga o'tkazadi." - Skiena
Of these, I chose to implement a splay tree. From what I've read, you won't implement a
Bulardan men splay tree-ni kodda yozishni tanladim. Bilishimcha intervyuda sizdan balanced search tree-ni
yozishni so'rashmaydi. Lekin men baribir yozishni xohladim va tan olaylik splay tree-lar zo'r.
Men juda ko'p red-black tree kodlarini ham o'qidim.
Splay tree: insert, search, delete funksiyalari
Agar red-black tree-ni yozadigan bo'lsangiz faqat shularni yozishga harakat qiling:
Search va insertion funksiyalari, delete-ni tashlab ketavering
Men B-tree-lar haqida ko'proq o'rganmoqchiman chunki ular katta data to'plamlari bilan juda ko'p ishlatiladi
Amalda:
Meni fikrimda AVL tree-lar amalda uncha ishlatilmaydi. Lekin men qayerda ishlatilishi mumkinligini ayta olaman:
AVL bu search, insertion, va removal funksiyalarini O(log n) tezligida qila oladigan yana bitta struktura. AVL tree-lar
red-black tree-larga nisbatan ancha uzil-kesil balanslangan. Shuning uchun insertion va removal sekin, lekin search tezroq.
Shu sababli u bir marta qurilib qayta-qayta yuklanib ishlatiladigan data strukturalari uchun juda qo'l keladi.
Masalan: til lug'atlari yoki dastur lu'gatlari (assembler va interpreter opcode-lari)
Amalda:
Splay tree-lar asosan cache-lar, memory allocator-lar, router-lar, garbage collector-lar, data compressiya,
rope data struktura, Windows NT, va hokazo componentlarni qurish uchun ishlatiladi
Amalda:
Red-black tree-lar insertion, deletion va search uchun eng-yomon ish vaqtini kafolatlaydi.
Uni shu xususiyati vaqt juda muhim bo'lgan dasturlarda foydali qiladi. Hamda eng-yomon vaqtni
kafolat qiladigan data strukturalarni foydali bir qismi bo'lib ishlaydi;
masalan, kompyutatsion geometriyada ishlatiladigan ko'p data strukturalar red-black tree-larga asoslanishi mumkin
va hozirgi Linux kernellarda ishlatiladigan "Completely Fair Scheduler" red-black tree ishlatadi. Javaning 8 versiyasida,
oldin bir xil bo'lgan elementlari saqlash uchun LinkedList ishlatgan HashMap data strukturasi o'zgartirilib
hozirda Red-Black tree ishlatadi
2-3-4 Tree-lar (shuningdek 2-4 tree nomi bilan tanilgan)
Amalda:
Har 2-4 tree uchun unga mos elementlari bir xil tartibda bo'lgan red-black bor. Insertion va deletion funksiyalari red-black
tree-dagi color-flipping va rotation funksiyalariga tengma-tengdir. Bu xususiyati uni red-black tree-larni tagidagi mantiqni
tushunishda juda muhim rol o'ynaydi va shuning uchun ko'p kirish algoritm kitoblari red-black tree-dan oldin 2-4 treelar haqida gapiradi,
garchi 2-4 tree-lar amalda uncha ko'p ishlatilmasa.
Qiziq fakt: bu noma'lum, lekin B-tree-dagi B Boeing, Balanced, yoki Bayerdan (boshqa ixtirochisi) olingan bo'lishi mumkin
Amalda:
B-Tree-lar malumotlar bazasida keng ishlatiladi. Ko'p zamonaviy fayl tizimlari B-tree yoki uni boshqa variantlarini ishlatadi.
Malumotlar bazasidan tashqari, B-Tree-lar berilgan fayldagi tasodifiy bo'lakni tez o'qishga yordam beradi. Berilgan i fayl bo'lak adresini disk bo'lak adresiga aylantirish asosiy muammodir.
MIT 6.851 - Memory Hierarchy Models (video)
- keshga e'tiborsiz B-Tree-lar haqida, juda qiziq data strukturalari
- birinchi 37 minuti juda texnik, o'tkazib yuborsangiz bo'ladi (B bu bo'lak hajmi, kesh qator hajmi)
k-D Tree-lar
Uchburchak ichidagi nuqtalarni topish uchun yoki yuqori o'lchivli obyektlar uchun juda zo'r
Men bularni Yuqorida keltirilgan ba'zi fikrlarni mustahkamlash uchun qo'shdim, lekin yuqorida qo'shishni xohlamadim
chunki juda ko'p resurslarni o'z ichiga oladi. Bitta mavzuda juda ko'p qolib ketish ham yaxshi emas.
Siz shu asrda ishga qabul qilinishingizni xohlaysiz shundaymi?