diff --git a/translations/README-bg.md b/translations/README-bg.md
index 1cc97bc0ab..a53b284234 100644
--- a/translations/README-bg.md
+++ b/translations/README-bg.md
@@ -2,7 +2,7 @@
> Първоначално създадох това като кратък списък с теми за учене, за това как се става софтуерен инженер, но то прерасна в този огромен списък, който виждате в момента. След като преминах през този учебен план, [бях нает като софтуерен инженер в Amazon](https://startupnextdoor.com/ive-been-acquired-by-amazon/?src=ciu)! Най-вероятно няма да Ви се налага да учите колкото на мен, но все пак всичко, от което се нуждаете е тук.
>
-> Учих между 8-12 часа на ден в продължение на няколко месеца. Това е историята ми: [Why I studies full-time for 8 months for a Google interview](https://medium.freecodecamp.org/why-i-studied-full-time-for-8-months-for-a-google-interview-cc662ce9bb13)
+> Учих между 8-12 часа на ден в продължение на няколко месеца. Това е историята ми: [Why I studied full-time for 8 months for a Google interview](https://medium.freecodecamp.org/why-i-studied-full-time-for-8-months-for-a-google-interview-cc662ce9bb13)
>
> **Моля обърнете внимание:** Няма да Ви се налага да учите колкото мен. Загубих много време, учейки неща, които нямах нужда да знам. Може да прочетете повече за това надолу. Ще Ви помогна да достигнете до крайната цел без да прахосвате скъпото си време.
>
@@ -13,46 +13,49 @@
Преводи:
-- [中文版本](translations/README-cn.md)
-- [Tiếng Việt - Vietnamese](translations/README-vi.md)
-- [Español](translations/README-es.md)
-- [Português Brasileiro](translations/README-ptbr.md)
-- [Polish](translations/README-pl.md)
-- [繁體中文](translations/README-tw.md)
-- [Japanese (日本語)](translations/README-ja.md)
-- [Russian](translations/README-ru.md)
-- [Bulgarian](translations/README-bg.md)
-- [German](translations/README-de.md)
-- [Bahasa Indonesia](translations/README-id.md)
-- [ខ្មែរ - Khmer](translations/README-kh.md)
-- [Uzbek](translations/README-uz.md)
+- [中文版本](translations/README-cn.md)
+- [Tiếng Việt - Vietnamese](translations/README-vi.md)
+- [Español](translations/README-es.md)
+- [Português Brasileiro](translations/README-ptbr.md)
+- [Polish](translations/README-pl.md)
+- [繁體中文](translations/README-tw.md)
+- [Japanese (日本語)](translations/README-ja.md)
+- [Russian](translations/README-ru.md)
+- [German](translations/README-de.md)
+- [Bahasa Indonesia](translations/README-id.md)
+- [ខ្មែរ - Khmer](translations/README-kh.md)
+- [Uzbek](translations/README-uz.md)
+- [Bulgarian](translations/README-bg.md)
+- [বাংলা - Bangla](translations/README-bn.md)
Текущи преводи:
-- [हिन्दी](https://github.com/jwasham/coding-interview-university/issues/81)
-- [עברית](https://github.com/jwasham/coding-interview-university/issues/82)
-- [Arabic](https://github.com/jwasham/coding-interview-university/issues/98)
-- [Turkish](https://github.com/jwasham/coding-interview-university/issues/90)
-- [French](https://github.com/jwasham/coding-interview-university/issues/89)
-- [Українська](https://github.com/jwasham/coding-interview-university/issues/106)
-- [Korean(한국어)](https://github.com/jwasham/coding-interview-university/issues/118)
-- [Telugu](https://github.com/jwasham/coding-interview-university/issues/117)
-- [Urdu](https://github.com/jwasham/coding-interview-university/issues/519)
-- [Thai](https://github.com/jwasham/coding-interview-university/issues/156)
-- [Greek](https://github.com/jwasham/coding-interview-university/issues/166)
-- [Malayalam](https://github.com/jwasham/coding-interview-university/issues/239)
+- [हिन्दी](https://github.com/jwasham/coding-interview-university/issues/81)
+- [עברית](https://github.com/jwasham/coding-interview-university/issues/82)
+- [Arabic](https://github.com/jwasham/coding-interview-university/issues/98)
+- [Turkish](https://github.com/jwasham/coding-interview-university/issues/90)
+- [French](https://github.com/jwasham/coding-interview-university/issues/89)
+- [Українська](https://github.com/jwasham/coding-interview-university/issues/106)
+- [Korean(한국어)](https://github.com/jwasham/coding-interview-university/issues/118)
+- [Telugu](https://github.com/jwasham/coding-interview-university/issues/117)
+- [Urdu](https://github.com/jwasham/coding-interview-university/issues/519)
+- [Thai](https://github.com/jwasham/coding-interview-university/issues/156)
+- [Greek](https://github.com/jwasham/coding-interview-university/issues/166)
+- [Malayalam](https://github.com/jwasham/coding-interview-university/issues/239)
+- [Persian - Farsi](https://github.com/jwasham/coding-interview-university/issues/186)
+- [Afrikaans](https://github.com/jwasham/coding-interview-university/issues/1164)
## Какво е това?
@@ -63,11 +66,19 @@
**Изисквания:**
-- Малко опит с програмиране (променливи, цикли, методи/функции и т.н)
-- Търпение
-- Време
+- Малко опит с програмиране (променливи, цикли, методи/функции и т.н)
+- Търпение
+- Време
-Обърнете внимание, че това е учебен план за **софтуерно инженерство**, а не за уеб разработка. Големите компании като Google, Amazon, Facebook и Microsoft различават софтуерното инженерство и уеб разработката. Amazon, например, имат Frontend инженери (FEE) и Software Development инженери (SDE). Това са 2 отделни позиции и интервютата за тях няма да са еднакви, тъй като всяка една от тях има своите специфики. Тези компании изискват знания по компютърни науки за позиции свързани със софтуерно инженерство/разработка
+Обърнете внимание, че това е учебен план за **софтуерно инженерство**, а не за уеб разработка. Големите компании като Google, Amazon,
+Facebook и Microsoft различават софтуерното инженерство и уеб разработката. Amazon, например, имат Frontend инженери (FEE)
+и Software Development инженери (SDE). Това са 2 отделни позиции и интервютата за тях няма да са еднакви, тъй като всяка една от
+тях има своите специфики. Тези компании изискват знания по компютърни науки за позиции свързани със софтуерно инженерство/разработка.
+
+По принцип в университетска програма по Компютърни науки/Информатика има много неща за учене, но знаейки около 75% от това е
+достатъчно добре за да се справите на интервю, това е и информацията която покривам тук.
+За пълна програма по Компютърни науки за самоуки записките от моя план за учене са включени в Пътеката по Компютърни науки на Камран
+Ахмед: https://roadmap.sh/computer-science
---
@@ -75,125 +86,125 @@
### Учебният план
-- [Какво е това?](#какво-е-това)
-- [Защо да го ползвате?](#защо-да-го-ползвате)
-- [Как да го ползвате?](#как-да-го-ползвате)
-- [Не мислете, че не сте достатъчно умни](#не-мислете-че-не-сте-достатъчно-умни)
-- [Бележка за видео ресурсите](#бележка-за-видео-ресурсите)
-- [Изберете език за програмиране](#изберете-език-за-програмиране)
-- [Книги за структури от данни и алгоритми](#книги-за-структури-от-данни-и-алгоритми)
-- [Книги за подготовка за интервю](#книги-за-подготовка-за-интервю)
-- [Не повтаряйте грешките ми](#не-повтаряйте-грешките-ми)
-- [Какво няма да намерите тук](#какво-няма-да-намерите-тук)
-- [Дневния план](#дневния-план)
-- [Подготовка за въпроси за програмиране](#подготовка-за-въпроси-за-програмиране)
-- [Задачи по програмиране](#задачи-по-програмиране)
+- [Какво е това?](#какво-е-това)
+- [Защо да го ползвате?](#защо-да-го-ползвате)
+- [Как да го ползвате?](#как-да-го-ползвате)
+- [Не мислете, че не сте достатъчно умни](#не-мислете-че-не-сте-достатъчно-умни)
+- [Бележка за видео ресурсите](#бележка-за-видео-ресурсите)
+- [Изберете език за програмиране](#изберете-език-за-програмиране)
+- [Книги за структури от данни и алгоритми](#книги-за-структури-от-данни-и-алгоритми)
+- [Книги за подготовка за интервю](#книги-за-подготовка-за-интервю)
+- [Не повтаряйте грешките ми](#не-повтаряйте-грешките-ми)
+- [Какво няма да намерите тук](#какво-няма-да-намерите-тук)
+- [Дневния план](#дневния-план)
+- [Подготовка за въпроси за програмиране](#подготовка-за-въпроси-за-програмиране)
+- [Задачи по програмиране](#задачи-по-програмиране)
### Теми за учене
-- [Алгоритмична сложност / Big-O / Асимптотичен анализ](#алгоритмична-сложност--big-o--асимптотичен-анализ)
-- [Структури от данни](#структури-от-данни)
- - [Масиви (Arrays)](#масиви)
- - [Свързани списъци(Linked Lists)](#свързани-списъци)
- - [Стек (Stack)](#стек)
- - [Опашка (Queue)](#опашка)
- - [Хеш таблици (Hash table)](#хеш-таблици)
-- [Повече знания](#повече-знания)
- - [Двоично търсене (Binary search)](#двоично-търсене)
- - [Побитови операции (Bitwise operations)](#побитови-операции)
-- [Дървета](#дървета)
- - [Дървета - бележки & основи](#дървета---бележки--основи)
- - [Дървета за двоично търсене: BSTs (Binary search trees)](#дървета-за-двоично-търсене-bsts)
- - [Heap / Priority Queue / Binary Heap](#heap--priority-queue--binary-heap)
- - балансирани дървета за търсене (основна концепция, без детайли)
- - обхождане: preorder, inorder, postorder, BFS, DFS
-- [Сортиране (Sorting)](#сортиране)
- - selection
- - insertion
- - heapsort
- - quicksort
- - merge sort
-- [Графи (Graphs)](#графи)
- - directed
- - undirected
- - adjacency matrix
- - adjacency list
- - traversals: BFS, DFS
-- [Още повече знания](#още-повече-знания)
- - [Рекурсия (Recursion)](#рекурсия)
- - [Динамично програмиране (Dynamic programming)](#динамично-програмиране)
- - [Design Patterns](#design-patterns)
- - [Комбинаторика & вероятности](#комбинаторика--вероятности)
- - [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms)
- - [Как компютрите обработват една програма](#как-компютрите-обработват-една-програма)
- - [Кеширане (Caches)](#кеширане)
- - [Процеси и нишки](#процеси-и-нишки)
- - [Тестване (Testing)](#тестване)
- - [String searching & manipulations](#string-searching--manipulations)
- - [Tries](#tries)
- - [Floating Point Numbers](#floating-point-numbers)
- - [Уникод (Unicode)](#уникод)
- - [Endianness](#endianness)
- - [Мрежи (Networking)](#мрежи)
-- [Последен преглед](#последен-преглед)
+- [Алгоритмична сложност / Big-O / Асимптотичен анализ](#алгоритмична-сложност--big-o--асимптотичен-анализ)
+- [Структури от данни](#структури-от-данни)
+ - [Масиви (Arrays)](#масиви)
+ - [Свързани списъци(Linked Lists)](#свързани-списъци)
+ - [Стек (Stack)](#стек)
+ - [Опашка (Queue)](#опашка)
+ - [Хеш таблици (Hash table)](#хеш-таблици)
+- [Повече знания](#повече-знания)
+ - [Двоично търсене (Binary search)](#двоично-търсене)
+ - [Побитови операции (Bitwise operations)](#побитови-операции)
+- [Дървета](#дървета)
+ - [Дървета - бележки & основи](#дървета---бележки--основи)
+ - [Дървета за двоично търсене: BSTs (Binary search trees)](#дървета-за-двоично-търсене-bsts)
+ - [Heap / Priority Queue / Binary Heap](#heap--priority-queue--binary-heap)
+ - балансирани дървета за търсене (основна концепция, без детайли)
+ - обхождане: preorder, inorder, postorder, BFS, DFS
+- [Сортиране (Sorting)](#сортиране)
+ - selection
+ - insertion
+ - heapsort
+ - quicksort
+ - merge sort
+- [Графи (Graphs)](#графи)
+ - directed
+ - undirected
+ - adjacency matrix
+ - adjacency list
+ - traversals: BFS, DFS
+- [Още повече знания](#още-повече-знания)
+ - [Рекурсия (Recursion)](#рекурсия)
+ - [Динамично програмиране (Dynamic programming)](#динамично-програмиране)
+ - [Design Patterns](#design-patterns)
+ - [Комбинаторика & вероятности](#комбинаторика--вероятности)
+ - [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms)
+ - [Как компютрите обработват една програма](#как-компютрите-обработват-една-програма)
+ - [Кеширане (Caches)](#кеширане)
+ - [Процеси и нишки](#процеси-и-нишки)
+ - [Тестване (Testing)](#тестване)
+ - [String searching & manipulations](#string-searching--manipulations)
+ - [Tries](#tries)
+ - [Floating Point Numbers](#floating-point-numbers)
+ - [Уникод (Unicode)](#уникод)
+ - [Endianness](#endianness)
+ - [Мрежи (Networking)](#мрежи)
+- [Последен преглед](#последен-преглед)
### Как да спечелите позицията
-- [Актуализирайте резюмето си](#актуализирайте-резюмето-си)
-- [Намерете позиция](#намерете-позиция)
-- [Процесът на интервюто & обща подготовка](#процесът-на-интервюто--обща-подготовка)
-- [Мислете за това, когато дойде интервюто](#мислете-за-това-когато-дойде-интервюто)
-- [Подгответе въпроси за интервюиращия](#подгответе-въпроси-за-интервюиращия)
-- [След като са Ви наели](#след-като-са-ви-наели)
+- [Актуализирайте резюмето си](#актуализирайте-резюмето-си)
+- [Намерете позиция](#намерете-позиция)
+- [Процесът на интервюто & обща подготовка](#процесът-на-интервюто--обща-подготовка)
+- [Мислете за това, когато дойде интервюто](#мислете-за-това-когато-дойде-интервюто)
+- [Подгответе въпроси за интервюиращия](#подгответе-въпроси-за-интервюиращия)
+- [След като са Ви наели](#след-като-са-ви-наели)
**---------------- Всичко оттук надолу е по желание ----------------**
### Допълнителни теми и ресурси
-- [Допълнителни книги](#допълнителни-книги)
-- [Системен дизайн, мащабируемост, обработка на данни](#системен-дизайн-мащабируемост-обработка-на-данни) (ако имате над 4 години опит)
-- [Additional Learning](#additional-learning)
- - [Компилатори](#компилатори)
- - [Emacs and vi(m)](#emacs-and-vim)
- - [Unix command line tools](#unix-command-line-tools)
- - [Information theory](#information-theory-videos)
- - [Паритет & код на Хаминг](#паритет--код-на-хаминг)
- - [Ентропия](#ентропия)
- - [Криптография](#криптография)
- - [Компресия](#компресия)
- - [Компютърна сигурност](#компютърна-сигурност)
- - [Garbage collection](#garbage-collection)
- - [Паралелно програмиране](#паралелно-програмиране)
- - [Системи за съобщения, сериализация и последователност](#системи-за-съобщения-сериализация-и-последователност)
- - [A\*](#a)
- - [Fast Fourier Transform](#fast-fourier-transform)
- - [Bloom Filter](#bloom-filter)
- - [HyperLogLog](#hyperloglog)
- - [Locality-Sensitive Hashing](#locality-sensitive-hashing)
- - [van Emde Boas Trees](#van-emde-boas-trees)
- - [Разширени структури от данни](#разширени-структури-от-данни)
- - [Балансирани дървета за търсене](#балансирани-дървета-за-търсене)
- - AVL trees
- - Splay trees
- - Red/black trees
- - 2-3 search trees
- - 2-3-4 Trees (aka 2-4 trees)
- - N-ary (K-ary, M-ary) trees
- - B-Trees
- - [k-D Trees](#k-d-trees)
- - [Skip lists](#skip-lists)
- - [Мрежови потоци](#мрежови-потоци)
- - [Disjoint Sets & Union Find](#disjoint-sets--union-find)
- - [Математика за бърза обработка](#математика-за-бърза-обработка)
- - [Treap](#treap)
- - [Линейно програмиране](#линейно-програмиране)
- - [Geometry, Convex hull](#geometry-convex-hull-videos)
- - [Дискретна математика](#дискретна-математика)
- - [Machine Learning](#machine-learning)
-- [Допълнителни детайли по някои теми](#допълнителни-детайли-по-някои-теми)
-- [Видео серии](#видео-серии)
-- [Курсове по компютърни науки](#курсове-по-компютърни-науки)
-- [Papers](#papers)
+- [Допълнителни книги](#допълнителни-книги)
+- [Системен дизайн, мащабируемост, обработка на данни](#системен-дизайн-мащабируемост-обработка-на-данни) (ако имате над 4 години опит)
+- [Допълнителни теми за учене](#Допънителни-теми-за-учене)
+ - [Компилатори](#компилатори)
+ - [Emacs and vi(m)](#emacs-and-vim)
+ - [Unix command line tools](#unix-command-line-tools)
+ - [Information theory](#information-theory-videos)
+ - [Паритет & код на Хаминг](#паритет--код-на-хаминг)
+ - [Ентропия](#ентропия)
+ - [Криптография](#криптография)
+ - [Компресия](#компресия)
+ - [Компютърна сигурност](#компютърна-сигурност)
+ - [Garbage collection](#garbage-collection)
+ - [Паралелно програмиране](#паралелно-програмиране)
+ - [Системи за съобщения, сериализация и последователност](#системи-за-съобщения-сериализация-и-последователност)
+ - [A\*](#a)
+ - [Fast Fourier Transform](#fast-fourier-transform)
+ - [Bloom Filter](#bloom-filter)
+ - [HyperLogLog](#hyperloglog)
+ - [Locality-Sensitive Hashing](#locality-sensitive-hashing)
+ - [van Emde Boas Trees](#van-emde-boas-trees)
+ - [Разширени структури от данни](#разширени-структури-от-данни)
+ - [Балансирани дървета за търсене](#балансирани-дървета-за-търсене)
+ - AVL trees
+ - Splay trees
+ - Red/black trees
+ - 2-3 search trees
+ - 2-3-4 Trees (aka 2-4 trees)
+ - N-ary (K-ary, M-ary) trees
+ - B-Trees
+ - [k-D Trees](#k-d-trees)
+ - [Skip lists](#skip-lists)
+ - [Мрежови потоци](#мрежови-потоци)
+ - [Disjoint Sets & Union Find](#disjoint-sets--union-find)
+ - [Математика за бърза обработка](#математика-за-бърза-обработка)
+ - [Treap](#treap)
+ - [Линейно програмиране](#линейно-програмиране)
+ - [Geometry, Convex hull](#geometry-convex-hull-videos)
+ - [Дискретна математика](#дискретна-математика)
+ - [Machine Learning](#machine-learning)
+- [Допълнителни детайли по някои теми](#допълнителни-детайли-по-някои-теми)
+- [Видео серии](#видео-серии)
+- [Курсове по компютърни науки](#курсове-по-компютърни-науки)
+- [Papers](#papers)
---
@@ -203,25 +214,73 @@
Ако също като мен не сте учили компютърни науки в университет това ще Ви помогне да наваксате и ще Ви спести години.
-Когато започнах този проект не знаех какво е стек или опашка, нямах представа какво е Big-O, не знаех нищо за дървета или как да обхождам графи. Ако трябваше да напиша сортиращ алгоритъм мога да Ви кажа, че бих се справил ужасно. Всяка от структурите от данни, които бях използвал досега бяха имплементирани в езика, който ползвах и нямах представа как работят реално. Никога не ми се беше налагало да управлявам памет освен ако някой от процесите, които бях пуснал не връщаха грешка "out of memory"- тогава се налагаше да търся заобиколен път. Бях ползвал хиляди асоциативни масиви и многоизмерни масиви няколко пъти, но никога преди не бях имплементирал структури от данни от нулата.
+Когато започнах този проект не знаех какво е стек или опашка, нямах представа какво е Big-O, не знаех нищо за дървета или как да
+pобхождам графи. Ако трябваше да напиша сортиращ алгоритъм мога да Ви кажа, че бих се справил ужасно. Всяка от структурите от данни,
+които бях използвал досега бяха имплементирани в езика, който ползвах и нямах представа как работят реално. Никога не ми се беше
+налагало да управлявам памет освен ако някой от процесите, които бях пуснал не връщаха грешка "out of memory"- тогава се налагаше
+да търся заобиколен път. Бях ползвал хиляди асоциативни масиви и многоизмерни масиви няколко пъти, но никога преди не бях
+имплементирал структури от данни от нулата.
-Планът е дълъг. Може да Ви отнеме месеци. Ако вече сте запознати с повечето от темите ще Ви отнеме много по-малко
+Планът е дълъг. Може да Ви отнеме месеци. Ако вече сте запознати с повечето от темите ще Ви отнеме много по-малко.
## Как да го ползвате
Всичко надолу е само схематично изложение и трябва да преминете през темите от горе до долу.
+Аз използвам специалния маркдаун на ГитХъб, включително листове със задачи за да следвам прогреса си.
+ - [Повече за GitHub-flavored markdown](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown)
+
+### Ако не желаете да използвате git
+
+На тази страница кликнете върху бутона Code най-отгоре, а след това изберете "Download ZIP". Накрая разархивирайте файла и можете да
+работите с текстовите файлове.
+
+Ако сте отворили файловете с текстов редактор, който разбира markdown, ще видите всичко форматирано подредено и красиво.
+
+
+
+### Ако се чувствате сигурни да ползвате git
+
+Създайте нов бранч за да може да отбелязвате елементи по този начин, като просто вкарате един х в скобите: [x]
+
+1. ***Направете Fork на GitHub хранилището:*** `https://github.com/jwasham/coding-interview-university` като кликнете върху бутона Fork.
+
+ 
+
+1. Клонирайте хранилището на персоналния Ви компютър:
+
+ ```
+ git clone git@github.com:/coding-interview-university.git
+ cd coding-interview-university
+ git checkout -b progress
+ git remote add jwasham https://github.com/jwasham/coding-interview-university
+ git fetch --all
+ ```
+
+1. Маркирайте всички кутийки с Х след като сте готови с промените си:
+
+ ```
+ git add .
+ git commit -m "Marked x"
+ git rebase jwasham/main
+ git push --set-upstream origin progress
+ git push --force
+ ```
+
+
## Не мислете, че не сте достатъчно умни
-- Успешните софтуерни инженери са умни, но много имат чувството, че не са достатъчно умни
-- [Митът за гениалния програмист](https://www.youtube.com/watch?v=0SARbwvhupQ)
-- [Опасно е да сте сами: битката с невидимите чудовища в IT](https://www.youtube.com/watch?v=1i8ylq4j_EY)
+- Успешните софтуерни инженери са умни, но много имат чувството, че не са достатъчно умни
+- [Митът за гениалния програмист](https://www.youtube.com/watch?v=0SARbwvhupQ)
+- [Опасно е да сте сами: битката с невидимите чудовища в IT](https://www.youtube.com/watch?v=1i8ylq4j_EY)
## Бележка за видео ресурсите
-Някои видеа са достъпни само след записване в курс на Coursera или EdX- т.нар. MOOCs. Понякога се налага да изчакате няколко месеца, за да стартира ново издание на курса, така че няма да имате достъп до тях.
+Някои видеа са достъпни само след записване в курс на Coursera или EdX- т.нар. MOOCs. Понякога се налага да изчакате няколко месеца,
+за да стартира ново издание на курса, така че няма да имате достъп до тях.
-Би било чудесно такива ресурси да бъдат заменени с безплатни и свободнодостъпни публични източници като YouTube видеа (по възможност университетски лекции), за да могат всички да учат навсякъде и по всяко време, а не само когато даден курс върви в момента.
+Би било чудесно такива ресурси да бъдат заменени с безплатни и свободнодостъпни публични източници като YouTube видеа (по възможност
+университетски лекции), за да могат всички да учат навсякъде и по всяко време, а не само когато даден курс върви в момента.
## Изберете език за програмиране
@@ -233,38 +292,40 @@
Когато преминавах през учебния план ползвах 2 езика за по-голямата част от нещата: C и Python
-- C: Език на много ниско ниво. Дава Ви възможност да се справяте с пойнтъри и управляване на паметта, за да разберете структурите от данни и алгоритмите на много дълбоко ниво. В езици за програмиране на по-високо ниво тези неща са скрити от Вас. В ежедневната работа това е прекрасно, но когато се учите как тези структури от данни работят е хубаво да усещате как става всичко.
- - C е навсякъде. Ще виждате примери в книги, лекции, видеа _навсякъде_ докато учите.
- - [The C Programming Language, Vol 2](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628)
- - Това е кратка книга, но ще Ви даде добра представа за езика и с малко упражнения бързо ще имате добро владение над него. Ако разбирате C значи разбирате как програмите и паметта работят.
- - Не трябва да се зачитате много надълбоко в книгата (или дори да я прочитате докрай). Нужно е само да сте уверени в способността си да четете и пишете в C.
- - [Отговори на въпросите в книгата](https://github.com/lekkas/c-algorithms)
-- Python: модерен и много експресивен. Научих го защото е наистина много полезен и ми позволява да пиша по-малко код когато съм на интервю.
+* C: Език на много ниско ниво. Дава Ви възможност да се справяте с пойнтъри и управляване на паметта, за да разберете структурите
+ от данни и алгоритмите на много дълбоко ниво. В езици за програмиране на по-високо ниво тези неща са скрити от Вас. В ежедневната
+ работа това е прекрасно, но когато се учите как тези структури от данни работят е хубаво да усещате как става всичко.
+ - C е навсякъде. Ще виждате примери в книги, лекции, видеа _навсякъде_ докато учите.
+ - [The C Programming Language, Vol 2](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628)
+ - Това е кратка книга, но ще Ви даде добра представа за езика и с малко упражнения бързо ще имате добро владение над него. Ако разбирате C значи разбирате как програмите и паметта работят.
+ - Не трябва да се зачитате много надълбоко в книгата (или дори да я прочитате докрай). Нужно е само да сте уверени в способността си да четете и пишете в C.
+ - [Отговори на въпросите в книгата](https://github.com/lekkas/c-algorithms)
+* Python: модерен и много експресивен. Научих го защото е наистина много полезен и ми позволява да пиша по-малко код когато съм на интервю.
Това е моя личен избор. Вие можете да изберете каквото пожелаете, разбира се.
Може да не Ви трябват, но ето някои сайтове за учене на нов език:
-- [Exercism](https://exercism.org/tracks)
-- [Codewars](http://www.codewars.com)
-- [Codility](https://codility.com/programmers/)
-- [HackerEarth](https://www.hackerearth.com/)
-- [Sphere Online Judge (spoj)](http://www.spoj.com/)
-- [Codechef](https://www.codechef.com/)
-- [Codeforces](https://codeforces.com/)
+- [Exercism](https://exercism.org/tracks)
+- [Codewars](http://www.codewars.com)
+- [Codility](https://codility.com/programmers/)
+- [HackerEarth](https://www.hackerearth.com/)
+- [Sphere Online Judge (spoj)](http://www.spoj.com/)
+- [Codechef](https://www.codechef.com/)
+- [Codeforces](https://codeforces.com/)
### За интервюто Ви по програмиране
Може да изберете език, в който се чувствате комфортно за интервюто Ви, но за големите компании това са най-добрите опции:
-- C++
-- Java
-- Python
+- C++
+- Java
+- Python
Може да ползвате и тези, но поразгледайте преди това, защото може да има уловки:
-- JavaScript
-- Ruby
+- JavaScript
+- Ruby
Това е статия, която написах за избирането на език за вашето интервю:
[Pick One Language for the Coding Interview](https://startupnextdoor.com/important-pick-one-language-for-the-coding-interview/).
@@ -286,28 +347,28 @@
### C
-- [Algorithms in C, Parts 1-5 (Bundle), 3rd Edition](https://www.amazon.com/Algorithms-Parts-1-5-Bundle-Fundamentals/dp/0201756080)
- - Основни познания, структури от данни, сортиране, търсене и алгоритми за графи
+- [Algorithms in C, Parts 1-5 (Bundle), 3rd Edition](https://www.amazon.com/Algorithms-Parts-1-5-Bundle-Fundamentals/dp/0201756080)
+ - Основни познания, структури от данни, сортиране, търсене и алгоритми за графи
### Python
-- [Data Structures and Algorithms in Python](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/)
- - от Goodrich, Tamassia, Goldwasser
- - Тази книга ми допадна много. Покрива всичко и още нещо
- - 'Питоничен' код
- - Докладът ми за тази книга: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
+- [Data Structures and Algorithms in Python](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/)
+ - от Goodrich, Tamassia, Goldwasser
+ - Тази книга ми допадна много. Покрива всичко и още нещо
+ - 'Питоничен' код
+ - Докладът ми за тази книга: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
### Java
Изборът е ваш:
-- Goodrich, Tamassia, Goldwasser
- - [Data Structures and Algorithms in Java](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/)
-- Sedgewick and Wayne:
- - [Algorithms](https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X/)
- - Безплатен курс в Coursera, който покрива материала от книгата (воден от писателите!):
- - [Algorithms I](https://www.coursera.org/learn/algorithms-part1)
- - [Algorithms II](https://www.coursera.org/learn/algorithms-part2)
+- Goodrich, Tamassia, Goldwasser
+ - [Data Structures and Algorithms in Java](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/)
+- Sedgewick and Wayne:
+ - [Algorithms](https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X/)
+ - Безплатен курс в Coursera, който покрива материала от книгата (воден от писателите!):
+ - [Algorithms I](https://www.coursera.org/learn/algorithms-part1)
+ - [Algorithms II](https://www.coursera.org/learn/algorithms-part2)
### C++
@@ -403,42 +464,48 @@
Това са широко разпространени технологии, но не и част от учебния план:
-- SQL
-- Javascript
-- HTML, CSS, и други front-end технологии
+- SQL
+- Javascript
+- HTML, CSS, и други front-end технологии
## Дневния план
-Този курс преминава през множество от теми. Всяка от тях най-вероятно ще Ви отнеме няколко дена или дори седмица, или повече. Зависи от графика Ви.
+Този курс преминава през множество от теми. Всяка от тях най-вероятно ще Ви отнеме няколко дена или дори седмица, или
+повече. Зависи отграфика Ви.
-Всеки ден взимайте следващата тема в списъка, изгледайте няколко клипа по тази тема и след това напишете имплементацията на въпросната структура от данни или алгоритъм в езика за програмиране, който сте избрали за този курс.
+Всеки ден взимайте следващата тема в списъка, изгледайте няколко клипа по тази тема и след това напишете имплементацията
+на въпросната структура от данни или алгоритъм в езика за програмиране, който сте избрали за този курс.
Можете да видите моя код тук:
-- [C](https://github.com/jwasham/practice-c)
-- [C++](https://github.com/jwasham/practice-cpp)
-- [Python](https://github.com/jwasham/practice-python)
+- [C](https://github.com/jwasham/practice-c)
+- [C++](https://github.com/jwasham/practice-cpp)
+- [Python](https://github.com/jwasham/practice-python)
-Не е нужно да помните всеки алгоритъм наизуст. Необходимо е просто да ги разбирате достатъчно добре, за да можете да напишете собствена имплементация.
+Не е нужно да помните всеки алгоритъм наизуст. Необходимо е просто да ги разбирате достатъчно добре, за да можете да
+напишете собствена имплементация.
## Подготовка за въпроси за програмиране
- Защо това е тук? Аз не съм готов да се явя на интервю.
+Защо това е тук? Аз не съм готов да се явя на интервю.
[Тогава се върни и прочети това.](#3-решавайте-задачи-от-интервюта-по-програмиране-докато-учите)
Защо трябва да се упражнявате да решавате задачи по програмиране:
-- Разпознаване на проблеми и знанието кога и къде да ползвате дадена структура от данни или алгоритъм
-- Събиране на изискванията за задачата
-- Изговаряне на мислите Ви докато решавате както ще правите на интервюто
-- Писане на код върху дъска или лист хартия вместо на компютър
-- Намиране на времевата и пространствената сложност на решенията Ви (вижте Big-O надолу)
-- Тестване на решенията Ви
+- Разпознаване на проблеми и знанието кога и къде да ползвате дадена структура от данни или алгоритъм
+- Събиране на изискванията за задачата
+- Изговаряне на мислите Ви докато решавате както ще правите на интервюто
+- Писане на код върху дъска или лист хартия вместо на компютър
+- Намиране на времевата и пространствената сложност на решенията Ви (вижте Big-O надолу)
+- Тестване на решенията Ви
-Пишете код на дъска или лист хартия вместо на компютър. Тествайте с няколко различни входни данни. След това го напишете и тествайте на компютър.
+Пишете код на дъска или лист хартия вместо на компютър. Тествайте с няколко различни входни данни. След това го напишете
+и тествайте на компютър.
-Ако нямате дъска за писане вкъщи можете да си купите голям тефтер от магазин за арт материали. Можете просто да седите на дивана и да се упражнявате. Това е моята "дъска за дивана". Добавих химикала към снимката за съпоставка на размера. Ако използвате химикал бързо ще ви се поиска да можеше да триете написаното- бързо става мазало. **Аз ползвам молив и гума.**
+Ако нямате дъска за писане вкъщи можете да си купите голям тефтер от магазин за арт материали. Можете просто да седите
+на дивана и да се упражнявате. Това е моята "дъска за дивана". Добавих химикала към снимката за съпоставка на размера.
+Ако използвате химикал бързо ще ви се поиска да можеше да триете написаното - бързо става мазало. **Аз ползвам молив и гума.**

@@ -450,29 +517,29 @@
Решаване на задачи:
-- [Как да намерим решение](https://www.topcoder.com/community/competitive-programming/tutorials/how-to-find-a-solution/)
-- [Как да направим дисекция на условие на задача от Topcoder](https://www.topcoder.com/community/competitive-programming/tutorials/how-to-dissect-a-topcoder-problem-statement/)
+- [Как да намерим решение](https://www.topcoder.com/community/competitive-programming/tutorials/how-to-find-a-solution/)
+- [Как да направим дисекция на условие на задача от Topcoder](https://www.topcoder.com/community/competitive-programming/tutorials/how-to-dissect-a-topcoder-problem-statement/)
Клипове за задачи от интервюта по програмиране:
-- [IDeserve (88 клипа)](https://www.youtube.com/playlist?list=PLamzFoFxwoNjPfxzaWqs7cZGsPYy0x_gI)
-- [Tushar Roy (5 плейлисти)](https://www.youtube.com/user/tusharroy2525/playlists?shelf_id=2&view=50&sort=dd)
- - Супер за насоки за решаване на задачи
-- [Nick White - LeetCode Solutions (187 клипа)](https://www.youtube.com/playlist?list=PLU_sdQYzUj2keVENTP0a5rdykRSgg9Wp-)
- - Добро обяснение на решението и кода
- - Можете да изгледате няколко клипа в малък прозорец от време
-- [FisherCoder - LeetCode Solutions](https://youtube.com/FisherCoder)
+- [IDeserve (88 клипа)](https://www.youtube.com/playlist?list=PLamzFoFxwoNjPfxzaWqs7cZGsPYy0x_gI)
+- [Tushar Roy (5 плейлисти)](https://www.youtube.com/user/tusharroy2525/playlists?shelf_id=2&view=50&sort=dd)
+ - Супер за насоки за решаване на задачи
+- [Nick White - LeetCode Solutions (187 клипа)](https://www.youtube.com/playlist?list=PLU_sdQYzUj2keVENTP0a5rdykRSgg9Wp-)
+ - Добро обяснение на решението и кода
+ - Можете да изгледате няколко клипа в малък прозорец от време
+- [FisherCoder - LeetCode Solutions](https://youtube.com/FisherCoder)
Сайтове със задачи:
-- [LeetCode](https://leetcode.com/)
- - Любимият ми сайт със задачи. Струва си парите за абонамент за времето, в което ще се подготвяте.
- - Вижте клиповете на Nick White и FisherCoder Videos по-горе за насоки със някои задачи.
-- [HackerRank](https://www.hackerrank.com/)
-- [TopCoder](https://www.topcoder.com/)
-- [Geeks for Geeks](https://practice.geeksforgeeks.org/explore/?page=1)
-- [InterviewBit](https://www.interviewbit.com/)
-- [Project Euler](https://projecteuler.net/)
+- [LeetCode](https://leetcode.com/)
+ - Любимият ми сайт със задачи. Струва си парите за абонамент за времето, в което ще се подготвяте.
+ - Вижте клиповете на Nick White и FisherCoder Videos по-горе за насоки със някои задачи.
+- [HackerRank](https://www.hackerrank.com/)
+- [TopCoder](https://www.topcoder.com/)
+- [Geeks for Geeks](https://practice.geeksforgeeks.org/explore/?page=1)
+- [InterviewBit](https://www.interviewbit.com/)
+- [Project Euler](https://projecteuler.net/)
## Да започваме
@@ -482,190 +549,182 @@
## Алгоритмична сложност / Big-O / Асимптотичен анализ
-- Няма нищо за имплементация тук, единствено ще гледате клипове и ще си водите записки! Йей!
-- Има доста клипове тук. Просто изгледайте достатъчно докато не го разберете. Винаги можете да се върнете обратно и да преговорите.
-- Не се притеснявайте ако не разбирате всичката математика, която стои отзад.
-- Трябва просто да можете да изразите сложността на даден алгоритъм чрез Big-O
-- [ ] [Harvard CS50 - Asymptotic Notation (клип)](https://www.youtube.com/watch?v=iOq5kSKqeR4)
-- [ ] [Big O Notations (общ наръчник) (клип)](https://www.youtube.com/watch?v=V6mKVRU1evU)
-- [ ] [Big O Notation (и Omega, и Theta) - най-доброто математично обяснение (клип)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
-- [ ] Skiena:
- - [клип](https://www.youtube.com/watch?v=gSyDMtdPNpU&index=2&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
- - [slides](https://archive.org/details/lecture2_202008)
-- [ ] [UC Berkeley Big O (клип)](https://archive.org/details/ucberkeley_webcast_VIS4YDpuP98)
-- [ ] [Амортизиран анализ (клип)](https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
-- [ ] TopCoder (includes recurrence relations and master theorem):
- - [Computational Complexity: Section 1](https://www.topcoder.com/community/competitive-programming/tutorials/computational-complexity-section-1/)
- - [Computational Complexity: Section 2](https://www.topcoder.com/community/competitive-programming/tutorials/computational-complexity-section-2/)
-- [ ] [Пищови](http://bigocheatsheet.com/)
-- [ ] [[Review] Big-O notation in 5 minutes (video)](https://youtu.be/__vX2sjlpXU)
+- Няма нищо за имплементация тук, единствено ще гледате клипове и ще си водите записки! Йей!
+- Има доста клипове тук. Просто изгледайте достатъчно докато не го разберете. Винаги можете да се върнете обратно и да преговорите.
+- Не се притеснявайте ако не разбирате всичката математика, която стои отзад.
+- Трябва просто да можете да изразите сложността на даден алгоритъм чрез Big-O
+- [ ] [Harvard CS50 - Asymptotic Notation (клип)](https://www.youtube.com/watch?v=iOq5kSKqeR4)
+- [ ] [Big O Notations (общ наръчник) (клип)](https://www.youtube.com/watch?v=V6mKVRU1evU)
+- [ ] [Big O Notation (и Omega, и Theta) - най-доброто математично обяснение (клип)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
+- [ ] Skiena:
+ - [клип](https://www.youtube.com/watch?v=gSyDMtdPNpU&index=2&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
+ - [slides](https://archive.org/details/lecture2_202008)
+- [ ] [UC Berkeley Big O (клип)](https://archive.org/details/ucberkeley_webcast_VIS4YDpuP98)
+- [ ] [Амортизиран анализ (клип)](https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
+- [ ] TopCoder (includes recurrence relations and master theorem):
+ - [Computational Complexity: Section 1](https://www.topcoder.com/community/competitive-programming/tutorials/computational-complexity-section-1/)
+ - [Computational Complexity: Section 2](https://www.topcoder.com/community/competitive-programming/tutorials/computational-complexity-section-2/)
+- [ ] [Пищови](http://bigocheatsheet.com/)
+- [ ] [[Review] Big-O notation in 5 minutes (video)](https://youtu.be/__vX2sjlpXU)
Е, това е достатъчно за тази тема.
-Когато четете "Cracking the Coding Interview" ще срещнете главата, която разглежда тази тема. Накрая на главата има кратък тест, който проверява дали можете да намерите сложността на различни алгоритми. Това е супер преговор и тест.
+Когато четете "Cracking the Coding Interview" ще срещнете главата, която разглежда тази тема. Накрая на главата има
+кратък тест, който проверява дали можете да намерите сложността на различни алгоритми. Това е супер преговор и тест.
## Структури от данни
-- ### Масиви
-
- - [ ] За масивите:
- - [Arrays (клип)](https://www.coursera.org/lecture/data-structures/arrays-OsBSF)
- - [UC Berkeley CS61B - Linear and Multi-Dim Arrays (клип)](https://archive.org/details/ucberkeley_webcast_Wp8oiO_CZZE) (Start watching from 15m 32s)
- - [Dynamic Arrays (клип)](https://www.coursera.org/lecture/data-structures/dynamic-arrays-EwbnV)
- - [Jagged Arrays (клип)](https://www.youtube.com/watch?v=1jtrQqYpt7g)
- - [ ] Имплементирайте вектор (променлив масив с автоматично преоразмеряване):
- - [ ] Упражнявайте се да пишете код, ползвайки масиви и пойнтъри. Ползвайте пойнтъри за преместване към индекс вместо индексиране
- - [ ] New raw data array with allocated memory
- - can allocate int array under the hood, just not use its features
- - start with 16, or if starting number is greater, use power of 2 - 16, 32, 64, 128
- - [ ] size() - номер на елементите
- - [ ] capacity() - номер на елементите, които може да побира
- - [ ] is_empty()
- - [ ] at(index) - връща елемента на дадения индекс, ако индекса е извън границите на масива връща грешка
- - [ ] push(item)
- - [ ] insert(index, item) - вкарва елемента на дадения елемент, измествайки съществуващия елемент на този индекс и всички елементи след него надясно
- - [ ] prepend(item) - може да добавя елементи на индекс 0
- - [ ] pop() - премахва елемент от края и връща стойността му
- - [ ] delete(index) - изтрива елемента на дадения индекс и измества всички елементи след него наляво
- - [ ] remove(item) - търси стойността на елемента и премахва всички индекси, които я съдържат
- - [ ] find(item) - търси стойността на елемента и връща първия индекс, който я съдържа, или -1 ако няма такъв елемент
- - [ ] resize(new_capacity) // private function
- - когато достигнете максималния обем, преоразмерете като дублирате обема
- - когато pop-вате елемент, ако обема на масива е 1/4 от капацитета му, преоразмерете масива наполовина
- - [ ] Време
- - O(1) за добавяне/премахване към края, индексиране или актуализиране
- - O(n) за добавяне/премахване другаде
- - [ ] Пространство
- - contiguous in memory, so proximity helps performance
- - нужно място = (капацитета на масива, който е >= n) \* размера на елемента, но дори 2n, пак е O(n)
-
-- ### Свързани списъци
-
- - [ ] Описание:
- - [ ] [Единично свързани списъци (клип)](https://www.coursera.org/lecture/data-structures/singly-linked-lists-kHhgK)
- - [ ] [CS 61B - Linked Lists 1 (клип)](https://archive.org/details/ucberkeley_webcast_htzJdKoEmO0)
- - [ ] [CS 61B - Linked Lists 2 (клип)](https://archive.org/details/ucberkeley_webcast_-c4I3gFYe3w)
- - [ ] [[Review] Linked lists in 4 minutes (video)](https://youtu.be/F8AbOfQwl1c)
- - [ ] [Код в C (клип)](https://www.youtube.com/watch?v=QN6FPiD0Gzo) - не цялото видео, само частите за Node structs и алокация на памет
- - [ ] Свързани списъци срещу масиви:
- - [Core Linked Lists Vs Arrays (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-linked-lists-vs-arrays-rjBs9)
- - [Свързани списъци срещу масиви в истинския свят (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/in-the-real-world-lists-vs-arrays-QUaUd)
- - [ ] [Защо да избягваме свързаните списъци (клип)](https://www.youtube.com/watch?v=YQs6IC-vgmo)
- - [ ] Аха: трябват Ви pointer to pointer знания:
- (за да можете да подавате pointer към функция, която може да промени адреса, към който сочи pointer-a)
- Тази страница служи само да схванете ptr to ptr. Не препоръчвам този стил на обхождане на списъка. Четливостта и поддържаемостта страдат заради хитрости.
- - [Pointers to Pointers](https://www.eskimo.com/~scs/cclass/int/sx8.html)
- - [ ] Имплементация:
- - [ ] size() - връща броя на елементите
- - [ ] empty() - булева стойност, връща true ако списъка е празен
- - [ ] value_at(index) - връща стойността на n-тия елемент (почвайки от 0 за първия елемент)
- - [ ] push_front(value) - добавя стойност към началото на списъка
- - [ ] pop_front() - премахва първия елемент и връща стойността му
- - [ ] push_back(value) - добавя елемент към края
- - [ ] pop_back() - премахва последния елемент и връща стойността му
- - [ ] front() - взима стойността на първия елемент
- - [ ] back() - взима стойността на последния елемент
- - [ ] insert(index, value) - вкарва елемента на дадения индекс, така че новия елемент да сочи към стария елемент на този индекс
- - [ ] erase(index) - изтрива node-а на дадения индекс
- - [ ] value_n_from_end(n) - връща стойността на node-а, седящ на позиция n от края на списъка
- - [ ] reverse() - обръща списъка
- - [ ] remove_value(value) - премахва първия елемент от списъка, съдържащ тази стойност
- - [ ] Двойно свързан списък
- - [Описание (клип)](https://www.coursera.org/lecture/data-structures/doubly-linked-lists-jpGKD)
- - Няма нужда от имплементация
-
-- ### Стек
-
- - [ ] [Стекове (клип)](https://www.coursera.org/lecture/data-structures/stacks-UdKzQ)
- - [ ] [[Review] Stacks in 3 minutes (video)](https://youtu.be/KcT3aVgrrpU)
- - [ ] Няма нужда да се имплементира. Имплементацията с масив е тривиална.
-
-- ### Опашка
-
- - [ ] [Опашка (клип)](https://www.coursera.org/lecture/data-structures/queues-EShpq)
- - [ ] [Circular buffer/FIFO](https://en.wikipedia.org/wiki/Circular_buffer)
- - [ ] [[Review] Queues in 3 minutes (video)](https://youtu.be/D6gu-_tmEpQ)
- - [ ] Имплементирайте със свързан списък с tail pointer:
- - enqueue(value) - добавя стойност на опашката
- - dequeue() - връща стойността и премахва най-предния елемент на опашката (front)
- - empty()
- - [ ] Имплементрайте с масив с фиксирана големина:
- - enqueue(value) - добавя елемента в края на наличното пространство
- - dequeue() - връща стойността и премахва най-предния елемент на опашката
- - empty()
- - full()
- - [ ] Разход:
- - лоша имплементация, ползвайки свързан списък където правим enqueue в началото и dequeue в края би била O(n)
- защото ще се нуждаете от предпоследния елемент, което ще предизвиква цялостно обхождане при всяко dequeue
- - enqueue: O(1) (amortized, свъзран списък и масив [probing])
- - dequeue: O(1) (свъзран списък и масив)
- - empty: O(1) (свъзран списък и масив)
-
-- ### Хеш таблици
-
- - [ ] Клипове:
-
- - [ ] [Hashing with Chaining (клип)](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8)
- - [ ] [Table Doubling, Karp-Rabin (клип)](https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- - [ ] [Open Addressing, Cryptographic Hashing (клип)](https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- - [ ] [PyCon 2010: The Mighty Dictionary (клип)](https://www.youtube.com/watch?v=C4Kc8xzcA68)
- - [ ] [PyCon 2017: The Dictionary Even Mightier (клип)](https://www.youtube.com/watch?v=66P5FMkWoVU)
- - [ ] [(Advanced) Randomization: Universal & Perfect Hashing (клип)](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11)
- - [ ] [(За напреднали) Perfect hashing (клип)](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4)
- - [ ] [[Review] Hash tables in 4 minutes (video)](https://youtu.be/knV86FlSXJ8)
-
- - [ ] Онлайн курсовe:
-
- - [ ] [Core Hash Tables (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-hash-tables-m7UuP)
- - [ ] [Data Structures (клип)](https://www.coursera.org/learn/data-structures/home/week/4)
- - [ ] [Phone Book Problem (клип)](https://www.coursera.org/lecture/data-structures/phone-book-problem-NYZZP)
- - [ ] Дистрибутирани хеш таблици:
- - [Instant Uploads And Storage Optimization In Dropbox (клип)](https://www.coursera.org/lecture/data-structures/instant-uploads-and-storage-optimization-in-dropbox-DvaIb)
- - [Distributed Hash Tables (клип)](https://www.coursera.org/lecture/data-structures/distributed-hash-tables-tvH8H)
-
- - [ ] Имплементирайте с масив, ползвайки linear probing
- - hash(k, m) - m е размера на хеш таблицата
- - add(key, value) - ако ключа съществува актуализирайте стойността
- - exists(key)
- - get(key)
- - remove(key)
+- ### Масиви
+ - [ ] За масивите:
+ - [Arrays (клип)](https://www.coursera.org/lecture/data-structures/arrays-OsBSF)
+ - [UC Berkeley CS61B - Linear and Multi-Dim Arrays (клип)](https://archive.org/details/ucberkeley_webcast_Wp8oiO_CZZE) (Start watching from 15m 32s)
+ - [Dynamic Arrays (клип)](https://www.coursera.org/lecture/data-structures/dynamic-arrays-EwbnV)
+ - [Jagged Arrays (клип)](https://www.youtube.com/watch?v=1jtrQqYpt7g)
+ - [ ] Имплементирайте вектор (променлив масив с автоматично преоразмеряване):
+ - [ ] Упражнявайте се да пишете код, ползвайки масиви и пойнтъри. Ползвайте пойнтъри за преместване към индекс вместо индексиране
+ - [ ] New raw data array with allocated memory
+ - can allocate int array under the hood, just not use its features
+ - start with 16, or if starting number is greater, use power of 2 - 16, 32, 64, 128
+ - [ ] size() - номер на елементите
+ - [ ] capacity() - номер на елементите, които може да побира
+ - [ ] is_empty()
+ - [ ] at(index) - връща елемента на дадения индекс, ако индекса е извън границите на масива връща грешка
+ - [ ] push(item)
+ - [ ] insert(index, item) - вкарва елемента на дадения елемент, измествайки съществуващия елемент на този индекс и всички елементи след него надясно
+ - [ ] prepend(item) - може да добавя елементи на индекс 0
+ - [ ] pop() - премахва елемент от края и връща стойността му
+ - [ ] delete(index) - изтрива елемента на дадения индекс и измества всички елементи след него наляво
+ - [ ] remove(item) - търси стойността на елемента и премахва всички индекси, които я съдържат
+ - [ ] find(item) - търси стойността на елемента и връща първия индекс, който я съдържа, или -1 ако няма такъв елемент
+ - [ ] resize(new_capacity) // private function
+ - когато достигнете максималния обем, преоразмерете като дублирате обема
+ - когато pop-вате елемент, ако обема на масива е 1/4 от капацитета му, преоразмерете масива наполовина
+ - [ ] Време
+ - O(1) за добавяне/премахване към края, индексиране или актуализиране
+ - O(n) за добавяне/премахване другаде
+ - [ ] Пространство
+ - contiguous in memory, so proximity helps performance
+ - нужно място = (капацитета на масива, който е >= n) \* размера на елемента, но дори 2n, пак е O(n)
+
+- ### Свързани списъци
+ - [ ] Описание:
+ - [ ] [Единично свързани списъци (клип)](https://www.coursera.org/lecture/data-structures/singly-linked-lists-kHhgK)
+ - [ ] [CS 61B - Linked Lists 1 (клип)](https://archive.org/details/ucberkeley_webcast_htzJdKoEmO0)
+ - [ ] [CS 61B - Linked Lists 2 (клип)](https://archive.org/details/ucberkeley_webcast_-c4I3gFYe3w)
+ - [ ] [[Review] Linked lists in 4 minutes (video)](https://youtu.be/F8AbOfQwl1c)
+ - [ ] [Код в C (клип)](https://www.youtube.com/watch?v=QN6FPiD0Gzo) - не цялото видео, само частите за Node structs и алокация на памет
+ - [ ] Свързани списъци срещу масиви:
+ - [Core Linked Lists Vs Arrays (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-linked-lists-vs-arrays-rjBs9)
+ - [Свързани списъци срещу масиви в истинския свят (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/in-the-real-world-lists-vs-arrays-QUaUd)
+ - [ ] [Защо да избягваме свързаните списъци (клип)](https://www.youtube.com/watch?v=YQs6IC-vgmo)
+ - [ ] Аха: трябват Ви pointer to pointer знания:
+ (за да можете да подавате pointer към функция, която може да промени адреса, към който сочи pointer-a)
+ Тази страница служи само да схванете ptr to ptr. Не препоръчвам този стил на обхождане на списъка. Четливостта
+ и поддържаемостта страдат заради хитрости.
+ - [Pointers to Pointers](https://www.eskimo.com/~scs/cclass/int/sx8.html)
+ - [ ] Имплементация:
+ - [ ] size() - връща броя на елементите
+ - [ ] empty() - булева стойност, връща true ако списъка е празен
+ - [ ] value_at(index) - връща стойността на n-тия елемент (почвайки от 0 за първия елемент)
+ - [ ] push_front(value) - добавя стойност към началото на списъка
+ - [ ] pop_front() - премахва първия елемент и връща стойността му
+ - [ ] push_back(value) - добавя елемент към края
+ - [ ] pop_back() - премахва последния елемент и връща стойността му
+ - [ ] front() - взима стойността на първия елемент
+ - [ ] back() - взима стойността на последния елемент
+ - [ ] insert(index, value) - вкарва елемента на дадения индекс, така че новия елемент да сочи към стария елемент на този индекс
+ - [ ] erase(index) - изтрива node-а на дадения индекс
+ - [ ] value_n_from_end(n) - връща стойността на node-а, седящ на позиция n от края на списъка
+ - [ ] reverse() - обръща списъка
+ - [ ] remove_value(value) - премахва първия елемент от списъка, съдържащ тази стойност
+ - [ ] Двойно свързан списък
+ - [Описание (клип)](https://www.coursera.org/lecture/data-structures/doubly-linked-lists-jpGKD)
+ - Няма нужда от имплементация
+
+- ### Стек
+ - [ ] [Стекове (клип)](https://www.coursera.org/lecture/data-structures/stacks-UdKzQ)
+ - [ ] [[Review] Stacks in 3 minutes (video)](https://youtu.be/KcT3aVgrrpU)
+ - [ ] Няма нужда да се имплементира. Имплементацията с масив е тривиална.
+
+- ### Опашка
+ - [ ] [Опашка (клип)](https://www.coursera.org/lecture/data-structures/queues-EShpq)
+ - [ ] [Circular buffer/FIFO](https://en.wikipedia.org/wiki/Circular_buffer)
+ - [ ] [[Review] Queues in 3 minutes (video)](https://youtu.be/D6gu-_tmEpQ)
+ - [ ] Имплементирайте със свързан списък с tail pointer:
+ - enqueue(value) - добавя стойност на опашката
+ - dequeue() - връща стойността и премахва най-предния елемент на опашката (front)
+ - empty()
+ - [ ] Имплементрайте с масив с фиксирана големина:
+ - enqueue(value) - добавя елемента в края на наличното пространство
+ - dequeue() - връща стойността и премахва най-предния елемент на опашката
+ - empty()
+ - full()
+ - [ ] Разход:
+ - лоша имплементация, ползвайки свързан списък където правим enqueue в началото и dequeue в края би била O(n)
+ защото ще се нуждаете от предпоследния елемент, което ще предизвиква цялостно обхождане при всяко dequeue
+ - enqueue: O(1) (amortized, свъзран списък и масив [probing])
+ - dequeue: O(1) (свъзран списък и масив)
+ - empty: O(1) (свъзран списък и масив)
+
+- ### Хеш таблици
+ - [ ] Клипове:
+ - [ ] [Hashing with Chaining (клип)](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8)
+ - [ ] [Table Doubling, Karp-Rabin (клип)](https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
+ - [ ] [Open Addressing, Cryptographic Hashing (клип)](https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
+ - [ ] [PyCon 2010: The Mighty Dictionary (клип)](https://www.youtube.com/watch?v=C4Kc8xzcA68)
+ - [ ] [PyCon 2017: The Dictionary Even Mightier (клип)](https://www.youtube.com/watch?v=66P5FMkWoVU)
+ - [ ] [(Advanced) Randomization: Universal & Perfect Hashing (клип)](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11)
+ - [ ] [(За напреднали) Perfect hashing (клип)](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4)
+ - [ ] [[Review] Hash tables in 4 minutes (video)](https://youtu.be/knV86FlSXJ8)
+ - [ ] Онлайн курсовe:
+ - [ ] [Core Hash Tables (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-hash-tables-m7UuP)
+ - [ ] [Data Structures (клип)](https://www.coursera.org/learn/data-structures/home/week/4)
+ - [ ] [Phone Book Problem (клип)](https://www.coursera.org/lecture/data-structures/phone-book-problem-NYZZP)
+ - [ ] Дистрибутирани хеш таблици:
+ - [Instant Uploads And Storage Optimization In Dropbox (клип)](https://www.coursera.org/lecture/data-structures/instant-uploads-and-storage-optimization-in-dropbox-DvaIb)
+ - [Distributed Hash Tables (клип)](https://www.coursera.org/lecture/data-structures/distributed-hash-tables-tvH8H)
+ - [ ] Имплементирайте с масив, ползвайки linear probing
+ - hash(k, m) - m е размера на хеш таблицата
+ - add(key, value) - ако ключа съществува актуализирайте стойността
+ - exists(key)
+ - get(key)
+ - remove(key)
## Повече знания
-- ### Двоично търсене
- - [ ] [Binary Search (клип)](https://www.youtube.com/watch?v=D5SrAga1pno)
- - [ ] [Binary Search (клип)](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search)
- - [ ] [детайли](https://www.topcoder.com/community/competitive-programming/tutorials/binary-search/)
- - [ ] [[Review] Binary search in 4 minutes (video)](https://youtu.be/fDKIpRe8GW4)
- - [ ] Имплементирайте:
- - двоично търсене (на сортиран масив от integers)
- - двоично търсене чрез рекурсия
-- ### Побитови операции
- - [ ] [Bits cheat sheet](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/bits-cheat-sheet.pdf) - трябва да знаете доста от степените на 2 от (2^1 до 2^16 и 2^32)
- - [ ] Бъдете сигурни, че разбирате добре битовата манипулация: &, |, ^, ~, >>, <<
- - [ ] [думи]()
- - [ ] Добро въведение:
- [Bit Manipulation (клип)](https://www.youtube.com/watch?v=7jkIUgLC29I)
- - [ ] [C Programming Tutorial 2-10: Bitwise Operators (клип)](https://www.youtube.com/watch?v=d0AwjSpNXR0)
- - [ ] [Bit Manipulation](https://en.wikipedia.org/wiki/Bit_manipulation)
- - [ ] [Bitwise Operation](https://en.wikipedia.org/wiki/Bitwise_operation)
- - [ ] [Bithacks](https://graphics.stanford.edu/~seander/bithacks.html)
- - [ ] [The Bit Twiddler](https://bits.stephan-brumme.com/)
- - [ ] [The Bit Twiddler Interactive](https://bits.stephan-brumme.com/interactive.html)
- - [ ] [Bit Hacks (клип)](https://www.youtube.com/watch?v=ZusiKXcz_ac)
- - [ ] [Practice Operations](https://pconrad.github.io/old_pconrad_cs16/topics/bitOps/)
- - [ ] 2s and 1s complement
- - [Binary: Plusses & Minuses (Why We Use Two's Complement) (клип)](https://www.youtube.com/watch?v=lKTsv6iVxV4)
- - [1s Complement](https://en.wikipedia.org/wiki/Ones%27_complement)
- - [2s Complement](https://en.wikipedia.org/wiki/Two%27s_complement)
- - [ ] Преброяване на набор от битове
- - [4 ways to count bits in a byte (клип)](https://youtu.be/Hzuzo9NJrlc)
- - [Count Bits](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan)
- - [How To Count The Number Of Set Bits In a 32 Bit Integer](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer)
- - [ ] Размяна на стойности:
- - [Swap](https://bits.stephan-brumme.com/swap.html)
- - [ ] Абсолютна стойност:
- - [Absolute Integer](https://bits.stephan-brumme.com/absInteger.html)
+- ### Двоично търсене
+ - [ ] [Binary Search (клип)](https://www.youtube.com/watch?v=D5SrAga1pno)
+ - [ ] [Binary Search (клип)](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search)
+ - [ ] [детайли](https://www.topcoder.com/community/competitive-programming/tutorials/binary-search/)
+ - [ ] [[Review] Binary search in 4 minutes (video)](https://youtu.be/fDKIpRe8GW4)
+ - [ ] Имплементирайте:
+ - двоично търсене (на сортиран масив от integers)
+ - двоично търсене чрез рекурсия
+- ### Побитови операции
+ - [ ] [Bits cheat sheet](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/bits-cheat-sheet.pdf) - трябва да знаете доста от степените на 2 от (2^1 до 2^16 и 2^32)
+ - [ ] Бъдете сигурни, че разбирате добре битовата манипулация: &, |, ^, ~, >>, <<
+ - [ ] [думи]()
+ - [ ] Добро въведение: [Bit Manipulation (клип)](https://www.youtube.com/watch?v=7jkIUgLC29I)
+ - [ ] [C Programming Tutorial 2-10: Bitwise Operators (клип)](https://www.youtube.com/watch?v=d0AwjSpNXR0)
+ - [ ] [Bit Manipulation](https://en.wikipedia.org/wiki/Bit_manipulation)
+ - [ ] [Bitwise Operation](https://en.wikipedia.org/wiki/Bitwise_operation)
+ - [ ] [Bithacks](https://graphics.stanford.edu/~seander/bithacks.html)
+ - [ ] [The Bit Twiddler](https://bits.stephan-brumme.com/)
+ - [ ] [The Bit Twiddler Interactive](https://bits.stephan-brumme.com/interactive.html)
+ - [ ] [Bit Hacks (клип)](https://www.youtube.com/watch?v=ZusiKXcz_ac)
+ - [ ] [Practice Operations](https://pconrad.github.io/old_pconrad_cs16/topics/bitOps/)
+ - [ ] 2s and 1s complement
+ - [Binary: Plusses & Minuses (Why We Use Two's Complement) (клип)](https://www.youtube.com/watch?v=lKTsv6iVxV4)
+ - [1s Complement](https://en.wikipedia.org/wiki/Ones%27_complement)
+ - [2s Complement](https://en.wikipedia.org/wiki/Two%27s_complement)
+ - [ ] Преброяване на набор от битове
+ - [4 ways to count bits in a byte (клип)](https://youtu.be/Hzuzo9NJrlc)
+ - [Count Bits](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan)
+ - [How To Count The Number Of Set Bits In a 32 Bit Integer](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer)
+ - [ ] Размяна на стойности:
+ - [Swap](https://bits.stephan-brumme.com/swap.html)
+ - [ ] Абсолютна стойност:
+ - [Absolute Integer](https://bits.stephan-brumme.com/absInteger.html)
## Дървета
@@ -1425,7 +1484,7 @@ Mock интервюта:
- [Design a URL-shortener system: copied from above](http://www.hiredintech.com/system-design/the-system-design-process/)
- [Design a cache system](https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/)
-## Additional Learning
+## Допънителни теми за учене
Добавих тези теми, за да Ви помогна да бъдете по-добри софтуерни инженери и да сте наясно с определени технологии и алгоритми, което ще разшири "инструментите", с които можете да работите
@@ -1456,8 +1515,8 @@ Mock интервюта:
- [Emacs въководство (За начинаещи) -Част 3- Изрази, Твърдения, ~/.emacs файлове и пакети](https://www.youtube.com/watch?v=paSgzPso-yc)
- [Зъл режим(Evil mode): Или как се научих да спра да се тревожа и да заобичам Emacs (клип)](https://www.youtube.com/watch?v=JWD1Fpdd4Pc)
- [Писане на C програми с Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Writing_C_programs_with_Emacs)
- - [Emacs-Наръчник за начинаещи (видео от David Wilson)](https://www.youtube.com/watch?v=48JlgiBpw_I&t=0s)
- - [Emacs-Наръчник за начинаещи (записки на David Wilson)](https://systemcrafters.net/emacs-essentials/absolute-beginners-guide-to-emacs/)
+ - [Emacs-Наръчник за начинаещи (видео от David Wilson)](https://www.youtube.com/watch?v=48JlgiBpw_I&t=0s)
+ - [Emacs-Наръчник за начинаещи (записки на David Wilson)](https://systemcrafters.net/emacs-essentials/absolute-beginners-guide-to-emacs/)
- ### Unix command line tools