# Coding Interview University

> Първоначално създадох това като кратък списък с теми за учене, за това как се става софтуерен инженер, но то прерасна в този огромен списък, който виждате в момента. След като преминах през този учебен план, [бях нает като софтуерен инженер в 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)
>
> **Моля обърнете внимание:** Няма да Ви се налага да учите колкото мен. Загубих много време, учейки неща, които нямах нужда да знам. Може да прочетете повече за това надолу. Ще Ви помогна да достигнете до крайната цел без да прахосвате скъпото си време.
>
> Темите, изредени тук, ще Ви подготвят добре за техническо интервю за почти всяка една компания, включително гигантите Amazon, Facebook, Google и Microsoft
>
> _Пожелавам Ви успех!_

<details>
<summary>Преводи:</summary>

-   [中文版本](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)

</details>

<details>
<summary>Текущи преводи:</summary>

-   [हिन्दी](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)

</details>

<div align="center">
	<hr />
    <p>
        <a href="https://github.com/sponsors/jwasham"><strong>Become a sponsor</strong> and support Coding Interview University!</a>
    </p>
    <p>
        <strong>Special thanks to:</strong>
    </p>
    <p>
        <a href="https://oss.capital/">
            <div>
                <img src="https://d3j2pkmjtin6ou.cloudfront.net/sponsors/oss-capital.svg" width="350" alt="OSS Capital">
            </div>
            <div>
                <sup><strong>Founded in 2018, OSS Capital is the first and only venture capital platform focused<br>exclusively on supporting early-stage COSS (commercial open source) startup founders.</strong></sup>
            </div>
        </a>
    </p>
    <br />
    <p>
        <a href="https://www.gitpod.io/?utm_campaign=jwasham&utm_medium=referral&utm_content=coding-interview-university&utm_source=github">
            <div>
                <img src="https://d3j2pkmjtin6ou.cloudfront.net/sponsors/gitpod-logo-light-theme.svg" width="300" alt="Gitpod">
            </div>
            <div>
                <p>
                    <strong>Dev environments built for the cloud</strong>
                </p>
            </div>
            <div>
                <sup>Natively integrated with GitLab, GitHub, and Bitbucket, Gitpod automatically and continuously prebuilds dev environments for all your branches. As a result team members can instantly start coding with fresh dev environments for each new task - no matter if you are building a new feature, want to fix a bug, or work on a code review.</sup>
            </div>
        </a>
    </p>
    <hr />
</div>

## Какво е това?

![Coding at the whiteboard - from HBO's Silicon Valley](https://d3j2pkmjtin6ou.cloudfront.net/coding-at-the-whiteboard-silicon-valley.png)

Това е моят многомесечен план за ставане на софтуерен инженер към голяма компания.

**Изисквания:**

-   Малко опит с програмиране (променливи, цикли, методи/функции и т.н)
-   Търпение
-   Време

Обърнете внимание, че това е учебен план за **софтуерно инженерство**, а не за уеб разработка. Големите компании като Google, Amazon, Facebook и Microsoft различават софтуерното инженерство и уеб разработката. Amazon, например, имат Frontend инженери (FEE) и Software Development инженери (SDE). Това са 2 отделни позиции и интервютата за тях няма да са еднакви, тъй като всяка една от тях има своите специфики. Тези компании изискват знания по компютърни науки за позиции свързани със софтуерно инженерство/разработка

---

## Съдържание

### Учебният план

-   [Какво е това?](#какво-е-това)
-   [Защо да го ползвате?](#защо-да-го-ползвате)
-   [Как да го ползвате?](#как-да-го-ползвате)
-   [Не мислете, че не сте достатъчно умни](#не-мислете-че-не-сте-достатъчно-умни)
-   [Бележка за видео ресурсите](#бележка-за-видео-ресурсите)
-   [Изберете език за програмиране](#изберете-език-за-програмиране)
-   [Книги за структури от данни и алгоритми](#книги-за-структури-от-данни-и-алгоритми)
-   [Книги за подготовка за интервю](#книги-за-подготовка-за-интервю)
-   [Не повтаряйте грешките ми](#не-повтаряйте-грешките-ми)
-   [Какво няма да намерите тук](#какво-няма-да-намерите-тук)
-   [Дневния план](#дневния-план)
-   [Подготовка за въпроси за програмиране](#подготовка-за-въпроси-за-програмиране)
-   [Задачи по програмиране](#задачи-по-програмиране)

### Теми за учене

-   [Алгоритмична сложност / 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)

---

## Защо да го ползвате?

Ако искате да работите като софтуерен инженер в голяма компания, това са нещата, които трябва да знаете.

Ако също като мен не сте учили компютърни науки в университет това ще Ви помогне да наваксате и ще Ви спести години.

Когато започнах този проект не знаех какво е стек или опашка, нямах представа какво е Big-O, не знаех нищо за дървета или как да обхождам графи. Ако трябваше да напиша сортиращ алгоритъм мога да Ви кажа, че бих се справил ужасно. Всяка от структурите от данни, които бях използвал досега бяха имплементирани в езика, който ползвах и нямах представа как работят реално. Никога не ми се беше налагало да управлявам памет освен ако някой от процесите, които бях пуснал не връщаха грешка "out of memory"- тогава се налагаше да търся заобиколен път. Бях ползвал хиляди асоциативни масиви и многоизмерни масиви няколко пъти, но никога преди не бях имплементирал структури от данни от нулата.

Планът е дълъг. Може да Ви отнеме месеци. Ако вече сте запознати с повечето от темите ще Ви отнеме много по-малко

## Как да го ползвате

Всичко надолу е само схематично изложение и трябва да преминете през темите от горе до долу.

## Не мислете, че не сте достатъчно умни

-   Успешните софтуерни инженери са умни, но много имат чувството, че не са достатъчно умни
-   [Митът за гениалния програмист](https://www.youtube.com/watch?v=0SARbwvhupQ)
-   [Опасно е да сте сами: битката с невидимите чудовища в IT](https://www.youtube.com/watch?v=1i8ylq4j_EY)

## Бележка за видео ресурсите

Някои видеа са достъпни само след записване в курс на Coursera или EdX- т.нар. MOOCs. Понякога се налага да изчакате няколко месеца, за да стартира ново издание на курса, така че няма да имате достъп до тях.

Би било чудесно такива ресурси да бъдат заменени с безплатни и свободнодостъпни публични източници като YouTube видеа (по възможност университетски лекции), за да могат всички да учат навсякъде и по всяко време, а не само когато даден курс върви в момента.

## Изберете език за програмиране

Трябва да изберете език за програмиране за интервютата на които ще се явявате, но също така трябва да изберете език, който можете да ползвате за учене на концепции от компютърните науки.

Желателно е този език да е един и същ, така ще Ви се налага да владеете само един език.

### За този учебен план

Когато преминавах през учебния план ползвах 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: модерен и много експресивен. Научих го защото е наистина много полезен и ми позволява да пиша по-малко код когато съм на интервю.

Това е моя личен избор. Вие можете да изберете каквото пожелаете, разбира се.

Може да не Ви трябват, но ето някои сайтове за учене на нов език:

-   [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

Може да ползвате и тези, но поразгледайте преди това, защото може да има уловки:

-   JavaScript
-   Ruby

Това е статия, която написах за избирането на език за вашето интервю:
[Pick One Language for the Coding Interview](https://startupnextdoor.com/important-pick-one-language-for-the-coding-interview/).
Това е оригиналната статия, на която базирах моя пост: http://blog.codingforinterviews.com/best-programming-language-jobs/

Трябва да се чувствате много удобно с вашия език и да сте знаещи.

Повече за вариантите:

-   [Изберете правилния език за вашето интервю по програмиране](http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/)

[Вижте ресурси за специфични езици тук](programming-language-resources.md)

## Книги за структури от данни и алгоритми

Тази книга ще положи вашата основа в компютърните науки.

Просто изберете една в език, с който ще се чувствате комфортно. Ще трябва да четете и да пишете код доста.

### C

-   [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/

### 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)

### C++

Изборът е ваш:

-   Goodrich, Tamassia, and Mount
    -   [Data Structures and Algorithms in C++, 2nd Edition](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/0470383275)
-   Sedgewick and Wayne
    -   [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/)
    -   [Algorithms in C++ Part 5: Graph Algorithms](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/)

## Книги за подготовка за интервю

Няма нужда да купувате цял куп от тези книги. Честно казано "Cracking the Coding Interview" най-вероятно ще Ви бъде достатъчна, но аз си купих повече, за да се упражня по-добре. Но аз винаги правя прекалено много.

Купих тези двете, дадоха ми предостатъчно упражнение.

-   [Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition](https://www.amazon.com/Programming-Interviews-Exposed-Through-Interview/dp/111941847X/)
    -   Отговори в C++ и Java
    -   Това е добра подготовка за "Cracking the Coding Interview"
    -   Не е прекалено сложна. Повечето проблеми са по-лесни от тези, които ще срещнете на интервю (от това, което аз съм прочел)
-   [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/)
    -   отговори в Java

### Ако имате изобилие от време:

Изберете една:

-   [Elements of Programming Interviews (C++ version)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836)
-   [Elements of Programming Interviews in Python](https://www.amazon.com/Elements-Programming-Interviews-Python-Insiders/dp/1537713949/)
-   [Elements of Programming Interviews (Java version)](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/) - [Companion Project - Method Stub and Test Cases for Every Problem in the Book](https://github.com/gardncl/elements-of-programming-interviews)

## Не повтаряйте грешките ми

Този списък се разрасна с времето и да, нещата излязоха извън контрол.

Споделям някои от грешките, които направих, за да имате по-добро преживяване и за да си спестите месеци с време.

### 1. Няма да запомните всичко

Изгледах часове с клипове и водих записки за всичко, но след месеци имаше доста неща, които не си спомнях. Прекарах 3 дена преразглеждайки бележките си, за да си припомня някои неща. Не се нуждаех от всичките тези знания.

Моля, прочетете това, за да не повторите грешките миЛ

[Да запазваме знания свързани с компютърни науки](https://startupnextdoor.com/retaining-computer-science-knowledge/).

### 2. Използвайте флаш карти

За да се справя с проблема си направих малък сайт за флаш карти, където можех да добавям 2 вида карти: общи и такива с код. Всяка карта има ралично форматиране. Направих сайта mobile-first, за да мога да ги разглеждам от телефона или таблета си, навсякъде където съм.

Направете свои безплатно:

-   [Flashcards site repo](https://github.com/jwasham/computer-science-flash-cards)

**НЕ ПРЕПОРЪЧВАМ да ползвате моите флаш карти.** Има прекалено много и някои от тях съдържат информация, която не е нужно да знаете.

Но ако не искате да ме послушате, ето:

-   [Базата ми от данни с флаш карти (1200 карти)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham.db):
-   [Базата ми от данни с флаш карти (екстремно - 1800 карти)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham-extreme.db):

Забележете, че аз прекалих и имам карти, които покриват всичко от assembly language и Python Trivia до machine learning и статистика. Прекалено много е за това, което се изисква.

**Бележка за флаш картите:** Първия път когато видите, че знаете отговора, не я отбелязвайте като "позната". Трябва да видите същата карта и отговора няколко пъти, преди наистина да знаете отговора. Повторението ще накара мозъка Ви наистина да запамети знанието.

### 3. Решавайте задачи от интервюта по програмиране докато учите

ТОВА Е МНОГО ВАЖНО.

Почнете да решавате задачи от интервюта по програмиране докато учите структури от данни и алгоритми.

Трябва да прилагате това, което учите като решавате задачи иначе ще забравите. Аз направих тази грешка.

Когато сте научили някоя тема и се чувствате що годе комфортно с нея, например **linked lists**:

1. Отворете една от [книгите за интервю за програмиране](#книги-за-подготовка-за-интервю) (или един от сайтовете със задачи, изредени по-долу)
1. Решете 2-3 задачи свързани с linked lists.
1. Продължете към следващата тема.
1. По-късно се върнете и отново решете 2-3 задачи свързани с linked lists.
1. Повтаряйте това с всяка нова тема, която учите.

**Продължавайте да решавате задачи докато учите всичко това, а не след това.**

Няма да ви наемат за знанията, които имате, а за това как ги прилагате.

Има много ресурси свързани с това надолу. Продължавайте да четете.

### 4. Фокусирайте се

Има много неща, които могат да отвлекат вниманието Ви и да Ви загубят ценно време. Да сте концентрирани е трудно. Пуснете си музика без текст и ще можете да се фокусирате сравнително добре.

## Какво няма да намерите тук

Това са широко разпространени технологии, но не и част от учебния план:

-   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)

Не е нужно да помните всеки алгоритъм наизуст. Необходимо е просто да ги разбирате достатъчно добре, за да можете да напишете собствена имплементация.

## Подготовка за въпроси за програмиране

    Защо това е тук? Аз не съм готов да се явя на интервю.

[Тогава се върни и прочети това.](#3-решавайте-задачи-от-интервюта-по-програмиране-докато-учите)

Защо трябва да се упражнявате да решавате задачи по програмиране:

-   Разпознаване на проблеми и знанието кога и къде да ползвате дадена структура от данни или алгоритъм
-   Събиране на изискванията за задачата
-   Изговаряне на мислите Ви докато решавате както ще правите на интервюто
-   Писане на код върху дъска или лист хартия вместо на компютър
-   Намиране на времевата и пространствената сложност на решенията Ви (вижте Big-O надолу)
-   Тестване на решенията Ви

Пишете код на дъска или лист хартия вместо на компютър. Тествайте с няколко различни входни данни. След това го напишете и тествайте на компютър.

Ако нямате дъска за писане вкъщи можете да си купите голям тефтер от магазин за арт материали. Можете просто да седите на дивана и да се упражнявате. Това е моята "дъска за дивана". Добавих химикала към снимката за съпоставка на размера. Ако използвате химикал бързо ще ви се поиска да можеше да триете написаното- бързо става мазало. **Аз ползвам молив и гума.**

![моята дъска за дивана](https://d3j2pkmjtin6ou.cloudfront.net/art_board_sm_2.jpg)

**Когато се упражнявате да решавате задачи по програмиране не трябва да помните решенията наизуст.**

## Задачи по програмиране

Не забравяйте основните книги за подготовка за интервюто по програмиране [тук](#книги-за-подготовка-за-интервю)

Решаване на задачи:

-   [Как да намерим решение](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)

Сайтове със задачи:

-   [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/)

## Да започваме

Добре, стига сме говорили, нека да учим!

Но не забравяйте да решавате задачи от източниците по-горе докато учите!

## Алгоритмична сложност / 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/)

Е, това е достатъчно за тази тема.

Когато четете "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)
    -   [ ] [Код в 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)
    -   [ ] Няма нужда да се имплементира. Имплементацията с масив е тривиална.

-   ### Опашка

    -   [ ] [Опашка (клип)](https://www.coursera.org/lecture/data-structures/queues-EShpq)
    -   [ ] [Circular buffer/FIFO](https://en.wikipedia.org/wiki/Circular_buffer)
    -   [ ] Имплементирайте със свързан списък с 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)

    -   [ ] Онлайн курсов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/)
    -   [ ] Имплементирайте:
        -   двоично търсене (на сортиран масив от 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)
    -   [ ] Бъдете сигурни, че разбирате добре битовата манипулация: &, |, ^, ~, >>, <<
        -   [ ] [думи](<https://en.wikipedia.org/wiki/Word_(computer_architecture)>)
        -   [ ] Добро въведение:
                [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)

## Дървета

-   ### Дървета - бележки & основи

    -   [ ] [Серия: Дървета (клип)](https://www.coursera.org/lecture/data-structures/trees-95qda)
    -   основна структура на дървото
    -   обхождане
    -   алгоритми за манипулиране
    -   [ ] [BFS(обхождане в ширина) and DFS(обхождане в дълбочина) (клип)](https://www.youtube.com/watch?v=uWL6FJhq5fM)
        -   бележки за BFS:
            -   level order (BFS, using queue)
            -   времева сложност O(n)
            -   пространствена сложност: в най-добрия случай: O(1), в най-лошия случай: O(n/2)=O(n)
        -   бележки за DFS:
            -   времева сложност: O(n)
            -   пространствена сложност:
                в най-добрия случай: O(log n) - средна височина на дървото
                в най-добрия случай: O(n)
            -   inorder (DFS: ляво, self, дясно)
            -   postorder (DFS: ляво, дясно, self)
            -   preorder (DFS: self, ляво, дясно)

-   ### Дървета за двоично търсене: BSTs

    -   [ ] [Преговор над двоични дървета за търсене (клип)](https://www.youtube.com/watch?v=x6At0nzX92o&index=1&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
    -   [ ] [Въведение (клип)](https://www.coursera.org/learn/data-structures/lecture/E7cXP/introduction)
    -   [ ] [MIT (клип)](https://www.youtube.com/watch?v=9Jry5-82I68)
    -   C/C++:
        -   [ ] [Двоично дърво за търсене - имплементация в C/C++ (клип)](https://www.youtube.com/watch?v=COZK7NATh4k&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=28)
        -   [ ] [BST имплементация - memory allocation in stack and heap (клип)](https://www.youtube.com/watch?v=hWokyBoo0aI&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=29)
        -   [ ] [Намиране на мин. и макс. елемент в двоично дърво за търсенея (клип)](https://www.youtube.com/watch?v=Ut90klNN264&index=30&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
        -   [ ] [Намиране на височината на двоично дърво (клип)](https://www.youtube.com/watch?v=_pnqMz5nrRs&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=31)
        -   [ ] [Обхождане на двоично дърво - стратегии за обхождане по ширина и по дълбочина (клип)](https://www.youtube.com/watch?v=9RHO6jU--GU&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=32)
        -   [ ] [Двоично дърво: преминаване на порядъка на ниво (клип)](https://www.youtube.com/watch?v=86g8jAQug04&index=33&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
        -   [ ] [Обхождане на двоично дърво: Preorder, Inorder, Postorder (клип)](https://www.youtube.com/watch?v=gm8DUJJhmY4&index=34&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
        -   [ ] [Проверка дали двоично дърво е двоично дърво за търсене (клип)](https://www.youtube.com/watch?v=yEwSGhSsT0U&index=35&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
        -   [ ] [Изтриване на възел от двоично дърво за търсене (клип)](https://www.youtube.com/watch?v=gcULXE7ViZw&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=36)
        -   [ ] [Редовен наследник в двоично дърво (клип)](https://www.youtube.com/watch?v=5cPbNCrdotA&index=37&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
    -   [ ] Имплементирайте:
        -   [ ] insert // вкарване на стойност в дървото
        -   [ ] get_node_count // вземане на бройката на запазените стойности
        -   [ ] print_values // принтира стойностите в дървото от най-малкия до най-големия
        -   [ ] delete_tree
        -   [ ] is_in_tree // връща true ако дадената стойност съществува в дървото
        -   [ ] get_height // returns the height in nodes (single node's height is 1)
        -   [ ] get_min // връща най-малката стойност, съхранявана в дървото
        -   [ ] get_max // връща най-голямата стойност, съхранявана в дървото
        -   [ ] is_binary_search_tree
        -   [ ] delete_value
        -   [ ] get_successor // връща следващата най-голяма стойност след дадената, -1 ако такава не съществува

-   ### Heap / Priority Queue / Binary Heap
    -   визуализира се като дърво, но обикновенно е линейна структура (масив, свързан списък)
    -   [ ] [Heap](<https://en.wikipedia.org/wiki/Heap_(data_structure)>)
    -   [ ] [Въведение (клип)](https://www.coursera.org/learn/data-structures/lecture/2OpTs/introduction)
    -   [ ] [Наивни имплементации (клип)](https://www.coursera.org/learn/data-structures/lecture/z3l9N/naive-implementations)
    -   [ ] [Двоични дървета (клип)](https://www.coursera.org/learn/data-structures/lecture/GRV2q/binary-trees)
    -   [ ] [Tree Height Remark (клип)](https://www.coursera.org/learn/data-structures/supplement/S5xxz/tree-height-remark)
    -   [ ] [Основни операции (клип)](https://www.coursera.org/learn/data-structures/lecture/0g1dl/basic-operations)
    -   [ ] [Завършени двоични дървета (клип)](https://www.coursera.org/learn/data-structures/lecture/gl5Ni/complete-binary-trees)
    -   [ ] [Псевдокод (клип)](https://www.coursera.org/learn/data-structures/lecture/HxQo9/pseudocode)
    -   [ ] [Heap Sort - jumps to start (клип)](https://youtu.be/odNJmw5TOEE?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3291)
    -   [ ] [Heap Sort (клип)](https://www.coursera.org/learn/data-structures/lecture/hSzMO/heap-sort)
    -   [ ] [Създаване на heap (клип)](https://www.coursera.org/learn/data-structures/lecture/dwrOS/building-a-heap)
    -   [ ] [MIT: Heaps and Heap Sort (клип)](https://www.youtube.com/watch?v=B7hVxCmfPtM&index=4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
    -   [ ] [CS 61B Lecture 24: Priority Queues (клип)](https://archive.org/details/ucberkeley_webcast_yIUFT6AKBGE)
    -   [ ] [Linear Time BuildHeap (max-heap)](https://www.youtube.com/watch?v=MiyLo8adrWw)
    -   [ ] Имплементирайте max-heap:
        -   [ ] insert
        -   [ ] sift_up - нужно е за insert
        -   [ ] get_max - връща най-голямата стойност без да я премахва
        -   [ ] get_size() - връща броя на елементите
        -   [ ] is_empty() - връща true ако heap-a не съдържа елементи
        -   [ ] extract_max - връща най-големия елемент и го премахва
        -   [ ] sift_down - нужно е за extract_max
        -   [ ] remove(x) - премахва елемента на индекс x
        -   [ ] heapify - създава heap от масив от елементи, нужно е за heap_sort
        -   [ ] heap_sort() - превръща несортиран масив в сортиран такъв, ползвайки max heap или min heap

## Сортиране

-   [ ] Бележки:

    -   Имплементирайте алгоритми за сортиране и знайте сложността в средния/ най-добрия/ най-лошия случай:
        -   без bubble sort - ужасен алгоритъм е - O(n^2), освен когато n <= 16
    -   [ ] Стабилност при сортиращите алгоритми ("Стабилен ли е Quicksort?")
        -   [Стабилност на сортиращите алгоритми](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)
        -   [Стабилност на сортиращите алгоритми](http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms)
        -   [Стабилност на сортиращите алгоритми](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/)
        -   [Стабилност на сортиращите алгоритми](http://homepages.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf)
    -   [ ] Кои алгоритми могат да се ползват чрез свързани списъци? Кои чрез масиви? Кои чрез двете?
        -   Не бих препоръчал да сортирате свързан списък, но би станало с merge sort.
        -   [Merge Sort за свързани списъци](http://www.geeksforgeeks.org/merge-sort-for-linked-list/)

-   За heapsort, вижте Heap структурата от данни по-горе. Heapsort е чудесен, но не е стабилен

-   [ ] [Sedgewick - Mergesort (5 клипа)](https://www.coursera.org/learn/algorithms-part1/home/week/3)

    -   [ ] [1. Mergesort](https://www.coursera.org/learn/algorithms-part1/lecture/ARWDq/mergesort)
    -   [ ] [2. Bottom up Mergesort](https://www.coursera.org/learn/algorithms-part1/lecture/PWNEl/bottom-up-mergesort)
    -   [ ] [3. Сортираща сложност](https://www.coursera.org/learn/algorithms-part1/lecture/xAltF/sorting-complexity)
    -   [ ] [4. Компаратори](https://www.coursera.org/learn/algorithms-part1/lecture/9FYhS/comparators)
    -   [ ] [5. Стабилност](https://www.coursera.org/learn/algorithms-part1/lecture/pvvLZ/stability)

-   [ ] [Sedgewick - Quicksort (4 клипа)](https://www.coursera.org/learn/algorithms-part1/home/week/3)

    -   [ ] [1. Quicksort](https://www.coursera.org/learn/algorithms-part1/lecture/vjvnC/quicksort)
    -   [ ] [2. Селекция](https://www.coursera.org/learn/algorithms-part1/lecture/UQxFT/selection)
    -   [ ] [3. Дублиращи се ключове](https://www.coursera.org/learn/algorithms-part1/lecture/XvjPd/duplicate-keys)
    -   [ ] [4. System Sorts](https://www.coursera.org/learn/algorithms-part1/lecture/QBNZ7/system-sorts)

-   [ ] UC Berkeley:

    -   [ ] [CS 61B Lecture 29: Sorting I (клип)](https://archive.org/details/ucberkeley_webcast_EiUvYS2DT6I)
    -   [ ] [CS 61B Lecture 30: Sorting II (клип)](https://archive.org/details/ucberkeley_webcast_2hTY3t80Qsk)
    -   [ ] [CS 61B Lecture 32: Sorting III (клип)](https://archive.org/details/ucberkeley_webcast_Y6LOLpxg6Dc)
    -   [ ] [CS 61B Lecture 33: Sorting V (клип)](https://archive.org/details/ucberkeley_webcast_qNMQ4ly43p4)

-   [ ] [Bubble Sort (клип)](https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB)
-   [ ] [Анализ на Bubble Sort (клип)](https://www.youtube.com/watch?v=ni_zk257Nqo&index=7&list=PL89B61F78B552C1AB)
-   [ ] [Insertion Sort, Merge Sort (клип)](https://www.youtube.com/watch?v=Kg4bqzAqRBM&index=3&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
-   [ ] [Insertion Sort (клип)](https://www.youtube.com/watch?v=c4BRHC7kTaQ&index=2&list=PL89B61F78B552C1AB)
-   [ ] [Merge Sort (клип)](https://www.youtube.com/watch?v=GCae1WNvnZM&index=3&list=PL89B61F78B552C1AB)
-   [ ] [Quicksort (клип)](https://www.youtube.com/watch?v=y_G9BkAm6B8&index=4&list=PL89B61F78B552C1AB)
-   [ ] [Selection Sort (клип)](https://www.youtube.com/watch?v=6nDMgr0-Yyo&index=8&list=PL89B61F78B552C1AB)

-   [ ] Код за Merge sort:
    -   [ ] [Using output array (C)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/sorting/mergesort.c)
    -   [ ] [Using output array (Python)](https://github.com/jwasham/practice-python/blob/master/merge_sort/merge_sort.py)
    -   [ ] [In-place (C++)](https://github.com/jwasham/practice-cpp/blob/master/merge_sort/merge_sort.cc)
-   [ ] Код за Quick sort:

    -   [ ] [Имплементация (C)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/randomization/quick.c)
    -   [ ] [Имплементация (C)](https://github.com/jwasham/practice-c/blob/master/quick_sort/quick_sort.c)
    -   [ ] [Имплементация (Python)](https://github.com/jwasham/practice-python/blob/master/quick_sort/quick_sort.py)

-   [ ] Имплементирайте:

    -   [ ] Mergesort: O(n log n) сложност в средния/ най-лошия случай
    -   [ ] Quicksort O(n log n) сложност в средния случай
    -   Selection sort и insertion sort са със сложност O(n^2) в средния/ най-лошия случай
    -   За heapsort, вижте Heap структурата от данни нагоре

-   [ ] Не е задължително, но препоръчвам:
    -   [ ] [Sedgewick - Radix Sorts (6 клипа)](https://www.coursera.org/learn/algorithms-part2/home/week/3)
        -   [ ] [1. Низове в Java](https://www.coursera.org/learn/algorithms-part2/lecture/vGHvb/strings-in-java)
        -   [ ] [2. Key Indexed Counting](https://www.coursera.org/learn/algorithms-part2/lecture/2pi1Z/key-indexed-counting)
        -   [ ] [3. Least Significant Digit First String Radix Sort](https://www.coursera.org/learn/algorithms-part2/lecture/c1U7L/lsd-radix-sort)
        -   [ ] [4. Most Significant Digit First String Radix Sort](https://www.coursera.org/learn/algorithms-part2/lecture/gFxwG/msd-radix-sort)
        -   [ ] [5. 3 Way Radix Quicksort](https://www.coursera.org/learn/algorithms-part2/lecture/crkd5/3-way-radix-quicksort)
        -   [ ] [6. Suffix Arrays](https://www.coursera.org/learn/algorithms-part2/lecture/TH18W/suffix-arrays)
    -   [ ] [Radix Sort](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#radixSort)
    -   [ ] [Radix Sort (video)](https://www.youtube.com/watch?v=xhr26ia4k38)
    -   [ ] [Radix Sort, Counting Sort (linear time given constraints) (video)](https://www.youtube.com/watch?v=Nz1KZXbghj8&index=7&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
    -   [ ] [Randomization: Matrix Multiply, Quicksort, Freivalds' algorithm (video)](https://www.youtube.com/watch?v=cNB2lADK3_s&index=8&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
    -   [ ] [Сортиране в линейно време (клип)](https://www.youtube.com/watch?v=pOKy3RZbSws&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=14)

Като обобщение, това е визуализация на [15 алгоритъма за сортиране](https://www.youtube.com/watch?v=kPRA0W1kECg).
Ако ви трябват повече детайли на тази тема вижте секцията "Сортиране" в[Допълнителни детайли по някои теми](#допълнителни-детайли-по-някои-теми)

## Графи

Графите могат да се ползват за онагледяване на много проблеми в компютърните науки, така че тази секция е дълга, също както тази за дърветата и сортирането..

-   Бележки:

    -   Има 4 основни начина една графа да бъде представена в паметта:
        -   обекти и пойнтъри
        -   матрици на съседство
        -   списъци на съседство
        -   мап на съседство
    -   Запознайте се с всяка от начините за представяне и плюсовете, и минусите, които предоставят
    -   BFS и DFS - знайте изчислителната им сложност, компромисите, които носят и как да ги имплементирате в истински код
    -   Когато Ви зададат въпрос, първо потърсете решение с граф и преминете нататък ако няма такова

-   [ ] MIT(клипове):

    -   [ ] [Обхождане по ширина](https://www.youtube.com/watch?v=s-CYnVz-uh4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=13)
    -   [ ] [Обхождане по дълбочина](https://www.youtube.com/watch?v=AfSk24UTFS8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=14)

-   [ ] Skiena Lectures - чудесно въведение:

    -   [ ] [CSE373 2012 - Лекция 11 - Граф като структура от данни (клип)](https://www.youtube.com/watch?v=OiXxhDrFruw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=11)
    -   [ ] [CSE373 2012 - Лекция 12 - Обхождане по ширина (клип)](https://www.youtube.com/watch?v=g5vF8jscteo&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=12)
    -   [ ] [CSE373 2012 - Лекция 13 - Алгоритми за графи (клип)](https://www.youtube.com/watch?v=S23W6eTcqdY&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=13)
    -   [ ] [CSE373 2012 - Лекция 14 - Алгоритми за графи (продължение) (клип)](https://www.youtube.com/watch?v=WitPBKGV0HY&index=14&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
    -   [ ] [CSE373 2012 - Лекция 15 - Алгоритми за графи (продължение 2) (клип)](https://www.youtube.com/watch?v=ia1L30l7OIg&index=15&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
    -   [ ] [CSE373 2012 - Лекция 16 - Алгоритми за графи (продължение 3) (клип)](https://www.youtube.com/watch?v=jgDOQq6iWy8&index=16&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)

-   [ ] Графи (преговор и повече):

    -   [ ] [6.006 Задача за най-кратък път от един източник (клип)](https://www.youtube.com/watch?v=Aa2sqUhIn-E&index=15&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
    -   [ ] [6.006 Дейкстра (клип)](https://www.youtube.com/watch?v=2E7MmKv0Y24&index=16&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
    -   [ ] [6.006 Белман-Форд (клип)](https://www.youtube.com/watch?v=ozsuci5pIso&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=17)
    -   [ ] [6.006 Как да забързаме Дейкстра (клип)](https://www.youtube.com/watch?v=CHvQ3q_gJ7E&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=18)
    -   [ ] [Aduni: Алгоритми за графи I - Топологично сортиране, Минимално обхващащи дървета, Алгоритъм на Прим - Лекция 6 (клип)](https://www.youtube.com/watch?v=i_AQT_XfvD8&index=6&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
    -   [ ] [Aduni: Алгоритми за графи II - DFS, BFS, Алгоритъм на Крускал, Union Find структура от данни - Лекция 7 (клип)](https://www.youtube.com/watch?v=ufj5_bppBsA&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=7)
    -   [ ] [Aduni: Алгоритми за графи III: Най-кратък път - Лекция 8 (клип)](https://www.youtube.com/watch?v=DiedsPsMKXc&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=8)
    -   [ ] [Aduni: Алгоритми за графи IV: Въведение в геометричните алгоритми - Лекция 9 (клип)](https://www.youtube.com/watch?v=XIAQRlNkJAw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=9)
    -   [ ] ~~[CS 61B 2014 (от 58:09) (клип)](https://youtu.be/dgjX4HdMI-Q?list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&t=3489)~~
    -   [ ] [CS 61B 2014: Претеглени графи (клип)](https://archive.org/details/ucberkeley_webcast_zFbq8vOZ_0k)
    -   [ ] [Алчни алгоритми: Минимално обхващащо дърво (клип)](https://www.youtube.com/watch?v=tKwnms5iRBU&index=16&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
    -   [ ] [Алгоритъм за граф на Kosaraju за силно свързани компоненти (клип)](https://www.youtube.com/watch?v=RpgcYiky7uw)

-   Пълен курс в Coursera:

    -   [ ] [Алгоритми за графи (клип)](https://www.coursera.org/learn/algorithms-on-graphs/home/welcome)

-   Аз ще имплементирам:
    -   [ ] DFS със списък на съседство (рекурсивно)
    -   [ ] DFS със списък на съседство (итеративно със стек)
    -   [ ] DFS с матрица на съседство (рекурсивно)
    -   [ ] DFS с матрица на съседство (итеративно със стек)
    -   [ ] BFS със списък на съседство
    -   [ ] BFS с матрица на съседство
    -   [ ] най-кратък път от един източник (Дейкстра)
    -   [ ] минимално обхващащо дърво
    -   Алгоритми основани върху DFS (вижте клиповете на Aduni по-горе):
        -   [ ] проверка за цикъл (нужно за топологичното сортиране, защото ще проверяваме за цикъла преди стартиране)
        -   [ ] топологично сортиране
        -   [ ] преброяване на свързаните компоненти в графа
        -   [ ] изреждане на силно свързаните компоненти
        -   [ ] проверка за двустранна графа

## Още повече знания

-   ### Рекурсия

    -   [ ] Лекции от Stanford за рекурсия и backtracking:
        -   [ ] [Лекция 8 | Абстракции за програмиране (клип)](https://www.youtube.com/watch?v=gl3emqCuueQ&list=PLFE6E58F856038C69&index=8)
        -   [ ] [Лекция 9 | Абстракции за програмиране (клип)](https://www.youtube.com/watch?v=uFJhEPrbycQ&list=PLFE6E58F856038C69&index=9)
        -   [ ] [Лекция 10 | Абстракции за програмиране (клип)](https://www.youtube.com/watch?v=NdF1QDTRkck&index=10&list=PLFE6E58F856038C69)
        -   [ ] [Лекция 11 | Абстракции за програмиране (клип)](https://www.youtube.com/watch?v=p-gpaIGRCQI&list=PLFE6E58F856038C69&index=11)
    -   Кога е подходящо да се използва?
    -   Как опашковата рекурсия е по-добра отколкото без?
        -   [ ] [Какво е опашкова рекурсия и защо е толкова лоша?](https://www.quora.com/What-is-tail-recursion-Why-is-it-so-bad)
        -   [ ] [Опашкова рекурсия (клип)](https://www.coursera.org/lecture/programming-languages/tail-recursion-YZic1)

-   ### Динамично програмиране

    -   Най-вероятно няма да срещнете задачи с динамично програмиране в интервютата си, но си струва да можете да разпознавате задачи, които са годни за решаване с динамично програмиране.
    -   Тази тема може да е доста сложна защото всяка задача, която може да се решава с ДП трябва да бъде дефинирана чрез рекурсивна връзка, а понякога може да е сложно да се измисли такава.
    -   Препоръчвам да разгледате много примери за задачи с ДП докато имате стабилно разбиране на структурата им.
    -   [ ] Клипове:
        -   клиповете от Skiena могат да бъдат сложни за проследяване, тъй като той понякога ползва дъската, която е прекалено малка, за да се види
        -   [ ] [Skiena: CSE373 2012 - Лекция 19 - Въведение в динамичното програмиране (клип)](https://youtu.be/Qc2ieXRgR0k?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1718)
        -   [ ] [Skiena: CSE373 2012 - Лекция 20 - Edit Distance (клип)](https://youtu.be/IsmMhMdyeGY?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=2749)
        -   [ ] [Skiena: CSE373 2012 - Лекция 21 - Примери за динамично програмиране (клип)](https://youtu.be/o0V9eYF4UI8?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=406)
        -   [ ] [Skiena: CSE373 2012 - Лекция 22 - Приложение на динамичното програмиране (клип)](https://www.youtube.com/watch?v=dRbMC1Ltl3A&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=22)
        -   [ ] [Simonson: Динамично програмиране 0 (starts at 59:18) (клип)](https://youtu.be/J5aJEcOr6Eo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3558)
        -   [ ] [Simonson: Динамично програмиране I - Лекция 11 (клип)](https://www.youtube.com/watch?v=0EzHjQ_SOeU&index=11&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
        -   [ ] [Simonson: Динамично програмиране II - Лекия 12 (клип)](https://www.youtube.com/watch?v=v1qiRwuJU7g&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=12)
        -   [ ] Списък с единични задачи за динамично програмиране (кратки са):
                [Динамично програмиране (клип)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr)
    -   [ ] Бележки от лекции в Yale:
        -   [ ] [Динамично програмиране](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#dynamicProgramming)
    -   [ ] Coursera:
        -   [ ] [The RNA secondary structure problem (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/80RrW/the-rna-secondary-structure-problem)
        -   [ ] [Алгоритъм за динамично програмиране (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/PSonq/a-dynamic-programming-algorithm)
        -   [ ] [Илюстриране на алгоритъма за ДП (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/oUEK2/illustrating-the-dp-algorithm)
        -   [ ] [Време за изпълнение на алгоритъма за ДП (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/nfK2r/running-time-of-the-dp-algorithm)
        -   [ ] [ДП срещу рекурсивна имплементация (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/M999a/dp-vs-recursive-implementation)
        -   [ ] [Глобално подравняване на последователности по двойки (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/UZ7o6/global-pairwise-sequence-alignment)
        -   [ ] [Локално подравняване на последователности по двойки (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment)

-   ### Design patterns

    -   [ ] [Бърз преговор върху UML (клип)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3)
    -   [ ] Научете тези схеми:
        -   [ ] strategy
        -   [ ] singleton
        -   [ ] adapter
        -   [ ] prototype
        -   [ ] decorator
        -   [ ] visitor
        -   [ ] factory, abstract factory
        -   [ ] facade
        -   [ ] observer
        -   [ ] proxy
        -   [ ] delegate
        -   [ ] command
        -   [ ] state
        -   [ ] memento
        -   [ ] iterator
        -   [ ] composite
        -   [ ] flyweight
    -   [ ] [Глава Част 1) - Patterns (клип)](https://youtu.be/LAP2A80Ajrg?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO&t=3344)
    -   [ ] [Глава 6 (Част 2) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (клип)](https://www.youtube.com/watch?v=U8-PGsjvZc4&index=12&list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)
    -   [ ] [Глава 6 (Част 3) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (клип)](https://www.youtube.com/watch?v=7sduBHuex4c&index=13&list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)
    -   [ ] [Поредица от клипове (27 клипа)](https://www.youtube.com/playlist?list=PLF206E906175C7E07)
    -   [ ] [Head First Design Patterns](https://www.amazon.com/Head-First-Design-Patterns-Freeman/dp/0596007124)
        -   Знам, че каноничната книга е "Design Patterns: Elements of Reusable Object-Oriented Software", но Head First е чудесна за начинаещи в ОО.
    -   [ ] [Удобен справочник: 101 Design Patterns & Tips for Developers](https://sourcemaking.com/design-patterns-and-tips)
    -   [ ] [Design patterns за хора](https://github.com/kamranahmedse/design-patterns-for-humans#structural-design-patterns)

-   ### Комбинаторика & вероятности

    -   [ ] [Математични умения: как да намираме пермутации, вариации и комбинации (клип)](https://www.youtube.com/watch?v=8RRo6Ti9d0U)
    -   [ ] [Make School: Вероятности (клип)](https://www.youtube.com/watch?v=sZkAAk9Wwa4)
    -   [ ] [Make School: Още вероятности и Марковски вериги (клип)](https://www.youtube.com/watch?v=dNaJg-mLobQ)
    -   [ ] Khan Academy:
        -   Оформление на курса:
            -   [ ] [Основна теоритична вероятност](https://www.khanacademy.org/math/probability/probability-and-combinatorics-topic)
        -   Само клиповете - 41 (всичките са прости и къси):
            -   [ ] [Вероятностите- обяснени (клип)](https://www.youtube.com/watch?v=uzkc-qNVoOk&list=PLC58778F28211FA19)

-   ### NP, NP-Complete and Approximation Algorithms

    -   Знайте за най-известните задачи за NP-завършеност като пътуващия търговец и бъдете сигурни, че можете да ги разпознавате, когато интервюиращия ви ги даде прикрити
    -   Знайте какво означава NP-завършен.
    -   [ ] [Изчислителна сложност (клип)](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=23)
    -   [ ] Simonson:
        -   [ ] [Алчни алгоритми II & Въведение в NP-завършеността (клип)](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939)
        -   [ ] [NP-завършеност II & Редукции (клип)](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
        -   [ ] [NP-завършеност III (клип)](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
        -   [ ] [NP-завършеност IV (клип)](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
    -   [ ] Skiena:
        -   [ ] [CSE373 2012 - Лекция 23 - Въведение в NP-завършеността (клип)](https://youtu.be/KiK5TVgXbFg?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1508)
        -   [ ] [CSE373 2012 - Лекция 24 - Доказване на NP-завършеност (клип)](https://www.youtube.com/watch?v=27Al52X3hd4&index=24&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
        -   [ ] [CSE373 2012 - Лекция 25 - Предизвикателство NP-завършеност (клип)](https://www.youtube.com/watch?v=xCPH4gwIIXM&index=25&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
    -   [ ] [Сложност: P, NP, NP-завършеност, редукции (клип)](https://www.youtube.com/watch?v=eHZifpgyH_4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=22)
    -   [ ] [Сложност: Алгоритми за приближаване (клип)](https://www.youtube.com/watch?v=MEz1J9wY2iM&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=24)
    -   [ ] [Сложност: Алгоритми с фиксирани параметри (клип)](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
    -   Peter Norvig обсъжда почти оптимални решения на задачата за пътуващия търговец:
        -   [Jupyter Notebook](http://nbviewer.jupyter.org/url/norvig.com/ipython/TSP.ipynb)
    -   Страници 1048 - 1140 в CLRS ако я имате.

-   ### Как компютрите обработват една програма

    -   [ ] [Как CPU-то изпълнява програми (клип)](https://www.youtube.com/watch?v=XM4lGflQFvA)
    -   [ ] [Как компютрите пресмятат - ALU (клип)](https://youtu.be/1I5ZMmrOfnA)
    -   [ ] [Регистри и RAM (клип)](https://youtu.be/fpnE6UAfbtU)
    -   [ ] [Централният процесор (CPU) (клип)](https://youtu.be/FZGugFqdr60)
    -   [ ] [Инструкции и програми (клип)](https://youtu.be/zltgXvg6r3k)

-   ### Кеширане

    -   [ ] LRU кеширане:
        -   [ ] [Магията на LRU кеширането (100 Days of Google Dev) (клип)](https://www.youtube.com/watch?v=R5ON3iwx78M)
        -   [ ] [Имплементиране на LRU (клип)](https://www.youtube.com/watch?v=bq6N7Ym81iI)
        -   [ ] [LeetCode - 146 LRU Кеширане (C++) (клип)](https://www.youtube.com/watch?v=8-FZRAjR7qU)
    -   [ ] CPU cache:
        -   [ ] [MIT 6.004 L15: Йерархията на паметта (клип)](https://www.youtube.com/watch?v=vjYF_fAZI5E&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-&index=24)
        -   [ ] [MIT 6.004 L16: Проблеми с кеширането (клип)](https://www.youtube.com/watch?v=ajgC3-pyGlk&index=25&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-)

-   ### Процеси и нишки

    -   [ ] Computer Science 162 - Операционни системи (25 клипа):
        -   за процеси и нишки вижте клипове 1-11
        -   [Операционни системи и системно програмиране (клип)](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c)
    -   [Каква е разликата между процес и нишка?](https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread)
    -   Покрива:
        -   Процеси, нишки, проблеми с concurrency
            -   Разликата между процеси и нишки
            -   Процеси
            -   Нишки
            -   Locks
            -   Мутекси
            -   Семафори
            -   Монитори
            -   Как работят?
            -   Deadlock
            -   Livelock
        -   CPU дейност, interrupts, смяна на контекста
        -   Модерни конструкции за concurrency с многоядрени процесори
        -   [Пейджинг, сегментация и виртуална памет (клип)](https://www.youtube.com/watch?v=LKe7xK0bF7o&list=PLCiOXwirraUCBE9i_ukL8_Kfg6XNv7Se8&index=2)
        -   [Interrupts (клип)](https://www.youtube.com/watch?v=uFKi2-J-6II&list=PLCiOXwirraUCBE9i_ukL8_Kfg6XNv7Se8&index=3)
        -   Ресурси, от които се нуждаят процесите (памет: код, статично пространство, стек, heap, и file descriptors, i/o)
        -   Ресурси, от които се нуждаят нишките (споделя същите като по-горе (без стек) с други нишки в същия процес, но всяка има свой pc, стек брояч, регистри и стек)
        -   Forking is really copy on write (read-only) until the new process writes to memory, then it does a full copy.
        -   Смяна на контекста
            -   Как смяната на контекста се инициира от операционната система и хардуера?
    -   [ ] [Нишки в C++ (серия - 10 клипа)](https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M)
    -   [ ] [CS 377 Spring '14: Операционни системи от University of Massachusetts](https://www.youtube.com/playlist?list=PLacuG5pysFbDQU8kKxbUh4K5c1iL5_k7k)
    -   [ ] concurrency в Python (клипове):
        -   [ ] [Кратка серия върху нишки](https://www.youtube.com/playlist?list=PL1H1sBF1VAKVMONJWJkmUh6_p8g4F2oy1)
        -   [ ] [Python нишки](https://www.youtube.com/watch?v=Bs7vPNbB9JM)
        -   [ ] [Да разберем Python GIL (2010)](https://www.youtube.com/watch?v=Obt-vMVdM8s)
            -   [справка](http://www.dabeaz.com/GIL)
        -   [ ] [David Beazley - Python Concurrency от горе до долу: LIVE! - PyCon 2015](https://www.youtube.com/watch?v=MCs5OvhV9S4)
        -   [ ] [Keynote David Beazley - Topics of Interest (Python Asyncio)](https://www.youtube.com/watch?v=ZzfHjytDceU)
        -   [ ] [Мутекс в Python](https://www.youtube.com/watch?v=0zaPs8OtyKY)

-   ### Тестване

    -   Да се покрие:
        -   как работи unit тестването
        -   какво са mock обекти
        -   какво е integration тестването
        -   какво е dependency injection
    -   [ ] [Agile Software Testing с James Bach (клип)](https://www.youtube.com/watch?v=SAhJf36_u5U)
    -   [ ] [Лекция от James Bach върху софтуерното тестване (клип)](https://www.youtube.com/watch?v=ILkT_HV9DVU)
    -   [ ] [Steve Freeman - Test-Driven Development (that’s not what we meant) (клип)](https://vimeo.com/83960706)
        -   [презентация](http://gotocon.com/dl/goto-berlin-2013/slides/SteveFreeman_TestDrivenDevelopmentThatsNotWhatWeMeant.pdf)
    -   [ ] Dependency injection:
        -   [ ] [клип](https://www.youtube.com/watch?v=IKD2-MAkXyQ)
        -   [ ] [Tao Of Testing](http://jasonpolites.github.io/tao-of-testing/ch3-1.1.html)
    -   [ ] [Как да пишем тестове](http://jasonpolites.github.io/tao-of-testing/ch4-1.1.html)

-   ### String searching & manipulations

    -   [ ] [Sedgewick - Суфиксни масиви (клип)](https://www.coursera.org/learn/algorithms-part2/lecture/TH18W/suffix-arrays)
    -   [ ] [Sedgewick - Substring Search (клипове)](https://www.coursera.org/learn/algorithms-part2/home/week/4)
        -   [ ] [1. Въведение в Substring Search](https://www.coursera.org/learn/algorithms-part2/lecture/n3ZpG/introduction-to-substring-search)
        -   [ ] [2. Brute-Force Substring Search](https://www.coursera.org/learn/algorithms-part2/lecture/2Kn5i/brute-force-substring-search)
        -   [ ] [3. Кнут-Морис-Прат](https://www.coursera.org/learn/algorithms-part2/lecture/TAtDr/knuth-morris-pratt)
        -   [ ] [4. Бойер-Мур](https://www.coursera.org/learn/algorithms-part2/lecture/CYxOT/boyer-moore)
        -   [ ] [5. Рабин-Карп](https://www.coursera.org/learn/algorithms-part2/lecture/3KiqT/rabin-karp)
    -   [ ] [Търсене на на шаблон в текст (клип)](https://www.coursera.org/learn/data-structures/lecture/tAfHI/search-pattern-in-text)

    Ако ви трябват допълнителни детайли по тази тема вижте секцията "String Matching" в [Допълнителни детайли по някои теми](#допълнителни-детайли-по-някои-теми).

-   ### Tries

    -   Обърнете внимание, че има различни видове tries. Някои имат prefixes, а други нямат, също така някои ползват низове вместо битове за да следят пътеката
    -   Разгледах кода, но няма да го имплементирам
    -   [ ] [Sedgewick - Tries (3 клипа)](https://www.coursera.org/learn/algorithms-part2/home/week/4)
        -   [ ] [1. R Way Tries](https://www.coursera.org/learn/algorithms-part2/lecture/CPVdr/r-way-tries)
        -   [ ] [2. Ternary Search Tries](https://www.coursera.org/learn/algorithms-part2/lecture/yQM8K/ternary-search-tries)
        -   [ ] [3. Character Based Operations](https://www.coursera.org/learn/algorithms-part2/lecture/jwNmV/character-based-operations)
    -   [ ] [Бележки върху структурите от данни и техники за програмиране](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Tries)
    -   [ ] Малък курс с клипове:
        -   [ ] [Въведение в Tries (клип)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries)
        -   [ ] [Производителност на Tries (клип)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/PvlZW/core-performance-of-tries)
        -   [ ] [Имплементиране на Trie (клип)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/DFvd3/core-implementing-a-trie)
    -   [ ] [Trie: неглежираната структура от данни](https://www.toptal.com/java/the-trie-a-neglected-data-structure)
    -   [ ] [TopCoder - използване на Tries](https://www.topcoder.com/community/competitive-programming/tutorials/using-tries/)
    -   [ ] [Stanford лекция (приложение в истинския живот) (клип)](https://www.youtube.com/watch?v=TJ8SkcUSdbU)
    -   [ ] [MIT, Структури от данни за напреднали, Низове (може да има доста неяснота към половината на клипа) (клип)](https://www.youtube.com/watch?v=NinWEPPrkDQ&index=16&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf)

-   ### Floating Point Numbers

    -   [ ] simple 8-bit: [Репрезентация на Floating Point числа - 1 (клип - има грешка в изчисленията - вижте описанието на клипа)](https://www.youtube.com/watch?v=ji3SfClm8TU)
    -   [ ] 32 bit: [IEEE754 32-bit floating point binary (клип)](https://www.youtube.com/watch?v=50ZYcZebIec)

-   ### Уникод

    -   [ ] [Абсолютният минимум от знания всеки софтуерен разработчик трабва да има за уникод и набори от символи ](http://www.joelonsoftware.com/articles/Unicode.html)
    -   [ ] [Какво трябва всеки програмист да знае за кодирането и наборите от символи за да работи с текст](http://kunststube.net/encoding/)

-   ### Endianness

    -   [ ] [Голям и малък Endian](https://web.archive.org/web/20180107141940/http://www.cs.umd.edu:80/class/sum2003/cmsc311/Notes/Data/endian.html)
    -   [ ] [Голям Endian срещу Малък Endian (клип)](https://www.youtube.com/watch?v=JrNF0KRAlyo)
    -   [ ] [Голям и малък Endian отвътре-навън (клип)](https://www.youtube.com/watch?v=oBSuXP-1Tc0)
        -   Много техничен разговор за kernel разработчици. Не се тревожете ако не схващате повечето неща.
        -   Първата половина е достатъчна.

-   ### Мрежи
    -   **очаквайте въпроси по тази тема ако имте опит с мрежи или искате да бъдете reliability engineer/ operations engineer**
    -   Иначе това са неща, които е добре да се знаят
    -   [ ] [Khan Academy](https://www.khanacademy.org/computing/code-org/computers-and-the-internet)
    -   [ ] [UDP и TCP: Сравнение на протоколи за пренос на информация (клип)](https://www.youtube.com/watch?v=Vdc8TCESIg8)
    -   [ ] [TCP/IP и OSI моделът обяснени! (клип)](https://www.youtube.com/watch?v=e5DEVa9eSN0)
    -   [ ] [Пренос на пакети през интернет. Ръководство за мрежи & TCP/IP. (клип)](https://www.youtube.com/watch?v=nomyRJehhnM)
    -   [ ] [HTTP (клип)](https://www.youtube.com/watch?v=WGJrLqtX7As)
    -   [ ] [SSL и HTTPS (клип)](https://www.youtube.com/watch?v=S2iBR2ZlZf0)
    -   [ ] [SSL/TLS (клип)](https://www.youtube.com/watch?v=Rp3iZUvXWlM)
    -   [ ] [HTTP 2.0 (клип)](https://www.youtube.com/watch?v=E9FxNzv1Tr8)
    -   [ ] [Видеосерия (21 клипа) (клип)](https://www.youtube.com/playlist?list=PLEbnTDJUr_IegfoqO4iPnPYQui46QqT0j)
    -   [ ] [Subnetting Demystified - Part 5 CIDR Notation (клип)](https://www.youtube.com/watch?v=t5xYI0jzOf4)
    -   [ ] Sockets:
        -   [ ] [Java - Sockets - Въведение (клип)](https://www.youtube.com/watch?v=6G_W54zuadg&t=6s)
        -   [ ] [Socket програмиране (клип)](https://www.youtube.com/watch?v=G75vN2mnJeQ)

---

## Последен преглед

    Тази секция съдържа по-кратки клипове за най-важните понятия, които можете да изгледате сравнително бързо. Полезни са ако искате да си припомните нещо от време на време.

-   [ ] Серия от 2-3 минутни кратки клипове по различни теми (23 клипа)
    -   [Клипове](https://www.youtube.com/watch?v=r4r1DZcx1cM&list=PLmVb1OknmNJuC5POdcDv5oCS7_OUkDgpj&index=22)
-   [ ] Серия от 2-5 минутни кратки клипове по различни теми - Michael Sambol (18 клипа):
    -   [Клипове](https://www.youtube.com/channel/UCzDJwLWoYCUQowF_nG3m5OQ)
-   [ ] [Sedgewick Videos - Алгоритми I](https://www.coursera.org/learn/algorithms-part1)
-   [ ] [Sedgewick Videos - Алгоритми II](https://www.coursera.org/learn/algorithms-part2)

---

## Актуализирайте резюмето си

-   See Resume prep information in the books: "Cracking The Coding Interview" and "Programming Interviews Exposed"
-   Не знам колко важно е това (можете сами да си направите проучване), но ето една статия за това как да направим резюмето си ATS Compliant:
    -   [Как да проверим дали резюмето ни е ATS Compliant](https://ayedot.com/97/MiniBlog/Meaning-of-ATS-compliant-resume-and-How-to-create-ATS-Resume-for-Free)
-   ["This Is What A GOOD Resume Should Look Like" от Gayle McDowell (авторът на Cracking the Coding Interview)](https://www.careercup.com/resume),
    -   Бележка от автора: "Това се отнася към резюмета за САЩ. Към CV-тата за Индия и други държави има различни изисквания, но много от точките ще са същите."

## Намерете позиция

-   [Сайтове за намиране на работа](https://ayedot.com/151/MiniBlog/Top-10-Best-Websites-for-Careers--Jobs)

## Процесът на интервюто & обща подготовка

-   [ ] [Как да минем през интервюто за инженер през 2021](https://davidbyttow.medium.com/how-to-pass-the-engineering-interview-in-2021-45f1b389a1)
-   [ ] [Демистифициране на Tech рекрутинга](https://www.youtube.com/watch?v=N233T0epWTs)
-   [ ] Как да намерим работа в Големите 4:
    -   [ ] [Как да намерим работа в Големите 4 - Amazon, Facebook, Google & Microsoft (клип)](https://www.youtube.com/watch?v=YJZCUhxNCv8)
    -   [ ] [Как да намерим работа в Големите 4.1 (продължение)](https://www.youtube.com/watch?v=6790FVXWBw8&feature=youtu.be)
-   [ ] Cracking The Coding Interview Set 1:
    -   [ ] [Gayle L McDowell - Cracking The Coding Interview (клип)](https://www.youtube.com/watch?v=rEJzOhC5ZtQ)
    -   [ ] [Cracking the Coding Interview с авторът Gayle Laakmann McDowell (клип)](https://www.youtube.com/watch?v=aClxtDcdpsQ)
-   [ ] Cracking the Facebook Coding Interview:
    -   [ ] [Подходът](https://www.youtube.com/watch?v=wCl9kvQGHPI)
    -   [ ] [Преминаване през задачи](https://www.youtube.com/watch?v=4UWDyJq8jZg)
-   Курсове за подготовка:
    -   [Software Engineer Interview Unleashed (платен курс)](https://www.udemy.com/software-engineer-interview-unleashed):
        -   Научете как да се подготвяте за интервюта за софтуерен разработчик от бивш интервюиращ в Google
    -   [Python for Data Structures, Algorithms, and Interviews (платен курс)](https://www.udemy.com/python-for-data-structures-algorithms-and-interviews/):
        -   Курс, ориентиран към Python, който покрива структури от данни, алгоритми, mock интервюта и много повече.
    -   [Intro to Data Structures and Algorithms using Python (безплатен курс от Udacity)](https://www.udacity.com/course/data-structures-and-algorithms-in-python--ud513):
        -   Безплатен курс върху структури от данни и алгоритми, ориентиран към Python.
    -   [Data Structures and Algorithms Nanodegree! (платен Nanodegree от Udacity)](https://www.udacity.com/course/data-structures-and-algorithms-nanodegree--nd256):
        -   Get hands-on practice with over 100 data structures and algorithm exercises and guidance from a dedicated mentor to help prepare you for interviews and on-the-job scenarios.
    -   [Grokking the Behavioral Interview (безплатен курс от Educative)](https://www.educative.io/courses/grokking-the-behavioral-interview):
        -   Много често, не техническата Ви компетентност, а личностното интервю Ви спират да започнете мечтаната си работа.

Mock интервюта:

-   [Gainlo.co: Mock интервюта от големи компании](http://www.gainlo.co/) - Използвах това и ми помогна да се успокоя за телефонното, screen и on-site интервютата
-   [Pramp: Mock интервюта от/с връсници](https://www.pramp.com/) - модел за подготовка за интервю с връсници
-   [interviewing.io: Mock интервюта за подготовка със senior инженери](https://interviewing.io) - анонимни интервюта за дизайн на алгоритми/системи със senior инженери от FAANG компаниите

## Мислете за това, когато дойде интервюто

Помислете за около 20 въпроса за интервю, които може да ви се паднат и редовете надолу. Имайте поне един отговор за всеки от тях. Имайте история, а не само данни за нещо, което сте постигнали.

-   Защо искате тази работа?
-   Дайте пример за труден проблем, който сте разрешили.
-   Кое е най-голямото предизвикателство, с което сте се сблъсквали?
-   Best/worst designs seen?
-   Дайте идея за подобрение на съществуващ продукт.
-   Как работите най ефективно- самостоятелно или като част от екип?
-   Кои от уменията Ви ще са важни активи в позицията и защо?
-   Какво най-много Ви хареса на [работа x / проейт y]?
-   Какво беше най-голямото предизвикателство, с което се сблъскахте на [работа x / проект y]?
-   Кой е най-трудния bug, с който сте се сблъсквали на [работа x / проект y]?
-   Какво научихте на [работа x / проект y]?
-   Какво можехте да направите по-добре на [работа x / проект y]?

-   Ако Ви се струва трудно да давате отговор на подобни въпроси, ето някои идеи:
    -   [Общи въпроси за интервю и отговорите им](https://ayedot.com/119/MiniBlog/General-Interview-Questions-and-their-Answers-for-Tech-Jobs)

## Подгответе въпроси за интервюиращия

Ето някои от моите (може вече да знам отговорът им когато ги задавам, но искам да чуя тяхното мнение и да видя перспективата им):

-   Колко е голям екипът Ви?
-   What does your dev cycle look like? Ползвате ли waterfall/sprints/agile методологии?
-   Често ли се случва да гоните срокове? Или има гъвкавост?
-   Как вземате решения във вашия екип?
-   Колко срещи имате на седмица?
-   Как работната среда Ви помага да се концентрирате, според Вас?
-   Върху какво работите в момента?
-   Какво Ви харесва за него?
-   Как е работният Ви живот?
-   Как е балансът Ви работа/свободно време?

## След като са Ви наели

Поздравления!

Продължавайте да учите.

Никога не сте свършили наистина.

---

    *****************************************************************************************************
    *****************************************************************************************************

    Всичко оттук надолу е по желание. НЕ е нужно за entry-level интервю, но ако научите тези неща ще сте изложени пред повече концепции от компютърните науки и ще сте добре подготвени за всяка работа за софтуерно инженерство. Ще сте много по-добър софтуерен инженер.

    *****************************************************************************************************
    *****************************************************************************************************

---

## Допълнителни книги

    Книгите тук ще ви позволят да се гмурнете в теми, които са интересни за вас.

-   [The Unix Programming Environment](https://www.amazon.com/dp/013937681X)
    -   An oldie but a goodie
-   [The Linux Command Line: A Complete Introduction](https://www.amazon.com/dp/1593273894/)
    -   A modern option
-   [TCP/IP Illustrated Series](https://en.wikipedia.org/wiki/TCP/IP_Illustrated)
-   [Head First Design Patterns](https://www.amazon.com/gp/product/0596007124/)
    -   A gentle introduction to design patterns
-   [Design Patterns: Elements of Reusable Object-Oriente​d Software](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612)
    -   AKA the "Gang Of Four" book, or GOF
    -   The canonical design patterns book
-   [Algorithm Design Manual](http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202) (Skiena)
    -   As a review and problem recognition
    -   The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview
    -   This book has 2 parts:
        -   Class textbook on data structures and algorithms
            -   Pros:
                -   Is a good review as any algorithms textbook would be
                -   Nice stories from his experiences solving problems in industry and academia
                -   Code examples in C
            -   Cons:
                -   Can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
                -   Chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
                -   Don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material
        -   Algorithm catalog:
            -   This is the real reason you buy this book.
            -   This book is better as an algorithm reference, and not something you read cover to cover.
    -   Can rent it on Kindle
    -   Answers:
        -   [Solutions](<http://www.algorithm.cs.sunysb.edu/algowiki/index.php/The_Algorithms_Design_Manual_(Second_Edition)>)
        -   [Solutions](http://blog.panictank.net/category/algorithmndesignmanualsolutions/page/2/)
    -   [Errata](http://www3.cs.stonybrook.edu/~skiena/algorist/book/errata)
-   [Write Great Code: Volume 1: Understanding the Machine](https://www.amazon.com/Write-Great-Code-Understanding-Machine/dp/1593270038)
    -   The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief
    -   The author invented [HLA](https://en.wikipedia.org/wiki/High_Level_Assembly), so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like
    -   These chapters are worth the read to give you a nice foundation:
        -   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
        -   Chapter 9 - CPU Architecture
        -   Chapter 10 - Instruction Set Architecture
        -   Chapter 11 - Memory Architecture and Organization
-   [Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844)
    -   **Important:** Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently
    -   AKA CLR, sometimes CLRS, because Stein was late to the game
-   [Computer Architecture, Sixth Edition: A Quantitative Approach](https://www.amazon.com/dp/0128119055)
    -   For a richer, more up-to-date (2017), but longer treatment

## System Design, Scalability, Data Handling

**You can expect system design questions if you have 4+ years of experience.**

-   Scalability and System Design are very large topics with many topics and resources, since
    there is a lot to consider when designing a software/hardware system that can scale.
    Expect to spend quite a bit of time on this
-   Considerations:
    -   Scalability
        -   Distill large data sets to single values
        -   Transform one data set to another
        -   Handling obscenely large amounts of data
    -   System design
        -   features sets
        -   interfaces
        -   class hierarchies
        -   designing a system under certain constraints
        -   simplicity and robustness
        -   tradeoffs
        -   performance analysis and optimization
-   [ ] **START HERE**: [The System Design Primer](https://github.com/donnemartin/system-design-primer)
-   [ ] [System Design from HiredInTech](http://www.hiredintech.com/system-design/)
-   [ ] [How Do I Prepare To Answer Design Questions In A Technical Interview?](https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023)
-   [ ] [8 Things You Need to Know Before a System Design Interview](http://blog.gainlo.co/index.php/2015/10/22/8-things-you-need-to-know-before-system-design-interviews/)
-   [ ] [Database Normalization - 1NF, 2NF, 3NF and 4NF (video)](https://www.youtube.com/watch?v=UrYLYV7WSHM)
-   [ ] [System Design Interview](https://github.com/checkcheckzz/system-design-interview) - There are a lot of resources in this one. Look through the articles and examples. I put some of them below
-   [ ] [How to ace a systems design interview](http://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/)
-   [ ] [Numbers Everyone Should Know](http://everythingisdata.wordpress.com/2009/10/17/numbers-everyone-should-know/)
-   [ ] [How long does it take to make a context switch?](http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html)
-   [ ] [Transactions Across Datacenters (video)](https://www.youtube.com/watch?v=srOgpXECblk)
-   [ ] [A plain English introduction to CAP Theorem](http://ksat.me/a-plain-english-introduction-to-cap-theorem)
-   [ ] [MIT 6.824: Distributed Systems, Spring 2020 (20 videos)](https://www.youtube.com/watch?v=cQP8WApzIQQ&list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB)
-   [ ] Consensus Algorithms:
    -   [ ] Paxos - [Paxos Agreement - Computerphile (video)](https://www.youtube.com/watch?v=s8JqcZtvnsM)
    -   [ ] Raft - [An Introduction to the Raft Distributed Consensus Algorithm (video)](https://www.youtube.com/watch?v=P9Ydif5_qvE)
        -   [ ] [Easy-to-read paper](https://raft.github.io/)
        -   [ ] [Infographic](http://thesecretlivesofdata.com/raft/)
-   [ ] [Consistent Hashing](http://www.tom-e-white.com/2007/11/consistent-hashing.html)
-   [ ] [NoSQL Patterns](http://horicky.blogspot.com/2009/11/nosql-patterns.html)
-   [ ] Scalability:
    -   You don't need all of these. Just pick a few that interest you.
    -   [ ] [Great overview (video)](https://www.youtube.com/watch?v=-W9F__D3oY4)
    -   [ ] Short series:
        -   [Clones](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones)
        -   [Database](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database)
        -   [Cache](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache)
        -   [Asynchronism](http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism)
    -   [ ] [Scalable Web Architecture and Distributed Systems](http://www.aosabook.org/en/distsys.html)
    -   [ ] [Fallacies of Distributed Computing Explained](https://pages.cs.wisc.edu/~zuyu/files/fallacies.pdf)
    -   [ ] [Jeff Dean - Building Software Systems At Google and Lessons Learned (video)](https://www.youtube.com/watch?v=modXC5IWTJI)
    -   [ ] [Introduction to Architecting Systems for Scale](http://lethain.com/introduction-to-architecting-systems-for-scale/)
    -   [ ] [Scaling mobile games to a global audience using App Engine and Cloud Datastore (video)](https://www.youtube.com/watch?v=9nWyWwY2Onc)
    -   [ ] [How Google Does Planet-Scale Engineering for Planet-Scale Infra (video)](https://www.youtube.com/watch?v=H4vMcD7zKM0)
    -   [ ] [The Importance of Algorithms](https://www.topcoder.com/community/competitive-programming/tutorials/the-importance-of-algorithms/)
    -   [ ] [Sharding](http://highscalability.com/blog/2009/8/6/an-unorthodox-approach-to-database-design-the-coming-of-the.html)
    -   [ ] [Engineering for the Long Game - Astrid Atkinson Keynote(video)](https://www.youtube.com/watch?v=p0jGmgIrf_M&list=PLRXxvay_m8gqVlExPC5DG3TGWJTaBgqSA&index=4)
    -   [ ] [7 Years Of YouTube Scalability Lessons In 30 Minutes](http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html)
        -   [video](https://www.youtube.com/watch?v=G-lGCC4KKok)
    -   [ ] [How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs](http://highscalability.com/blog/2016/8/15/how-paypal-scaled-to-billions-of-transactions-daily-using-ju.html)
    -   [ ] [How to Remove Duplicates in Large Datasets](https://blog.clevertap.com/how-to-remove-duplicates-in-large-datasets/)
    -   [ ] [A look inside Etsy's scale and engineering culture with Jon Cowie (video)](https://www.youtube.com/watch?v=3vV4YiqKm1o)
    -   [ ] [What Led Amazon to its Own Microservices Architecture](http://thenewstack.io/led-amazon-microservices-architecture/)
    -   [ ] [To Compress Or Not To Compress, That Was Uber's Question](https://eng.uber.com/trip-data-squeeze/)
    -   [ ] [When Should Approximate Query Processing Be Used?](http://highscalability.com/blog/2016/2/25/when-should-approximate-query-processing-be-used.html)
    -   [ ] [Google's Transition From Single Datacenter, To Failover, To A Native Multihomed Architecture](http://highscalability.com/blog/2016/2/23/googles-transition-from-single-datacenter-to-failover-to-a-n.html)
    -   [ ] [The Image Optimization Technology That Serves Millions Of Requests Per Day](http://highscalability.com/blog/2016/6/15/the-image-optimization-technology-that-serves-millions-of-re.html)
    -   [ ] [A Patreon Architecture Short](http://highscalability.com/blog/2016/2/1/a-patreon-architecture-short.html)
    -   [ ] [Tinder: How Does One Of The Largest Recommendation Engines Decide Who You'll See Next?](http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html)
    -   [ ] [Design Of A Modern Cache](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html)
    -   [ ] [Live Video Streaming At Facebook Scale](http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html)
    -   [ ] [A Beginner's Guide To Scaling To 11 Million+ Users On Amazon's AWS](http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html)
    -   [ ] [A 360 Degree View Of The Entire Netflix Stack](http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html)
    -   [ ] [Latency Is Everywhere And It Costs You Sales - How To Crush It](http://highscalability.com/latency-everywhere-and-it-costs-you-sales-how-crush-it)
    -   [ ] [What Powers Instagram: Hundreds of Instances, Dozens of Technologies](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances)
    -   [ ] [Salesforce Architecture - How They Handle 1.3 Billion Transactions A Day](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html)
    -   [ ] [ESPN's Architecture At Scale - Operating At 100,000 Duh Nuh Nuhs Per Second](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html)
    -   [ ] See "Messaging, Serialization, and Queueing Systems" way below for info on some of the technologies that can glue services together
    -   [ ] Twitter:
        -   [O'Reilly MySQL CE 2011: Jeremy Cole, "Big and Small Data at @Twitter" (video)](https://www.youtube.com/watch?v=5cKTP36HVgI)
        -   [Timelines at Scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)
    -   For even more, see "Mining Massive Datasets" video series in the [Video Series](#video-series) section
-   [ ] Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world:
    -   review: [The System Design Primer](https://github.com/donnemartin/system-design-primer)
    -   [System Design from HiredInTech](http://www.hiredintech.com/system-design/)
    -   [cheat sheet](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/system-design.pdf)
    -   flow:
        1. Understand the problem and scope:
            - Define the use cases, with interviewer's help
            - Suggest additional features
            - Remove items that interviewer deems out of scope
            - Assume high availability is required, add as a use case
        2. Think about constraints:
            - Ask how many requests per month
            - Ask how many requests per second (they may volunteer it or make you do the math)
            - Estimate reads vs. writes percentage
            - Keep 80/20 rule in mind when estimating
            - How much data written per second
            - Total storage required over 5 years
            - How much data read per second
        3. Abstract design:
            - Layers (service, data, caching)
            - Infrastructure: load balancing, messaging
            - Rough overview of any key algorithm that drives the service
            - Consider bottlenecks and determine solutions
    -   Exercises:
        -   [Design a random unique ID generation system](https://blog.twitter.com/2010/announcing-snowflake)
        -   [Design a key-value database](http://www.slideshare.net/dvirsky/introduction-to-redis)
        -   [Design a picture sharing system](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html)
        -   [Design a recommendation system](http://ijcai13.org/files/tutorial_slides/td3.pdf)
        -   [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

    Добавих тези теми, за да Ви помогна да бъдете по-добри софтуерни инженери и да сте наясно с определени технологии и алгоритми, което ще разшири "инструментите", с които можете да работите

-   ### Компилатори

    -   [Как работи един компилатор в ~1 минута (клип)](https://www.youtube.com/watch?v=IhC7sdYe-Jg)
    -   [Harvard CS50 - Компилатори (клип)](https://www.youtube.com/watch?v=CSZLNYF4Klo)
    -   [C++ (клип)](https://www.youtube.com/watch?v=twodd1KFfGk)
    -   [Да разберем оптимизирането на компилатори (C++) (клип)](https://www.youtube.com/watch?v=FnGCDLhaxKU)

-   ### Emacs and vi(m)

    -   Запознайте се с някой unix-базиран кодов редактор
    -   vi(m):
        -   [Редактиране с vim 01 - Инсталация, настройване и различните режими (клип)](https://www.youtube.com/watch?v=5givLEMcINQ&index=1&list=PL13bz4SHGmRxlZVmWQ9DvXo1fEg4UdGkr)
        -   [VIM приключения](http://vim-adventures.com/)
        -   4 клипа:
            -   [The vi/vim editor - Урок 1](https://www.youtube.com/watch?v=SI8TeVMX8pk)
            -   [The vi/vim editor - Урок 2](https://www.youtube.com/watch?v=F3OO7ZIOaJE)
            -   [The vi/vim editor - Урок 3](https://www.youtube.com/watch?v=ZYEccA_nMaI)
            -   [The vi/vim editor - Урок 4](https://www.youtube.com/watch?v=1lYD5gwgZIA)
        -   [Използване на Vi вместо Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Using_Vi_instead_of_Emacs)
    -   emacs:
        -   [Основите на Emacs (клип)](https://www.youtube.com/watch?v=hbmV1bnQ-i0)
        -   3 клипа:
            -   [Emacs ръководство (За начинаещи) -Част 1- файлови команди, cut/copy/paste, cursor команди](https://www.youtube.com/watch?v=ujODL7MD04Q)
            -   [Emacs ръководство (За начинаещи) -Част 2- Управление на буфера, търсене, M-x grep и rgrep режими](https://www.youtube.com/watch?v=XWpsRupJ4II)
            -   [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/)

-   ### Unix command line tools

    -   bash
    -   cat
    -   grep
    -   sed
    -   awk
    -   curl or wget
    -   sort
    -   tr
    -   uniq
    -   [strace](https://en.wikipedia.org/wiki/Strace)
    -   [tcpdump](https://danielmiessler.com/study/tcpdump/)

-   ### Information theory (videos)

    -   [Khan Academy](https://www.khanacademy.org/computing/computer-science/informationtheory)
    -   Повече за Марковските процеси:
        -   [Основите на Марковския текст](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation)
        -   [Основите на имплементацията на Марковския текст](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation)
        -   [Проект = Ръководство за Марковския текст](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/EUjrq/project-markov-text-generation-walk-through)
    -   Вижте повече в серията Information and Entropy MIT 6.050J надолу

-   ### Паритет & код на Хаминг (клипове)

    -   [Въведение](https://www.youtube.com/watch?v=q-3BctoUpHE)
    -   [Паритет](https://www.youtube.com/watch?v=DdMcAUlxh1M)
    -   Код на Хаминг:
        -   [Откриване на грешки](https://www.youtube.com/watch?v=1A_NcXxdoCc)
        -   [Поправяне на грешки](https://www.youtube.com/watch?v=JAMLuxdHH8o)
    -   [Проверка за грешко](https://www.youtube.com/watch?v=wbH2VxzmoZk)

-   ### Ентропия

    -   Вижте също клиповете надолу
    -   Първо изгледайте клиповете за information theory
    -   [Information Theory, Клод Шанън, Ентропия, Redundancy, Компресия на данни & Битове (клип)](https://youtu.be/JnJq3Py0dyM?t=176)

-   ### Криптография

    -   Вижте също клиповете надолу
    -   Първо изгледайте клиповете за information theory
    -   [Khan Academy](https://www.khanacademy.org/computing/computer-science/cryptography)
    -   [Криптография: Функции за хеширане](https://www.youtube.com/watch?v=KqqOXndnvic&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=30)
    -   [Криптография: Криптиране](https://www.youtube.com/watch?v=9TNI2wHmaeI&index=31&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)

-   ### Компресия

    -   Първо изгледайте клиповете за information theory
    -   Computerphile (клипове):
        -   [Компресия](https://www.youtube.com/watch?v=Lto-ajuqW3w)
        -   [Ентропия в компресията](https://www.youtube.com/watch?v=M5c_RFKVkko)
        -   [Upside Down Trees (Дървета на Хъфман)](https://www.youtube.com/watch?v=umTbivyJoiI)
        -   [EXTRA BITS/TRITS - Дървета на Хъфман](https://www.youtube.com/watch?v=DV8efuB3h2g)
        -   [Елегантна компресия на текст (LZ 77 методът)](https://www.youtube.com/watch?v=goOa3DGezUA)
        -   [Компресията на текст среща вероятностите](https://www.youtube.com/watch?v=cCDCfoHTsaU)
    -   [Compressor Head клипове](https://www.youtube.com/playlist?list=PLOU2XLYxmsIJGErt5rrCqaSGTMyyqNt2H)
    -   [(по желание) Google Developers Live: GZIP не е достатъчен!](https://www.youtube.com/watch?v=whGwm0Lky2s)

-   ### Компютърна сигурност

    -   [MIT (23 клипа)](https://www.youtube.com/playlist?list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Въведение, модели на заплахи](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Контролирайте атаките за "отвличане"](https://www.youtube.com/watch?v=6bwzNg5qQ0o&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=2)
        -   [Експлоатация и защита за препълване на буфер](https://www.youtube.com/watch?v=drQyrzRoRiA&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=3)
        -   [Разделение на привилегиите](https://www.youtube.com/watch?v=6SIJmoE9L9g&index=4&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Възможности](https://www.youtube.com/watch?v=8VqTSY-11F4&index=5&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Sandboxing Native Code](https://www.youtube.com/watch?v=VEV74hwASeU&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=6)
        -   [Моделът за уеб сигурност](https://www.youtube.com/watch?v=chkFBigodIw&index=7&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Да подсигурим уеб апликация](https://www.youtube.com/watch?v=EBQIGy1ROLY&index=8&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Symbolic Execution](https://www.youtube.com/watch?v=yRVZPvHYHzw&index=9&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Мрежова сигурност](https://www.youtube.com/watch?v=SIEVvk3NVuk&index=11&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Мрежови протоколи](https://www.youtube.com/watch?v=QOtA76ga_fY&index=12&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
        -   [Side-Channel атаки](https://www.youtube.com/watch?v=PuVMkSEcPiI&index=15&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)

-   ### Garbage collection

    -   [GC в Python (клип)](https://www.youtube.com/watch?v=iHVs_HkjdmI)
    -   [Deep Dive Java: Garbage Collection is Good!](https://www.infoq.com/presentations/garbage-collection-benefits)
    -   [Deep Dive Python: Garbage Collection in CPython (клип)](https://www.youtube.com/watch?v=P-8Z0-MhdQs&list=PLdzf4Clw0VbOEWOS_sLhT_9zaiQDrS5AR&index=3)

-   ### Паралелно програмиране

    -   [Coursera (Scala)](https://www.coursera.org/learn/parprog1/home/week/1)
    -   [Efficient Python for High Performance Parallel Computing (клип)](https://www.youtube.com/watch?v=uY85GkaYzBk)

-   ### Системи за съобщения, сериализация и последователност

    -   [Thrift](https://thrift.apache.org/)
        -   [Ръководство](http://thrift-tutorial.readthedocs.io/en/latest/intro.html)
    -   [Protocol Buffers](https://developers.google.com/protocol-buffers/)
        -   [Ръководства](https://developers.google.com/protocol-buffers/docs/tutorials)
    -   [gRPC](http://www.grpc.io/)
        -   [gRPC 101 за Java разработчици (клип)](https://www.youtube.com/watch?v=5tmPvSe7xXQ&list=PLcTqM9n_dieN0k1nSeN36Z_ppKnvMJoly&index=1)
    -   [Redis](http://redis.io/)
        -   [Ръководство](http://try.redis.io/)
    -   [Amazon SQS (queue)](https://aws.amazon.com/sqs/)
    -   [Amazon SNS (pub-sub)](https://aws.amazon.com/sns/)
    -   [RabbitMQ](https://www.rabbitmq.com/)
        -   [Да започнем](https://www.rabbitmq.com/getstarted.html)
    -   [Celery](http://www.celeryproject.org/)
        -   [Първи стъпки със Celery](http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html)
    -   [ZeroMQ](http://zeromq.org/)
        -   [Въведение - Прочетете наръчника](http://zeromq.org/intro:read-the-manual)
    -   [ActiveMQ](http://activemq.apache.org/)
    -   [Kafka](http://kafka.apache.org/documentation.html#introduction)
    -   [MessagePack](http://msgpack.org/index.html)
    -   [Avro](https://avro.apache.org/)

-   ### A\*

    -   [Алгоритъм за търсене](https://en.wikipedia.org/wiki/A*_search_algorithm)
    -   [A\* Ръководство за търсене на пътеки (клип)](https://www.youtube.com/watch?v=KNXfSOx4eEE)
    -   [A\* Търсене на пътеки (E01: обяснение на алгоритъм) (клип)](https://www.youtube.com/watch?v=-L-WgKMFuhE)

-   ### Fast Fourier Transform

    -   [Интерактивно ръководство за Fourier Transform](https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/)
    -   [Какво е Fourier transform? За какво се ползва?](http://www.askamathematician.com/2012/09/q-what-is-a-fourier-transform-what-is-it-used-for/)
    -   [Какво е Fourier Transform? (клип)](https://www.youtube.com/watch?v=Xxut2PN-V8Q)
    -   [Разделяй и владей: FFT (клип)](https://www.youtube.com/watch?v=iTMn0Kt18tg&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=4)
    -   [Да разберем FFT](http://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/)

-   ### Bloom Filter

    -   Given a Bloom filter with m bits and k hashing functions, both insertion and membership testing are O(k)
    -   [Bloom Filters (клип)](https://www.youtube.com/watch?v=-SuTGoFYjZs)
    -   [Bloom Filters | "Копаене" на големи dataset-ове | Stanford University (клип)](https://www.youtube.com/watch?v=qBTdukbzc78)
    -   [Ръководство](http://billmill.org/bloomfilter-tutorial/)
    -   [Как да напишем Bloom Filter приложение](http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/)

-   ### HyperLogLog

    -   [Как да преброим един милиард различни обекта ползвайки само 1.5KB памет](http://highscalability.com/blog/2012/4/5/big-data-counting-how-to-count-a-billion-distinct-objects-us.html)

-   ### Locality-Sensitive Hashing

    -   Използва се за преценяването на сходността на документи
    -   Обратното на MD5 или SHA, които се ползват за преценяване дали два документа/низа са напълно еднакви
    -   [Simhashing (hopefully) made simple](http://ferd.ca/simhashing-hopefully-made-simple.html)

-   ### van Emde Boas Trees

    -   [Разделяй и владей: van Emde Boas Trees (клип)](https://www.youtube.com/watch?v=hmReJCupbNU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=6)
    -   [Бележки от лекции към MIT](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2012/lecture-notes/MIT6_046JS12_lec15.pdf)

-   ### Разширени структури от данни

    -   [CS 61B Лекция 39: Разширяване на структури от данни](https://archive.org/details/ucberkeley_webcast_zksIj9O8_jc)

-   ### Балансирани дървета за търсене

    -   Познавайте поне един вид двоични балансирани дървета(и как се имплементират):
    -   "Among balanced search trees, AVL and 2/3 trees are now passé, and red-black trees seem to be more popular.
        A particularly interesting self-organizing data structure is the splay tree, which uses rotations
        to move any accessed key to the root." - Skiena
    -   Of these, I chose to implement a splay tree. From what I've read, you won't implement a
        balanced search tree in your interview. But I wanted exposure to coding one up
        and let's face it, splay trees are the bee's knees. I did read a lot of red-black tree code
        -   Splay tree: insert, search, delete functions
            If you end up implementing red/black tree try just these:
        -   Search and insertion functions, skipping delete
    -   I want to learn more about B-Tree since it's used so widely with very large data sets
    -   [Self-balancing binary search tree](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree)

    -   **AVL trees**

        -   In practice:
            From what I can tell, these aren't used much in practice, but I could see where they would be:
            The AVL tree is another structure supporting O(log n) search, insertion, and removal. It is more rigidly
            balanced than red–black trees, leading to slower insertion and removal but faster retrieval. This makes it
            attractive for data structures that may be built once and loaded without reconstruction, such as language
            dictionaries (or program dictionaries, such as the opcodes of an assembler or interpreter)
        -   [MIT AVL Trees / AVL Sort (video)](https://www.youtube.com/watch?v=FNeL18KsWPc&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=6)
        -   [AVL Trees (video)](https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees)
        -   [AVL Tree Implementation (video)](https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation)
        -   [Split And Merge](https://www.coursera.org/learn/data-structures/lecture/22BgE/split-and-merge)

    -   **Splay trees**

        -   In practice:
            Splay trees are typically used in the implementation of caches, memory allocators, routers, garbage collectors,
            data compression, ropes (replacement of string used for long text strings), in Windows NT (in the virtual memory,
            networking and file system code) etc
        -   [CS 61B: Splay Trees (video)](https://archive.org/details/ucberkeley_webcast_G5QIXywcJlY)
        -   MIT Lecture: Splay Trees:
            -   Gets very mathy, but watch the last 10 minutes for sure.
            -   [Video](https://www.youtube.com/watch?v=QnPl_Y6EqMo)

    -   **Red/black trees**

        -   These are a translation of a 2-3 tree (see below).
        -   In practice:
            Red–black trees offer worst-case guarantees for insertion time, deletion time, and search time.
            Not only does this make them valuable in time-sensitive applications such as real-time applications,
            but it makes them valuable building blocks in other data structures which provide worst-case guarantees;
            for example, many data structures used in computational geometry can be based on red–black trees, and
            the Completely Fair Scheduler used in current Linux kernels uses red–black trees. In the version 8 of Java,
            the Collection HashMap has been modified such that instead of using a LinkedList to store identical elements with poor
            hashcodes, a Red-Black tree is used
        -   [Aduni - Algorithms - Lecture 4 (link jumps to starting point) (video)](https://youtu.be/1W3x0f_RmUo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3871)
        -   [Aduni - Algorithms - Lecture 5 (video)](https://www.youtube.com/watch?v=hm2GHwyKF1o&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=5)
        -   [Red-Black Tree](https://en.wikipedia.org/wiki/Red%E2%80%93black_tree)
        -   [An Introduction To Binary Search And Red Black Tree](https://www.topcoder.com/community/competitive-programming/tutorials/an-introduction-to-binary-search-and-red-black-trees/)

    -   **2-3 search trees**

        -   In practice:
            2-3 trees have faster inserts at the expense of slower searches (since height is more compared to AVL trees).
        -   You would use 2-3 tree very rarely because its implementation involves different types of nodes. Instead, people use Red Black trees.
        -   [23-Tree Intuition and Definition (video)](https://www.youtube.com/watch?v=C3SsdUqasD4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=2)
        -   [Binary View of 23-Tree](https://www.youtube.com/watch?v=iYvBtGKsqSg&index=3&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
        -   [2-3 Trees (student recitation) (video)](https://www.youtube.com/watch?v=TOb1tuEZ2X4&index=5&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)

    -   **2-3-4 Trees (aka 2-4 trees)**

        -   In practice:
            For every 2-4 tree, there are corresponding red–black trees with data elements in the same order. The insertion and deletion
            operations on 2-4 trees are also equivalent to color-flipping and rotations in red–black trees. This makes 2-4 trees an
            important tool for understanding the logic behind red–black trees, and this is why many introductory algorithm texts introduce
            2-4 trees just before red–black trees, even though **2-4 trees are not often used in practice**.
        -   [CS 61B Lecture 26: Balanced Search Trees (video)](https://archive.org/details/ucberkeley_webcast_zqrqYXkth6Q)
        -   [Bottom Up 234-Trees (video)](https://www.youtube.com/watch?v=DQdMYevEyE4&index=4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
        -   [Top Down 234-Trees (video)](https://www.youtube.com/watch?v=2679VQ26Fp4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=5)

    -   **N-ary (K-ary, M-ary) trees**

        -   note: the N or K is the branching factor (max branches)
        -   binary trees are a 2-ary tree, with branching factor = 2
        -   2-3 trees are 3-ary
        -   [K-Ary Tree](https://en.wikipedia.org/wiki/K-ary_tree)

    -   **B-Trees**
        -   Fun fact: it's a mystery, but the B could stand for Boeing, Balanced, or Bayer (co-inventor).
        -   In Practice:
            B-Trees are widely used in databases. Most modern filesystems use B-trees (or Variants). In addition to
            its use in databases, the B-tree is also used in filesystems to allow quick random access to an arbitrary
            block in a particular file. The basic problem is turning the file block i address into a disk block
            (or perhaps to a cylinder-head-sector) address
        -   [B-Tree](https://en.wikipedia.org/wiki/B-tree)
        -   [B-Tree Datastructure](http://btechsmartclass.com/data_structures/b-trees.html)
        -   [Introduction to B-Trees (video)](https://www.youtube.com/watch?v=I22wEC1tTGo&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=6)
        -   [B-Tree Definition and Insertion (video)](https://www.youtube.com/watch?v=s3bCdZGrgpA&index=7&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
        -   [B-Tree Deletion (video)](https://www.youtube.com/watch?v=svfnVhJOfMc&index=8&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
        -   [MIT 6.851 - Memory Hierarchy Models (video)](https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf) - covers cache-oblivious B-Trees, very interesting data structures - the first 37 minutes are very technical, may be skipped (B is block size, cache line size)

-   ### k-D Trees

    -   Подходящи за намиране на брой точки в квадратен или по-висш по размерност обект
    -   Подходящи за к-ти близки съседи
    -   [kNN K-d tree algorithm (video)](https://www.youtube.com/watch?v=Y4ZgLlDfKDg)

-   ### Skip lists

    -   "These are somewhat of a cult data structure" - Skiena
    -   [Randomization: Skip Lists (video)](https://www.youtube.com/watch?v=2g9OSRKJuzM&index=10&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
    -   [For animations and a little more detail](https://en.wikipedia.org/wiki/Skip_list)

-   ### Network Flows

    -   [Ford-Fulkerson in 5 minutes — Step by step example (video)](https://www.youtube.com/watch?v=Tl90tNtKvxs)
    -   [Ford-Fulkerson Algorithm (video)](https://www.youtube.com/watch?v=v1VgJmkEJW0)
    -   [Network Flows (video)](https://www.youtube.com/watch?v=2vhN4Ice5jI)

-   ### Disjoint Sets & Union Find

    -   [UCB 61B - Disjoint Sets; Sorting & selection (video)](https://archive.org/details/ucberkeley_webcast_MAEGXTwmUsI)
    -   [Sedgewick Algorithms - Union-Find (6 videos)](https://www.coursera.org/learn/algorithms-part1/home/week/1)

-   ### Math for Fast Processing

    -   [Integer Arithmetic, Karatsuba Multiplication (video)](https://www.youtube.com/watch?v=eCaXlAaN2uE&index=11&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
    -   [The Chinese Remainder Theorem (used in cryptography) (video)](https://www.youtube.com/watch?v=ru7mWZJlRQg)

-   ### Treap

    -   Комбинация от двоично дърво за търсене и heap
    -   [Treap](https://en.wikipedia.org/wiki/Treap)
    -   [Структури от данни: Treaps обяснени (клип)](https://www.youtube.com/watch?v=6podLUYinH8)
    -   [Applications in set operations](https://www.cs.cmu.edu/~scandal/papers/treaps-spaa98.pdf)

-   ### Линейно програмиране (клипове)

    -   [Линейно програмиране](https://www.youtube.com/watch?v=M4K6HYLHREQ)
    -   [Намиране на минимална цена](https://www.youtube.com/watch?v=2ACJ9ewUC6U)
    -   [Намиране на максимална стойност](https://www.youtube.com/watch?v=8AA_81xI3ik)
    -   [Решаване на линейни уравнения с Python - Simplex Algorithm](https://www.youtube.com/watch?v=44pAWI7v5Zk)

-   ### Geometry, Convex hull (videos)

    -   [Graph Alg. IV: Intro to geometric algorithms - Lecture 9](https://youtu.be/XIAQRlNkJAw?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3164)
    -   [Geometric Algorithms: Graham & Jarvis - Lecture 10](https://www.youtube.com/watch?v=J5aJEcOr6Eo&index=10&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
    -   [Divide & Conquer: Convex Hull, Median Finding](https://www.youtube.com/watch?v=EzeYI7p9MjU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=2)

-   ### Discrete math

    -   [Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory](http://www.infocobuild.com/education/audio-video-courses/computer-science/cs70-spring2015-berkeley.html)
    -   [Discrete Mathematics by Shai Simonson (19 videos)](https://www.youtube.com/playlist?list=PLWX710qNZo_sNlSWRMVIh6kfTjolNaZ8t)
    -   [Discrete Mathematics By IIT Ropar NPTEL](https://nptel.ac.in/courses/106/106/106106183/)

-   ### Machine Learning
    -   Защо ML?
        -   [How Google Is Remaking Itself As A Machine Learning First Company](https://backchannel.com/how-google-is-remaking-itself-as-a-machine-learning-first-company-ada63defcb70)
        -   [Large-Scale Deep Learning for Intelligent Computer Systems (video)](https://www.youtube.com/watch?v=QSaZGT4-6EY)
        -   [Deep Learning and Understandability versus Software Engineering and Verification by Peter Norvig](https://www.youtube.com/watch?v=X769cyzBNVw)
    -   [Google's Cloud Machine learning tools (video)](https://www.youtube.com/watch?v=Ja2hxBAwG_0)
    -   [Google Developers' Machine Learning Recipes (Scikit Learn & Tensorflow) (video)](https://www.youtube.com/playlist?list=PLOU2XLYxmsIIuiBfYad6rFYQU_jL2ryal)
    -   [Tensorflow (video)](https://www.youtube.com/watch?v=oZikw5k_2FM)
    -   [Tensorflow Tutorials](https://www.tensorflow.org/versions/r0.11/tutorials/index.html)
    -   [Practical Guide to implementing Neural Networks in Python (using Theano)](http://www.analyticsvidhya.com/blog/2016/04/neural-networks-python-theano/)
    -   Courses:
        -   [Great starter course: Machine Learning](https://www.coursera.org/learn/machine-learning) - [videos only](https://www.youtube.com/playlist?list=PLZ9qNFMHZ-A4rycgrgOYma6zxF4BZGGPW) - see videos 12-18 for a review of linear algebra (14 and 15 are duplicates)
        -   [Neural Networks for Machine Learning](https://www.coursera.org/learn/neural-networks)
        -   [Google's Deep Learning Nanodegree](https://www.udacity.com/course/deep-learning--ud730)
        -   [Google/Kaggle Machine Learning Engineer Nanodegree](https://www.udacity.com/course/machine-learning-engineer-nanodegree-by-google--nd009)
        -   [Self-Driving Car Engineer Nanodegree](https://www.udacity.com/drive)
    -   Resources:
        -   Books:
            -   [Python Machine Learning](https://www.amazon.com/Python-Machine-Learning-Sebastian-Raschka/dp/1783555130/)
            -   [Data Science from Scratch: First Principles with Python](https://www.amazon.com/Data-Science-Scratch-Principles-Python/dp/149190142X)
            -   [Introduction to Machine Learning with Python](https://www.amazon.com/Introduction-Machine-Learning-Python-Scientists/dp/1449369413/)
        -   [Machine Learning for Software Engineers](https://github.com/ZuzooVn/machine-learning-for-software-engineers)
        -   Data School: http://www.dataschool.io/

---

## Допълнителни детайли по някои теми

Добавих тези, за да подкрепя някои от темите и материалите посочени по горе, но не исках да ги добавям там, защото са прекалено много. Лесно е да научите прекалено много по някоя тема.
Искате да Ви наемат този век, нали?

-   **SOLID**

    -   [ ] [Bob Martin SOLID Principles of Object Oriented and Agile Design (video)](https://www.youtube.com/watch?v=TMuno5RZNeE)
    -   [ ] S - [Single Responsibility Principle](http://www.oodesign.com/single-responsibility-principle.html) | [Single responsibility to each Object](http://www.javacodegeeks.com/2011/11/solid-single-responsibility-principle.html)
        -   [more flavor](https://docs.google.com/open?id=0ByOwmqah_nuGNHEtcU5OekdDMkk)
    -   [ ] O - [Open/Closed Principle](http://www.oodesign.com/open-close-principle.html) | [On production level Objects are ready for extension but not for modification](https://en.wikipedia.org/wiki/Open/closed_principle)
        -   [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgN2M5MTkwM2EtNWFkZC00ZTI3LWFjZTUtNTFhZGZiYmUzODc1&hl=en)
    -   [ ] L - [Liskov Substitution Principle](http://www.oodesign.com/liskov-s-substitution-principle.html) | [Base Class and Derived class follow ‘IS A’ Principle](http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle)
        -   [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgNzAzZjA5ZmItNjU3NS00MzQ5LTkwYjMtMDJhNDU5ZTM0MTlh&hl=en)
    -   [ ] I - [Interface segregation principle](http://www.oodesign.com/interface-segregation-principle.html) | clients should not be forced to implement interfaces they don't use
        -   [Interface Segregation Principle in 5 minutes (video)](https://www.youtube.com/watch?v=3CtAfl7aXAQ)
        -   [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgOTViYjJhYzMtMzYxMC00MzFjLWJjMzYtOGJiMDc5N2JkYmJi&hl=en)
    -   [ ] D -[Dependency Inversion principle](http://www.oodesign.com/dependency-inversion-principle.html) | Reduce the dependency In composition of objects.
        -   [Why Is The Dependency Inversion Principle And Why Is It Important](http://stackoverflow.com/questions/62539/what-is-the-dependency-inversion-principle-and-why-is-it-important)
        -   [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgMjdlMWIzNGUtZTQ0NC00ZjQ5LTkwYzQtZjRhMDRlNTQ3ZGMz&hl=en)

-   **Union-Find**

    -   [Overview](https://www.coursera.org/learn/data-structures/lecture/JssSY/overview)
    -   [Naive Implementation](https://www.coursera.org/learn/data-structures/lecture/EM5D0/naive-implementations)
    -   [Trees](https://www.coursera.org/learn/data-structures/lecture/Mxu0w/trees)
    -   [Union By Rank](https://www.coursera.org/learn/data-structures/lecture/qb4c2/union-by-rank)
    -   [Path Compression](https://www.coursera.org/learn/data-structures/lecture/Q9CVI/path-compression)
    -   [Analysis Options](https://www.coursera.org/learn/data-structures/lecture/GQQLN/analysis-optional)

-   **Още динамично програмиране** (клипове)

    -   [6.006: Динамично програмиране I: Fibonacci, Shortest Paths](https://www.youtube.com/watch?v=OQ5jsbhAv_M&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=19)
    -   [6.006: Динамично програмиране II: Text Justification, Blackjack](https://www.youtube.com/watch?v=ENyox7kNKeY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=20)
    -   [6.006: ДП III: Parenthesization, Edit Distance, Knapsack](https://www.youtube.com/watch?v=ocZMDMZwhCY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=21)
    -   [6.006: ДП IV: Guitar Fingering, Tetris, Super Mario Bros.](https://www.youtube.com/watch?v=tp4_UXaVyx8&index=22&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
    -   [6.046: Динамично програмиране & ДП за напреднали](https://www.youtube.com/watch?v=Tw1k46ywN6E&index=14&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
    -   [6.046: Динамично програмиране: All-Pairs Shortest Paths](https://www.youtube.com/watch?v=NzgFUwOaoIw&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=15)
    -   [6.046: Динамично програмиране (студентско упражнение)](https://www.youtube.com/watch?v=krZI60lKPek&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=12)

-   **Работа с Графи за напреднали** (видеа)

    -   [Synchronous Distributed Algorithms: Symmetry-Breaking. Shortest-Paths Spanning Trees](https://www.youtube.com/watch?v=mUBmcbbJNf4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=27)
    -   [Asynchronous Distributed Algorithms: Shortest-Paths Spanning Trees](https://www.youtube.com/watch?v=kQ-UQAzcnzA&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=28)

-   MIT **Вероятности** (съдържа доста математика, минавайте бавно през този материал) (клипове):

    -   [MIT 6.042J - Probability Introduction](https://www.youtube.com/watch?v=SmFwFdESMHI&index=18&list=PLB7540DEDD482705B)
    -   [MIT 6.042J - Conditional Probability](https://www.youtube.com/watch?v=E6FbvM-FGZ8&index=19&list=PLB7540DEDD482705B)
    -   [MIT 6.042J - Independence](https://www.youtube.com/watch?v=l1BCv3qqW4A&index=20&list=PLB7540DEDD482705B)
    -   [MIT 6.042J - Random Variables](https://www.youtube.com/watch?v=MOfhhFaQdjw&list=PLB7540DEDD482705B&index=21)
    -   [MIT 6.042J - Expectation I](https://www.youtube.com/watch?v=gGlMSe7uEkA&index=22&list=PLB7540DEDD482705B)
    -   [MIT 6.042J - Expectation II](https://www.youtube.com/watch?v=oI9fMUqgfxY&index=23&list=PLB7540DEDD482705B)
    -   [MIT 6.042J - Large Deviations](https://www.youtube.com/watch?v=q4mwO2qS2z4&index=24&list=PLB7540DEDD482705B)
    -   [MIT 6.042J - Random Walks](https://www.youtube.com/watch?v=56iFMY8QW2k&list=PLB7540DEDD482705B&index=25)

-   [Simonson: Approximation Algorithms (video)](https://www.youtube.com/watch?v=oDniZCmNmNw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=19)

-   **Съвпадение на низове**

    -   Алгоритъм на Рабин-Карп (видеа):
        -   [Rabin Karps Algorithm](https://www.coursera.org/learn/data-structures/lecture/c0Qkw/rabin-karps-algorithm)
        -   [Precomputing](https://www.coursera.org/learn/data-structures/lecture/nYrc8/optimization-precomputation)
        -   [Optimization: Implementation and Analysis](https://www.coursera.org/learn/data-structures/lecture/h4ZLc/optimization-implementation-and-analysis)
        -   [Table Doubling, Karp-Rabin](https://www.youtube.com/watch?v=BRO7mVIFt08&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=9)
        -   [Rolling Hashes, Amortized Analysis](https://www.youtube.com/watch?v=w6nuXg0BISo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=32)
    -   Алгоритъм на Кнут-Морис-Прaт (KMP):
        -   [TThe Knuth-Morris-Pratt (KMP) String Matching Algorithm](https://www.youtube.com/watch?v=5i7oKodCRJo)
    -   Алгоритъм на Бойер-Мур
        -   [Boyer-Moore String Search Algorithm](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm)
        -   [Advanced String Searching Boyer-Moore-Horspool Algorithms (video)](https://www.youtube.com/watch?v=QDZpzctPf10)
    -   [Coursera: Algorithms on Strings](https://www.coursera.org/learn/algorithms-on-strings/home/week/1)
        -   Започва супер, но след KMP започва да става излишно сложен
        -   Добро обяснение на префиксни дървета
        -   Може да го пропуснете

-   **Сортиране**

    -   Stanford лекции за сортиране:
        -   [Лекция 15 | Programming Abstractions (клип)](https://www.youtube.com/watch?v=ENp00xylP7c&index=15&list=PLFE6E58F856038C69)
        -   [Лекция 16 | Programming Abstractions (клип)](https://www.youtube.com/watch?v=y4M9IVgrVKo&index=16&list=PLFE6E58F856038C69)
    -   Shai Simonson, [Aduni.org](http://www.aduni.org/):
        -   [Алгоритми - Сортиране - Лекция 2 (клип)](https://www.youtube.com/watch?v=odNJmw5TOEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=2)
        -   [Алгоритми - Сортиране II - Лекция 3 (клип)](https://www.youtube.com/watch?v=hj8YKFTFKEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=3)
    -   Steven Skiena лекции за сортиране:
        -   [Лекцията започва на 26:46 (клип)](https://youtu.be/ute-pmMkyuk?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1600)
        -   [Лекцията започва на27:40 (клип)](https://www.youtube.com/watch?v=yLvp-pB8mak&index=8&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
        -   [Лекцията започва на35:00 (клип)](https://www.youtube.com/watch?v=q7K9otnzlfE&index=9&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
        -   [Лекцията започва на23:50 (клип)](https://www.youtube.com/watch?v=TvqIGu9Iupw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=10)

## Видео серии

Настанете се удобно и се наслаждавайте.

-   [Списък с различни Dynamic Programming задачи (за всички накратко)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr)

-   [x86 Architecture, Assembly, Applications (11 видеа)](https://www.youtube.com/playlist?list=PL038BE01D3BAEFDB0)

-   [MIT 18.06 Linear Algebra, Spring 2005 (35 видеа)](https://www.youtube.com/playlist?list=PLE7DDD91010BC51F8)

-   [Excellent - MIT Calculus Revisited: Single Variable Calculus](https://www.youtube.com/playlist?list=PL3B08AE665AB9002A)

-   CSE373 - Анализ на алгоритми (25 клипа)

    -   [Skiena lectures from Algorithm Design Manual](https://www.youtube.com/watch?v=ZFjhkohHdAA&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=1)

-   [UC Berkeley 61B (Spring 2014): Data Structures (25 видеа)](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd)

-   [UC Berkeley 61B (Fall 2006): Data Structures (39 видеа)](https://archive.org/details/ucberkeley-webcast-PL4BBB74C7D2A1049C)

-   [UC Berkeley 61C: Machine Structures (26 видеа)](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_)

-   [OOSE: Software Dev Using UML and Java (21 видеа)](https://www.youtube.com/playlist?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)

-   ~~[UC Berkeley CS 152: Computer Architecture and Engineering (20 видеа)](https://www.youtube.com/watch?v=UH0QYvtP7Rk&index=20&list=PLkFD6_40KJIwEiwQx1dACXwh-2Fuo32qr)~~

-   [MIT 6.004: Computation Structures (49 видеа)](https://www.youtube.com/playlist?list=PLDSlqjcPpoL64CJdF0Qee5oWqGS6we_Yu)

-   [Carnegie Mellon - Computer Architecture Lectures (39 видеа)](https://www.youtube.com/playlist?list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq)

-   [MIT 6.006: Intro to Algorithms (47 видеа)](https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&nohtml5=False)

-   [MIT 6.033: Computer System Engineering (22 видеа)](https://www.youtube.com/watch?v=zm2VP0kHl1M&list=PL6535748F59DCA484)

-   [MIT 6.034 Artificial Intelligence, Fall 2010 (30 видеа)](https://www.youtube.com/playlist?list=PLUl4u3cNGP63gFHB6xb-kVBiQHYe_4hSi)

-   [MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 видеа)](https://www.youtube.com/watch?v=L3LMbpZIKhQ&list=PLB7540DEDD482705B)

-   [MIT 6.046: Design and Analysis of Algorithms (34 видеа)](https://www.youtube.com/watch?v=2P-yW7LQr08&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)

-   [MIT 6.050J: Information and Entropy, Spring 2008 (19 видеа)](https://www.youtube.com/watch?v=phxsQrZQupo&list=PL_2Bwul6T-A7OldmhGODImZL8KEVE38X7)

-   [MIT 6.824: Distributed Systems, Spring 2020 (20 видеа)](https://www.youtube.com/watch?v=cQP8WApzIQQ&list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB)

-   [MIT 6.851: Advanced Data Structures (22 видеа)](https://www.youtube.com/watch?v=T0yzrZL1py0&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=1)

-   [MIT 6.854: Advanced Algorithms, Spring 2016 (24 видеа)](https://www.youtube.com/playlist?list=PL6ogFv-ieghdoGKGg2Bik3Gl1glBTEu8c)

-   [Harvard COMPSCI 224: Advanced Algorithms (25 видеа)](https://www.youtube.com/playlist?list=PL2SOU6wwxB0uP4rJgf5ayhHWgw7akUWSf)

-   [MIT 6.858 Computer Systems Security, Fall 2014](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)

-   [Stanford: Programming Paradigms (27 видеа)](https://www.youtube.com/playlist?list=PL9D558D49CA734A02)

-   [Въведение в криптографията от Christof Paar](https://www.youtube.com/playlist?list=PL6N5qY2nvvJE8X75VkXglSrVhLv1tVcfy)

    -   [Сайтът на курса с презентации и задачи](http://www.crypto-textbook.com/)

-   [Mining Massive Datasets - Stanford University (94 видеа)](https://www.youtube.com/playlist?list=PLLssT5z_DsK9JDLcT8T62VtzwyW9LNepV)

-   [Теория на графите от Sarada Herke (67 видеа)](https://www.youtube.com/user/DrSaradaHerke/playlists?shelf_id=5&view=50&sort=dd)

## Курсове по компютърни науки

-   [Папка с онлайн курсове по компютърни науки](https://github.com/open-source-society/computer-science)
-   [Папка с курсове по компютърни науки (много от които с онлайн лекции)](https://github.com/prakhar1989/awesome-courses)

## Имплементация на алгоритми

-   [Имплементации на различни алгоритми от принстънския университет](https://algs4.cs.princeton.edu/code)

## Статии и други ресурси

-   [Love classic papers?](https://www.cs.cmu.edu/~crary/819-f09/)
-   [1978: Communicating Sequential Processes](http://spinroot.com/courses/summer/Papers/hoare_1978.pdf)
    -   [implemented in Go](https://godoc.org/github.com/thomas11/csp)
-   [2003: The Google File System](http://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf)
    -   сменено от Colossus през 2012
-   [2004: MapReduce: Simplified Data Processing on Large Clusters](http://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf)
    -   сменено от Cloud Dataflow?
-   [2006: Bigtable: A Distributed Storage System for Structured Data](https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf)
-   [2006: The Chubby Lock Service for Loosely-Coupled Distributed Systems](https://research.google.com/archive/chubby-osdi06.pdf)
-   [2007: Dynamo: Amazon’s Highly Available Key-value Store](http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf)
    -   Dynamo е статията която стартира NoSQL революцията.
-   [2007: What Every Programmer Should Know About Memory (very long, and the author encourages skipping of some sections)](https://www.akkadia.org/drepper/cpumemory.pdf)
-   2012: AddressSanitizer: A Fast Address Sanity Checker:
    -   [статия](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf)
    -   [видео](https://www.usenix.org/conference/atc12/technical-sessions/presentation/serebryany)
-   2013: Spanner: Google’s Globally-Distributed Database:
    -   [статия](http://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf)
    -   [видео](https://www.usenix.org/node/170855)
-   [2014: Machine Learning: The High-Interest Credit Card of Technical Debt](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43146.pdf)
-   [2015: Continuous Pipelines at Google](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf)
-   [2015: High-Availability at Massive Scale: Building Google’s Data Infrastructure for Ads](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44686.pdf)
-   [2015: TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems](http://download.tensorflow.org/paper/whitepaper2015.pdf)
-   [2015: How Developers Search for Code: A Case Study](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf)
-   Още материал: [1,000 статии](https://github.com/0voice/computer_expert_paper)

## Лиценз

[CC-BY-SA-4.0](./LICENSE.txt)
