Оригінал англійською
Спочатку я створив це як короткий список завдань для вивчення тем, щоб стати інженером програмного забезпечення, але він збільшився до великого списку, який ви бачите сьогодні. Пройшовши цей навчальний план, мене найняли розробником програмного забезпечення в Amazon! Можливо, вам не доведеться вчитися так багато, як мені. У будь-якому випадку, все, що тобі потрібно, є тут.
Я навчався приблизно 8-12 годин на день, протягом декількох місяців. Це моя історія: Чому я навчався очно протягом 8 місяців для інтерв’ю в Google.
Зверніть Увагу: вам не потрібно буде вчитися так багато, як мені. Я витратив багато часу на речі, які мені не потрібно було знати. Більше інформації про це нижче. Я допоможу вам досягти мети, не витрачаючи ваш дорогоцінний час.
Перелічені тут ресурси добре підготують вас до технічної співбесіди практично в будь-якій компанії, включаючи гігантів: Amazon, Facebook, Google та Microsoft.
Нехай щастить!
Переклади:
Переклади в процесі:
Це мій багатомісячний план навчання, щоб стати інженером програмного забезпечення у великій компанії.
Необхідно:
- Невеликий досвід кодування (змінні, цикли, методи/функції тощо)
- Терпіння
- Час
Зверніть увагу, що це навчальний план з інженерії програмного забезпечення, не фронтенд-разробки чи фуллстек-розробки. Для цих кар'єрних шляхів існують дійсно чудові дорожні карти та курси із завданнями в інших місцях (дивись https://roadmap.sh/ для отримання додаткової інформації).
На університетській програмі з комп'ютерних наук можна багато чому навчитися, але для проходження співбесіди достатньо знати лише 75%, тож саме про це я розповідаю тут. Для повної програми самонавчання компʼютерним наукам, ресурси для мого навчального плану були включені в дорожню карту курса з комп'ютерних наук Камран Ахмеда: https://roadmap.sh/computer-science.
- Що це?
- Чому це використовувати?
- Як це використовувати
- Не почувайтесь недостатньо розумними
- Про відео-ресурси
- Оберіть мову програмування
- Книги про структури даних та алгоритми
- Книги з підготовки до співбесіди
- Не робіть моїх помилок
- Що не буде охоплено
- Щоденний план
- Практика з питань кодування
- Проблеми кодування
- Складність алгоритмів / Big-O / Асимптотичний аналіз
- Структури даних
- Більше знань
- Дерева
- Дерева - Вступ
- Бінарні дерева пошуку: BSTs
- Купа / Пріоритетна черга / Бінарна купа
- Збалансовані дерева пошуку (загальна концепція, не деталі)
- Обходи: preorder, inorder, postorder, BFS, DFS
- Сортування
- вибір (selection)
- вставка (insertion)
- купчасте сортування (heapsort)
- швидке сортування (quicksort)
- злиття (mergesort)
- Графи
- спрямовані (directed)
- неспрямовані (undirected)
- матриця суміжності (adjacency matrix)
- список суміжності (adjacency list)
- обходи: BFS, DFS (traversals: BFS, DFS)
- Ще більше знань
- Рекурсія
- Динамічне програмування
- Шаблони проектування
- Комбінаторика (n choose k) та ймовірність
- NP, NP-повні та Апроксимаційні Алгоритми
- Як комп'ютер виконує програму
- Кеші
- Процеси та потоки
- Тестування
- Пошук та маніпуляції з рядками
- Префіксні дерева
- Числа з рухомою комою
- Юнікод
- Ендіанність (Порядок байтів)
- Робота з мережами
- Фінальний огляд
- Оновіть своє резюме
- Знайдіть роботу
- Процес співбесіди та загальна підготовка до співбесіди
- Підготуйтеся до співбесіди
- Підготуйте запитання до інтерв'юера
- Як тільки отримали роботу
---------------- Все, що нижче цього пункту необов'язково ----------------
- Додаткові книги
- Проектування систем, Масштабування, Обробка даних (якщо у вас є досвід роботи 4+ років)
- Додаткове навчання
- Компілятори
- Emacs та vi(m)
- Засоби командного рядка Unix (Unix CLI tools)
- Теорія інформації
- Паритет та код Хеммінга
- Ентропія
- Криптографія
- Стиснення
- Комп'ютерна безпека
- Прибирання сміття
- Паралельне програмування
- Системи Обміну повідомленнями, Серіалізації та Черги
- A*
- Швидке перетворення Фур'є
- фільтр Блума (Bloom Filter)
- HyperLogLog
- Локально-чутливе Хешування (Locality-Sensitive Hashing)
- Дерева ван Емде Боаса
- Доповнені (аугментовані) структури даних
- N-ary (K-ary, M-ary) дерева
- Збалансовані дерева пошуку (Balanced search trees)
- AVL дерева
- Splay дерева
- Red/black дерева
- 2-3 search дерева
- 2-3-4 дерева (aka 2-4 дерева)
- N-ary (K-ary, M-ary) дерева
- B-дерева
- k-D дерева
- Списки пропуску (Skip lists)
- Мережеві потоки
- Математика для Швидкої Обробки
- Treap
- Лінійне програмування
- Геометрія, Випуклий корпус
- Дискретна математика
- Додаткова інформація про деякі теми
- Відео
- Курси комп'ютерних наук
- Статті
Якщо ви хочете працювати інженером програмного забезпечення у великій компанії, це те, що вам потрібно знати.
Якщо ви, як і я, не встигли отримати ступінь з комп'ютерних наук, цей курс допоможе вам надолужити згаяне і заощадити чотири роки вашого життя.
Коли я починав цей проект, я не знав, як відрізнити стек від купи, не знав нічого про Big-O, або про дерева, або про те, як обходити граф. Якби мені довелося писати алгоритм сортування, можу сказати, що він був би жахливим. Кожна структура даних, яку я коли-небудь використовував, була вбудована в мову, і я взагалі не знав, як вони працюють під капотом. Мені ніколи не доводилося керувати пам'яттю, хіба що процес, який я запускав, видавав помилку «не вистачило пам'яті», і тоді мені доводилося шукати обхідний шлях. У своєму житті я використовував кілька багатовимірних масивів і тисячі асоціативних масивів, але я ніколи не створював структури даних з нуля.
Це довгий план. Це може зайняти кілька місяців. Якщо ви вже знайомі з багатьма з цих питань, це займе набагато менше часу.
Весь текст нижче - це список, а вам потрібно пройти всі його елементи зверху вниз.
Я використовую спеціальну Github розмітку - markdown, щоб відслідковувати свій прогрес.
На цій сторінці натисніть кнопку «Код» ("Code") вгорі, а потім натисніть «Завантажити ZIP» ("Download ZIP"). Розпакуйте файл, і ви зможете працювати з текстовими файлами.
Якщо ви відкриваєте код у редакторі коду, який розуміє розмітку, ви побачите, що все відформатовано правильно.
Створіть нову гілку, аби ви могли відмічати зроблені задачі, поміщаючи x в квадратні дужки: [x]
-
Форкніть репозиторій GitHub:
https://github.com/jwasham/coding-interview-university
натиснувши на кнопку Форк (Fork). -
Клонуйте в локальний репозиторій:
git clone https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.git cd coding-interview-university git remote add upstream https://github.com/jwasham/coding-interview-university.git git remote set-url --push upstream DISABLE # so that you don't push your personal progress back to the original repo
-
Позначте всі поля X після того, як ви внесли зміни:
git commit -am "Marked personal progress" git pull upstream main # keep your fork up-to-date with changes from the original repo git push # just pushes to your fork
- Успішні інженери програмного забезпечення розумні, але багато хто з них відчуває невпевненість у тому, що вони недостатньо розумні.
- Наступні відео можуть допомогти вам подолати цю невпевненість:
- Міф про геніального програміста The myth of the Genius Programmer
- Небезпечно йти наодинці: Боротьба з невидимими монстрами в технологіях It's Dangerous to Go Alone: Battling the Invisible Monsters in Tech
Деякі відео доступні лише за умови реєстрації на курсах Coursera або EdX. Це так звані масові відкриті курси (MOOCs). Іноді заняття не проводяться, тому вам доведеться чекати кілька місяців, і ви не матимете доступу.
Було б чудово замінити ресурси онлайн-курсів безкоштовними і завжди доступними публічними джерелами, такими як відео на YouTube (бажано університетські лекції), щоб ви могли вивчати їх у будь-який час, а не лише під час сесії конкретного онлайн-курсу.
Вам потрібно буде обрати мову програмування для співбесід з кодування, але вам також потрібно буде знайти мову, яку ви зможете використовувати для вивчення концепцій комп'ютерних наук.
Бажано, щоб мова була однаковою, щоб вам потрібно було володіти лише однією мовою.
Коли я складав навчальний план, я використовував 2 мови для більшої його частини: C та Python
Ви можете використовувати мову, якою вам зручно виконувати завдання на написання коду, але для великих компаній ці мови є найкращим вибором:
- С: Дуже низький рівень. Дозволяє працювати з покажчиками та розподілом/виділенням пам'яті, тому ви відчуваєте структури даних та алгоритми до мозку кісток. У мовах вищого рівня, таких як Python або Java, вони приховані від вас. У повсякденній роботі це чудово, але коли ви вивчаєте, як побудовані ці низькорівневі структури даних, чудово відчувати себе ближче до металу.
- C є скрізь. Ви побачите приклади в книгах, лекціях, відео, всюди під час навчання.
- Мова програмування C, 2-е видання The C Programming Language, 2nd Edition
- Це коротка книжка, але вона дасть вам чудові знання про мову C, і якщо ви трохи попрактикуєтесь ви швидко станете вправним. Розуміння C допоможе вам зрозуміти, як працюють програми та пам'ять.
- Вам не потрібно заглиблюватися в книгу (або навіть дочитувати її). Просто дійдіть до того рівня, на якому вам буде комфортно читати і писати C.
- Python: Python: Сучасна і дуже виразна, я вивчив її, тому що вона дуже корисна, а також дозволяє мені писати менше коду під час співбесіди.
Це мої уподобання. Ви, звичайно, робіть, що хочете.
Можливо, вам це не знадобиться, але ось кілька сайтів для вивчення нової мови:
Ви можете використовувати мову, якою вам зручно писати код під час співбесіди, але для великих компаній ці мови є найкращим вибором:
- C++
- Java
- Python
Ви також можете скористатися цими, але спочатку почитайте навколо. Можуть бути застереження:
- JavaScript
- Ruby
Ось стаття, яку я написав про вибір мови для співбесіди: Pick One Language for the Coding Interview.
Це оригінальна стаття, на якій ґрунтується мій пост: Choosing a Programming Language for Interviews
Ви повинні дуже добре володіти мовою і бути обізнаним.
Дізнайтеся більше про вибір:
Ця книга стане вашим фундаментом у вивченні компʼютерних наук.
Просто виберіть одну, мовою, яка вам буде зручна. Вам доведеться багато читати і кодувати.
- Алгоритми на C, частини 1-5 (комплект), 3-тє видання Algorithms in C, Parts 1-5 (Bundle), 3rd Edition
- Основи, структури даних, алгоритми сортування, пошуку та побудови графів
- Структури даних та алгоритми в Python Data Structures and Algorithms in Python
- by Goodrich, Tamassia, Goldwasser
- Мені сподобалася ця книга. Вона охоплює все і навіть більше.
- Пітонівський код
- мій яскравий книжковий звіт: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
Ваш вибір:
- Goodrich, Tamassia, Goldwasser
- Структури даних та алгоритми в Java Data Structures and Algorithms in Java
- Sedgewick and Wayne:
- Алгоритми Algorithms
- Безкоштовний курс на Coursera, який охоплює книгу (викладається авторами!):
- Алгоритми I Algorithms I
- Алгоритми II Algorithms II
Ваш вибір:
- Goodrich, Tamassia, and Mount
- Структури даних та алгоритми в C++, 2-е видання Data Structures and Algorithms in C++, 2nd Edition
- Sedgewick and Wayne
- Алгоритми в C++, частини 1-4: Основи, структура даних, сортування, пошук Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching
- Алгоритми в C++ Частина 5: Графові алгоритми Algorithms in C++ Part 5: Graph Algorithms
Вам не потрібно купувати купу цих книг. Чесно кажучи, "Проходження співбесіди з кодування" ("Cracking the Coding Interview"), мабуть, достатньо, але я купив ще, щоб мати більше практики. Але я завжди роблю забагато.
Я купив обидві наступни книжки. Вони дали мені багато практики.
- Програмування співбесіди розкрито: Кодування вашого шляху через співбесіду, 4-е видання Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition
- Відповіді на C++ та Java
- Це хороша розминка перед Cracking the Coding Interview
- Не надто складно. Більшість проблем можуть бути простішими, ніж ті, що ви побачите на співбесіді (з того, що я читав)
- Проходження співбесіди з кодування, 6-й випуск Cracking the Coding Interview, 6th Edition
- відповіді на Java
Оберіть одну:
- Елементи співбесід з програмування (версія на C++) Elements of Programming Interviews (C++ version)
- Елементи співбесід з програмування (версія на Python) Elements of Programming Interviews in Python
- Елементи співбесід з програмування (версія на Java) Elements of Programming Interviews (Java version) - Супутній проект - заглушки методів та тестові кейси для кожної проблеми в книзі
Цей список зростав протягом багатьох місяців, і так, він трохи вийшов з-під контролю.
Ось кілька помилок, яких я припустився, щоб у вас був кращий досвід. І ви заощадите місяці часу.
Я дивився години відео і робив численні нотатки, і через місяці багато чого не пам'ятав. Я провів 3 дні, переглядаючи свої нотатки і роблячи флеш-картки, щоб мати змогу повторити. Мені не потрібні були всі ці знання.
Прочитайте, будь ласка, щоб не робити моїх помилок:
Збереження знань з комп'ютерних наук Retaining Computer Science Knowledge
Щоб вирішити цю проблему, я зробив невеличкий сайт флеш-карток, на який можна було додавати флеш-картки 2 типів: загальні та кодові. Кожна картка має свій формат. Я створив сайт для мобільних пристроїв, щоб я міг переглядати його на телефоні та планшеті, де б я не був.
Зробіть свій власний безкоштовно:
- Репозиторій сайту з флеш-картками Flashcards site repo
Я НЕ РЕКОМЕНДУЮ використовувати мої картки. Їх занадто багато, і більшість з них - тривіальні дрібниці, які вам не потрібні.
Але якщо ви не хочете мене слухати, то ось вам:
- Моя база даних флеш-карток (1200 карток) My flash cards database (1200 cards):
- Моя база даних флеш-карток (екстрім - 1800 карток) My flash cards database (extreme - 1800 cards):
Майте на увазі, що я переборщив і маю картки, що охоплюють все - від асемблера і дрібниць Python до машинного навчання і статистики. Це занадто багато за те, що потрібно.
Нотатки на флеш-картках: Коли ви вперше зрозумієте, що знаєте відповідь, не позначайте її як відому. Ви повинні побачити одну й ту саму картку і відповісти на неї кілька разів правильно, перш ніж ви дійсно дізнаєтесь її. Повторення поглибить ці знання у вашому мозку.
Альтернативою використанню мого сайту є Anki, який мені неодноразово рекомендували. Там використовується система повторень, щоб допомогти вам запам'ятати. Він зручний у використанні, доступний на всіх платформах і має систему синхронізації в Cloud. Коштує $25 на iOS, але безкоштовно на інших платформах.
Моя база даних флеш-карт у форматі Anki: https://ankiweb.net/shared/info/25173560 (дякую @xiewenya)
Деякі студенти згадували про проблеми з форматуванням пробілів, які можна виправити наступним чином: відкрийте колоду, відредагуйте картку, клацніть на картки (Cards), виберіть радіо-кнопку «стилі» (Styles) і додайте до класу картки стиль "white-space: pre;".
ЦЕ ДУЖЕ ВАЖЛИВО.
Почніть кодувати питання для співбесіди, поки вивчаєте структури даних та алгоритми.
Вам потрібно застосовувати те, що ви вивчаєте, для вирішення проблем, інакше ви забудете. Я зробив цю помилку.
Після того, як ви вивчили тему і відчуваєте себе комфортно з нею, наприклад, зв'язані списки:
- Відкрийте одну з книг для підготовки до співбесіди з кодування (або веб-сайти з проблем кодування, перелічені нижче)
- Поставте (зробіть) 2-3 запитання (задачі) про зв'язані списки.
- Перейдіть до наступної навчальної теми.
- Пізніше поверніться і розв'яжіть ще 2-3 задачі зі зв'язаними списками.
- Робіть це з кожною новою темою, яку ви вивчаєте.
Виконуйте завдання під час навчання, а не після.
Вас наймають не за знання, а за те, як ви їх застосовуєте.
Для цього є багато ресурсів, перелічених нижче. Не зупиняйтеся.
Існує багато відволікаючих чинників, які можуть забирати дорогоцінний час. Зосередитися і сконцентруватися важко. Увімкніть музику без слів, і ви зможете досить добре зосередитися.
Це поширені технології, але вони не є частиною цього навчального плану:
- Javascript
- HTML, CSS, та інші фронтенд технології
- SQL
Цей курс охоплює багато тем. Кожна з них, ймовірно, займе у вас кілька днів, а може навіть тиждень чи більше. Це залежить від вашого графіку.
Кожного дня обирайте наступну тему зі списку, переглядайте відео на цю тему, а потім напишіть реалізацію цієї структури даних або алгоритму мовою, яку ви обрали для цього курсу.
Ви можете побачити мій код тут:
Вам не потрібно запам'ятовувати кожен алгоритм. Ви просто повинні розуміти його достатньо, щоб мати можливість написати власну реалізацію.
Чому це тут? Я не готовий до співбесіди.
Тоді поверніться і прочитайте це.
Чому потрібно практикуватись у розв'язуванні задач з програмування:
- Розпізнавання проблеми, і де потрібні правильні структури даних та алгоритми
- Збір вимог до задачі
- Обговорення проблеми так, як ви будете говорити на співбесіді
- Кодування на дошці або папері, а не на комп'ютері
- Визначення часової та просторової складності ваших рішень (див. Big-O нижче)
- Тестування ваших рішень
Існує чудовий вступ для методичного, комунікативного вирішення проблем під час співбесіди. Ви можете знайти це в книгах із співбесід з програмування, але я вважаю, що цей посібник є видатним: Algorithm design canvas
Пишіть код на дошці або папері, а не на комп'ютері. Протестуйте з деякими зразками вхідних даних. Потім надрукуйте його та протестуйте на комп'ютері.
Якщо у вас вдома немає дошки, візьміть великий блокнот для малювання в художньому магазині. Ви можете сидіти на дивані і практикуватись. Це моя «диванна дошка». Я додав ручку на фото лише для масштабу. Якщо ви використовуєте ручку, ви пошкодуєте, що не можете її стерти. Швидко стає брудно. Я використовую олівець і гумку.
Практика з питань кодування - це не про запам'ятовування відповідей на задачі програмування.
Не забудьте свої ключові книги по співбесідам з кодування тут.
Вирішення проблем:
- Як знайти рішення How to Find a Solution
- Як розібрати постановку задачі для топкодерів How to Dissect a Topcoder Problem Statement
Відео з питаннями до співбесіди на кодування:
- ЯЗаслуговую (88 відео) IDeserve (88 videos)
- Тушар Рой (5 плейлистів) Tushar Roy (5 playlists)
- Чудово підходить для покрокового вирішення проблем
- Нік Уайт - Рішення на LeetCode (187 відео) Nick White - LeetCode Solutions (187 Videos)
- Гарні пояснення рішення та коду
- Ви можете переглянути декілька за короткий час
- ФішерКодер - Рішення на LeetCode FisherCoder - LeetCode Solutions
Сайти викликів/практик:
- LeetCode
- Мій улюблений сайт із завданнями на кодування. Він вартий того, щоб заплатити гроші за підписку на 1-2 місяці, які ви, ймовірно, витратите на підготовку.
- Дивіться відео Ніка Уайта та ФішерКодера вище для покрокового вивчення коду.
- HackerRank
- TopCoder
- Codeforces
- Codility
- Geeks for Geeks
- AlgoExpert
- Створений інженерами Google, це також чудовий ресурс для відточування навичок.
- Project Euler
- дуже математично орієнтований і не дуже підходить для співбесід з кодування
Гаразд, досить розмов, давайте вчитися!
Але не забувайте виконувати завдання з кодування зверху, поки будете вчитися!
- Тут не потрібно нічого впроваджувати, ви просто дивитеся відео та робите нотатки! Ура!
- Тут багато відео. Просто дивіться достатньо, поки не зрозумієте. Ви завжди можете повернутися і переглянути.
- Не хвилюйтеся, якщо ви не розумієте всієї математики, що стоїть за цим.
- Вам просто потрібно зрозуміти, як виразити складність алгоритму в термінах Big-O.
- Гарвард CS50 - асимптотичне позначення (відео) Harvard CS50 - Asymptotic Notation (video)
- Позначення Big O (загальний короткий посібник) (відео) Big O Notations (general quick tutorial) (video)
- Позначення Big O (а також Омега і Тета) - найкраще математичне пояснення (відео) Big O Notation (and Omega and Theta) - best mathematical explanation (video)
- Скієна (Skiena) video
- UC Berkeley Big O (video)
- Амортизаційний аналіз (відео) Amortized Analysis (video)
- TopCoder (включає рекурентні співвідношення та основну теорему):
- Обчислювальна складність: Розділ 1 Computational Complexity: Section 1
- Обчислювальна складність: Розділ 2 Computational Complexity: Section 2
- Шпаргалка Cheat sheet
- [Огляд] Аналіз алгоритмів (плейлист) за 18 хвилин (відео) [Review] Analyzing Algorithms (playlist) in 18 minutes (video)
Що ж, цього вже достатньо.
Коли ви проходите "Cracking the Coding Interview", там є розділ про це, а в кінці є тест, щоб перевірити, чи можете ви визначити складність виконання різних алгоритмів. Це супер огляд і тест.
-
Про масиви:
- Масиви CS50 Гарвардського університету Arrays CS50 Harvard University
- Масиви (відео) Arrays (video)
- Лінійні та багатовимірні масиви (відео) UC Berkeley CS61B - Linear and Multi-Dim Arrays (video) (Start watching from 15m 32s)
- Динамічні масиви (відео) Dynamic Arrays (video)
- Нерівні масиви (відео) Jagged Arrays (video)
-
Реалізувати вектор (змінний масив з автоматичною зміною розміру):
- Практика кодування з використанням масивів і вказівників, а також математики вказівників для переходу до індексу замість використання індексації.
- Новий масив вихідних даних з виділеною пам'яттю
- можна виділити масив int під капотом, просто не використовувати його можливості
- починати з 16, або якщо початкове число більше, використовувати степінь 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) // приватна функція
- при досягненні ємності, змінює розмір на подвійний
- при видаленні елементу, якщо розмір становить 1/4 від ємності, зменшити розмір до половини
-
Час
- O(1) для додавання/видалення в кінці (амортизується для виділення більшого простору), індексації або оновлення
- O(n) для вставки/видалення в іншому місці
-
Простір
- суміжні у пам'яті, тому близькість допомагає продуктивності
- необхідний простір = (ємність масиву, яка >= n) * розмір елемента, але навіть якщо 2n, все одно O(n)
-
Опис:
- Зв'язані списки CS50 Гарвардський університет Linked Lists CS50 Harvard University - це розвиває інтуїцію.
- Однозв'язні списки (відео) Singly Linked Lists (video)
- CS 61B - Зв'язані списки 1 (відео) CS 61B - Linked Lists 1 (video)
- CS 61B - Зв'язані списки 2 (відео) CS 61B - Linked Lists 2 (video)
- [Огляд] Зв'язані списки за 4 хвилини (відео)
-
C Code (відео) C Code (video) - не все відео, лише фрагменти про Node struct та виділення пам'яті
-
Звʼязані списки vs масиви:
- Основне про зв'язані списки проти масивів (відео) Core Linked Lists Vs Arrays (video)
- У реальному світі зв'язані списки проти масивів (відео) In The Real World Linked Lists Vs Arrays (video)
-
Чому слід уникати зв'язаних списків (відео) Why you should avoid linked lists (video)
-
Пастка: вам потрібні знання про вказівник на вказівник: (на випадок, якщо ви передаєте вказівник у функцію, яка може змінити адресу, на яку вказує цей вказівник) Я не рекомендую цей стиль обходу списків. Читабельність і обслуговуваємість страждають через складність.
-
Реалізувати (я зробив з хвостовим вказівником та без):
- size() - повертає кількість елементів даних у списку
- empty() - bool повертає true, якщо пусто
- value_at(index) - повертає значення n-го елемента (починаючи з 0 для першого)
- push_front(value) - додає елемент на початок списку
- pop_front() - видаляє перший елемент і повертає його значення
- push_back(value) - додає елемент в кінець списку
- pop_back() - видаляє кінцевий елемент і повертає його значення
- front() - отримати значення переднього елементу
- back() - отримати значення кінцевого елементу
- insert(index, value) - вставити значення за індексом так, щоб на поточний елемент за цим індексом вказував новий елемент за індексом
- erase(index) - видаляє вузол за заданим індексом
- value_n_from_end(n) - повертає значення вузла на n-ій позиції від кінця списку
- reverse() - реверсує список
- remove_value(value) - видаляє перший елемент списку з цим значенням
-
Подвійно зв'язаний список
- Опис (відео) Description (video)
- Не потрібно реалізовувати
-
- Стеки (відео) Stacks (video)
- [Огляд] Стеки за 3 хвилини (відео) [Review] Stacks in 3 minutes (video)
- Не буде реалізовано. Реалізація з масивом тривіальна.
-
- Черга (відео) Queue (video)
- Циклічний буфер/FIFO Circular buffer/FIFO
- [Огляд] Черги за 3 хвилини (відео) [Review] Queues in 3 minutes (video)
- Реалізувати за допомогою звʼязаного списка, з хвостовим вказівником:
- enqueue(value) - додає значення до позиції у хвості
- dequeue() - повертає значення і видаляє останній доданий елемент (передній)
- empty()
- Реалізація з використанням масиву фіксованого розміру:
- enqueue(value) - додає елемент в кінець доступного сховища
- dequeue() - повертає значення і видаляє останній доданий елемент
- empty()
- full()
- Вартість:
- погана реалізація з використанням зв'язаного списку, де ви створюєте чергу в голові та чергу в хвості, буде O(n) тому що вам потрібен передостанній елемент, що призводить до повного обходу кожної черги
- enqueue: O(1) (амортизований, зв'язаний список і масив [зондування])
- dequeue: O(1) (зв'язаний список та масив)
- empty: O(1) (зв'язаний список та масив)
-
-
Videos:
- Хешування з Привʼязуванням (відео) Hashing with Chaining (video)
- Подвоєння таблиці, Карп-Рабин (відео) Table Doubling, Karp-Rabin (video)
- Відкрита адресація, криптографічне хешування (відео) Open Addressing, Cryptographic Hashing (video)
- PyCon 2010: Могутній словник (відео) PyCon 2010: The Mighty Dictionary (video)
- (Просунута) рандомізація: Універсальне та досконале хешування (відео) (Advanced) Randomization: Universal & Perfect Hashing (video)
- (Просунутий) Ідеальне хешування (відео) (Advanced) Perfect hashing (video)
- [Огляд] Хеш-таблиці за 4 хвилини (відео) [Review] Hash tables in 4 minutes (video)
-
Онлайн-курси:
- Основні хеш-таблиці (відео) Core Hash Tables (video)
- Структури даних (відео) Data Structures (video)
- Проблема телефонної книги (відео) Phone Book Problem (video)
- розподілені хеш-таблиці:
- Миттєві завантаження та оптимізація сховища в Dropbox (відео) Instant Uploads And Storage Optimization In Dropbox (video)
- Розподілені хеш-таблиці (відео) Distributed Hash Tables (video)
-
реалізувати з масивом за допомогою лінійного зондування
- hash(k, m) - m - розмір хеш-таблиці
- add(key, value) - якщо ключ вже існує, оновити значення
- exists(key)
- get(key)
- remove(key)
-
-
- Двійковий пошук (відео) Binary Search (video)
- Двійковий пошук (відео) Binary Search (video)
- деталі detail
- [Огляд] Бінарний пошук за 4 хвилини (відео) [Review] Binary search in 4 minutes (video)
- Реалізувати:
- бінарний пошук (у відсортованому масиві цілих чисел)
- бінарний пошук з використанням рекурсії
-
- Шпаргалка з бітів Bits cheat sheet - ви повинні знати багато степенів 2 від (2^1 to 2^16 and 2^32)
- Отримати дійсно хороше розуміння маніпуляцій з бітами за допомогою: &, |, ^, ~, >>, <<
- 2s and 1s complement
- Двійковий код: плюси та мінуси (чому ми використовуємо доповнення до двох) (відео) Binary: Plusses & Minuses (Why We Use Two's Complement) (video)
- Перше доповнення 1s Complement
- Друге доповнення 2s Complement
- підрахунок встановлених бітів
- 4 способи підрахунку бітів у байті (відео) 4 ways to count bits in a byte (video)
- Підрахунок бітів Count Bits
- Як порахувати кількість встановлених бітів у 32-бітному цілому числі How To Count The Number Of Set Bits In a 32 Bit Integer
- round to next power of 2:
- округлити до наступного степеня 2 Round Up To Next Power Of Two
- обмін значеннями:
- Обмін Swap
- абсолютні значення:
- Абсолютне ціле число Absolute Integer
-
- Введення до Дерев (відео) Intro to Trees (video)
- Обхід дерев (відео) Tree Traversal (video)
- BFS (пошук в ширину) та DFS (пошук в глибину) (відео) BFS(breadth-first search) and DFS(depth-first search) (video)
- Нотатки про BFS:
- порядок рівнів (BFS, з використанням черги)
- часова складність: O(n)
- просторова складність: найкраща: O(1), найгірша: O(n/2)=O(n)
- Нотатки про DFS:
- часова складність: O(n)
- просторова складність: найкраща: O(log n) - середня висота дерева найгірша: O(n)
- inorder (DFS: left, self, right)
- postorder (DFS: left, right, self)
- preorder (DFS: self, left, right)
- Нотатки про BFS:
- [Огляд] Пошук в ширину за 4 хвилини (відео) [Review] Breadth-first search in 4 minutes (video)
- [Огляд] Пошук в глибину за 4 хвилини (відео) [Review] Depth-first search in 4 minutes (video)
- [Огляд] Обхід дерева (плейлист) за 11 хвилин (відео) [Review] Tree Traversal (playlist) in 11 minutes (video)
-
- Огляд бінарних дерев пошуку (відео) Binary Search Tree Review (video)
- Вступ (відео) Introduction (video)
- MIT (відео) MIT (video)
- C/C++:
- Бінарне дерево пошуку - реалізація у C/C++ (відео) Binary search tree - Implementation in C/C++ (video)
- Реалізація BST - розподіл пам'яті у стеку та купі (відео) BST implementation - memory allocation in stack and heap (video)
- Знаходження мінімального та максимального елементів у бінарному дереві пошуку (відео) Find min and max element in a binary search tree (video)
- Знаходження висоти бінарного дерева (відео) Find the height of a binary tree (video)
- Обхід бінарного дерева - стратегії в ширину та в глибину (відео) Binary tree traversal - breadth-first and depth-first strategies (video)
- Бінарне дерево: обхід за рівнем порядку (відео) Binary tree: Level Order Traversal (video)
- Обхід бінарного дерева: попередній порядок, наступний порядок, пост-порядок (відео) Binary tree traversal: Preorder, Inorder, Postorder (video)
- Перевірка, чи є бінарне дерево бінарним деревом пошуку (відео) Check if a binary tree is a binary search tree or not (video)
- Видалення вузла з бінарного дерева пошуку (відео) Delete a node from Binary Search Tree (video)
- Наступник в порядку обходу в дереві пошуку Inorder Successor in a binary search tree (video)
- Реалізувати:
- insert // вставка значення у дерево
- get_node_count // отримання кількості збережених значень
- print_values // виведення на екран значень в дереві, від min до max
- delete_tree
- is_in_tree // повертає true, якщо задане значення існує в дереві
- get_height // повертає висоту у вузлах (висота одного вузла дорівнює 1)
- get_min // повертає мінімальне значення, що зберігається в дереві
- get_max // повертає максимальне значення, що зберігається в дереві
- is_binary_search_tree
- delete_value
- get_successor // повертає наступника за величиною значення у дереві після заданого, -1 якщо такого немає
-
- візуалізується у вигляді дерева, але зазвичай є лінійною у сховищі (масив, зв'язаний список)
- Купа Heap
- Вступ (відео) Introduction (video)
- Бінарні дерева (відео) Binary Trees (video)
- Зауваження щодо висоти дерева (відео) Tree Height Remark (video)
- Основні операції (відео) Basic Operations (video)
- Повні бінарні дерева (відео) Complete Binary Trees (video)
- Псевдокод (відео) Pseudocode (video)
- Сортування купою - переходи до початку (відео) Heap Sort - jumps to start (video)
- Сортування купою (відео) Heap Sort (video)
- Створення купи (відео) Building a heap (video)
- MIT: Купи та сортування купою (відео) MIT: Heaps and Heap Sort (video)
- CS 61B Лекція 24: Черги пріоритетів (відео) CS 61B Lecture 24: Priority Queues (video)
- Linear Time BuildHeap (max-heap)
- [Огляд] Купа (плейлист) за 13 хвилин (відео) [Review] Heap (playlist) in 13 minutes (video)
- Реалізувати максимальну купу:
- insert
- sift_up - необхідно для insert
- get_max - повертає максимальний елемент, не видаляючи його
- get_size() - повертає кількість елементів
- is_empty() - повертає true, якщо в купі немає елементів
- extract_max - повертає максимальний елемент, видаляючи його
- sift_down - необхідний для extract_max
- remove(x) - видаляє елемент за індексом x
- heapify - створює купу з масиву елементів, необхідно для heap_sort
- heap_sort() - бере невідсортований масив і перетворює його на відсортований на місці, використовуючи max heap або min heap
-
Примітки:
- Реалізуйте сортування і знайте найкращий/найгірший випадок, середню складність кожного з них:
- ніяких бульбашкових сортувань - це жахливо - O(n^2), за винятком випадків, коли n <= 16
- Стабільність алгоритмів сортування ("Чи є Quicksort стабільним?")
- Стабільність алгоритмів сортування Sorting Algorithm Stability
- Стабільність в алгоритмах сортування (StackOverflow) Stability In Sorting Algorithms
- Стабільність в алгоритмах сортування (GeeksForGeeks) Stability In Sorting Algorithms
- Алгоритми сортування - стабільність Sorting Algorithms - Stability
- Які алгоритми можна використовувати на зв'язаних списках? Які на масивах? Які на обох?
- Я б не рекомендував сортувати зв'язаний список, але сортування злиттям цілком можливо.
- Сортування злиттям для зв'язаного списку Merge Sort For Linked List
- Реалізуйте сортування і знайте найкращий/найгірший випадок, середню складність кожного з них:
-
Про сортування купою (heapsort) дивіться структуру даних Heap вище. Сортування купою - це чудово, але не стабільно
-
Седжвік - Сортування злиттям (5 відео) Sedgewick - Mergesort (5 videos)
- Сортування злиттям 1. Mergesort
- 2. Висхідний Mergesort 2. Bottom-up Mergesort
- 3. Складність сортування 3. Sorting Complexity
- 4. Компаратори 4. Comparators
- 5. Стабільність 5. Stability
-
Седжвік - Сортування злиттям (5 відео) Sedgewick - Quicksort (4 videos)
- Швидке сортування 1. Quicksort
- Вибір 2. Selection
- Повторні ключі 3. Duplicate Keys
- Системні сортування 4. System Sorts
-
Університет Каліфорнії (Берклі) (UC Berkeley):
- CS 61B Лекція 29: Сортування I (відео) CS 61B Lecture 29: Sorting I (video)
- CS 61B Лекція 30: Сортування II (відео) CS 61B Lecture 30: Sorting II (video)
- CS 61B Лекція 32: Сортування III (відео) CS 61B Lecture 32: Sorting III (video)
- CS 61B Лекція 33: Сортування V (відео) CS 61B Lecture 33: Sorting V (video)
- CS 61B 2014-04-21: Сортування за розрядами (відео) CS 61B 2014-04-21: Radix Sort(video)
-
Бульбашкове сортування (відео) Bubble Sort (video)
-
Аналіз бульбашкового сортування (відео) Analyzing Bubble Sort (video)
-
Сортування вставками, злиттям (відео) Insertion Sort, Merge Sort (video)
-
Сортування вставками (відео) Insertion Sort (video)
-
Сортування злиттям (відео) Merge Sort (video)
-
Швидке сортування (відео) Quicksort (video)
-
Сортування вибором (відео) Selection Sort (video)
-
Код сортування злиттям:
- Використання вихідного масиву (C) Using output array (C)
- Використання вихідного масиву (Python) Using output array (Python)
- На місці (C++) In-place (C++)
-
Код швидкого сортування:
- Реалізація (C) Implementation (C)
- Реалізація (C) Implementation (C)
- Реалізація (Python) Implementation (Python)
-
[Огляд] Сортування (плейлист) за 18 хвилин [Review] Sorting (playlist) in 18 minutes
- Швидке сортування за 4 хвилини (відео) Quick sort in 4 minutes (video)
- Сортування купою за 4 хвилини (відео) Heap sort in 4 minutes (video)
- Сортування злиттям за 3 хвилини (відео) Merge sort in 3 minutes (video)
- Сортування бульбашками за 2 хвилини (відео) Bubble sort in 2 minutes (video)
- Сортування вибором за 3 хвилини (відео) Selection sort in 3 minutes (video)
- Сортування вставками за 2 хвилини (відео) Insertion sort in 2 minutes (video)
-
Реалізувати:
- Сортування злиттям: O(n log n) середній та найгірший випадок
- Швидке сортування O(n log n) середній випадок
- Сортування вибором та сортування вставкою мають середній та найгірший випадок O(n^2)
- Про сортування купою даних дивіться вище у розділі Структури даних - Купа
-
Не обов'язково, але я рекомендую їх:
- Седжвік - Радікс-сортування (6 відео) Sedgewick - Radix Sorts (6 videos)
- 1. Рядки в Java 1. Strings in Java
- 2. Індексований підрахунок ключів 2. Key Indexed Counting
- 3. Сортування за розрядами за найменш значущою цифрою першого рядка 3. Least Significant Digit First String Radix Sort
- 3. Сортування за розрядами за найбільш значущою цифрою першого рядка 4. Most Significant Digit First String Radix Sort
- 5. 3-бічне cортування за розрядами 5. 3 Way Radix Quicksort
- 6. Масиви суфіксів 6. Suffix Arrays
- Сортування за розрядами Radix Sort
- Сортування за розрядами (відео) Radix Sort (video)
- Сортування за розрядами, лічильне сортування (лінійні обмеження за часом) (відео) Radix Sort, Counting Sort (linear time given constraints) (video)
- Рандомізація: матричне множення, швидке сортування, алгоритм Фрейвальдса (відео) Randomization: Matrix Multiply, Quicksort, Freivalds' algorithm (video)
- Сортування за лінійний час (відео) Sorting in Linear Time (video)
- Седжвік - Радікс-сортування (6 відео) Sedgewick - Radix Sorts (6 videos)
Як підсумок, ось візуальне представлення 15 алгоритмів сортування. Якщо вам потрібна більш детальна інформація на цю тему, зверніться до розділу "Сортування" у Додаткова інформація про деякі теми
Графи можна використовувати для представлення багатьох проблем у комп'ютерних науках, тому цей розділ довгий, як і розділ про дерева та сортування.
-
Примітки:
- Існує 4 основних способи представлення графів у пам'яті:
- об'єкти та вказівники (objects and pointers)
- матриця суміжності (adjacency matrix)
- список суміжності (adjacency list)
- карта суміжності (adjacency map)
- Ознайомтеся з кожним способом представлення та його перевагами і недоліками
- BFS та DFS - знайте їх обчислювальну складність, компроміси та як їх реалізувати в реальному коді
- Коли вам ставлять запитання, спочатку шукайте рішення на основі графів, а потім рухайтеся далі, якщо його немає
- Існує 4 основних способи представлення графів у пам'яті:
-
MIT (відео):
- Пошук в ширину Breadth-First Search
- Пошук в глибину Depth-First Search
-
Лекції Скієна - чудовий вступ:
- CSE373 2020 - Лекція 10 - Графові структури даних (відео) CSE373 2020 - Lecture 10 - Graph Data Structures (video)
- CSE373 2020 - Лекція 11 - Обхід графів (відео) CSE373 2020 - Lecture 11 - Graph Traversal (video)
- CSE373 2020 - Лекція 12 - Пошук у глибину (відео) CSE373 2020 - Lecture 12 - Depth First Search (video)
- CSE373 2020 - Лекція 13 - Мінімальні остовні дерева (відео) CSE373 2020 - Lecture 13 - Minimum Spanning Trees (video)
- CSE373 2020 - Лекція 14 - Мінімальні остовні дерева (відео) CSE373 2020 - Lecture 14 - Minimum Spanning Trees (con't) (video)
- CSE373 2020 - Лекція 15 - Графові алгоритми (частина 2) (відео) CSE373 2020 - Lecture 15 - Graph Algorithms (con't 2) (video)
-
Графи (огляд та інше):
- 6.006 Задача про найкоротші шляхи з одним джерелом (відео) 6.006 Single-Source Shortest Paths Problem (video)
- 6.006 Дейкстра (відео) 6.006 Dijkstra (video)
- [ ]6.006 Беллман-Форд (відео) 6.006 Bellman-Ford (video)
- 6.006 Прискорення Дейкстра (відео) 6.006 Speeding Up Dijkstra (video)
- Адуні: Графові алгоритми I - Топологічне сортування, Мінімальне остовне дерево, Алгоритм Прима - лекція 6 (відео) Aduni: Graph Algorithms I - Topological Sorting, Minimum Spanning Trees, Prim's Algorithm - Lecture 6 (video)
- Адуні: Графові алгоритми II - DFS, BFS, алгоритм Крускала, Структура даних Об'єднаний Пошук - Лекція 7 (відео) Aduni: Graph Algorithms II - DFS, BFS, Kruskal's Algorithm, Union Find Data Structure - Lecture 7 (video)
- Адуні: Графові алгоритми III: Найкоротший шлях - Лекція 8 (відео) Aduni: Graph Algorithms III: Shortest Path - Lecture 8 (video)
- Адуні: Графові алгоритми IV: Вступ до геометричних алгоритмів - Лекція 9 (відео) Aduni: Graph Alg. IV: Intro to geometric algorithms - Lecture 9 (video)
- CS 61B 2014: Зважені графи (відео) CS 61B 2014: Weighted graphs (video)
- Жадібні алгоритми: мінімальне остовне дерево (відео) Greedy Algorithms: Minimum Spanning Tree (video)
- Сильно зв'язані компоненти алгоритму Косараджу: алгоритм графів (відео) Strongly Connected Components Kosaraju's Algorithm Graph Algorithm (video)
- [Огляд] Алгоритми найкоротшого шляху (плейлист) за 16 хвилин (відео) [Review] Shortest Path Algorithms (playlist) in 16 minutes (video)
- [Огляд] Мінімальні остовні дерева (плейліст) за 4 хвилини (відео) [Review] Minimum Spanning Trees (playlist) in 4 minutes (video)
-
Повний курс на Coursera:
- Алгоритми на графах (відео) Algorithms on Graphs (video)
-
Я реалізую:
- DFS зі списком суміжності (рекурсивний)
- DFS зі списком суміжності (ітеративний зі стеком)
- DFS з матрицею суміжності (рекурсивний)
- DFS з матрицею суміжності (ітеративний зі стеком)
- BFS зі списком суміжності
- BFS з матрицею суміжності
- найкоротший шлях з одним джерелом (Дейкстра)
- мінімальне остовне дерево
- Алгоритми на основі DFS (див. відео Aduni вище):
- перевірка на цикл (потрібна для топологічного сортування, оскільки ми будемо перевіряти цикл перед початком)
- топологічне сортування
- підрахунок зв'язних компонентів у графі
- перелік списку сильно зв'язаних компонентів
- перевірка на дводольний граф
-
- Стенфордські лекції про рекурсію та відстеження:
- Лекція 8 | Програмування абстракцій (відео) Lecture 8 | Programming Abstractions (video)
- Лекція 9 | Програмні абстракції (відео) Lecture 9 | Programming Abstractions (video)
- Лекція 10 | Програмування абстракцій (відео) Lecture 10 | Programming Abstractions (video)
- Лекція 11 | Програмування абстракцій (відео) Lecture 11 | Programming Abstractions (video)
- Коли доцільно її використовувати?
- Чим хвостова рекурсія краща ніж ніякої?
- Що таке хвостова рекурсія і чому вона така погана? What Is Tail Recursion Why Is It So Bad?
- Хвостова рекурсія (відео) Tail Recursion (video)
- 5 простих кроків для вирішення будь-якої рекурсивної задачі (відео) 5 Simple Steps for Solving Any Recursive Problem(video)
Схема зворотного відстеження:
- Стенфордські лекції про рекурсію та відстеження:
-
- Ви, ймовірно, не побачите жодної проблеми з динамічним програмуванням на співбесіді, але варто вміти розпізнавати задачу, яка може бути кандидатом на динамічне програмування.
- Ця тема може бути досить складною, оскільки кожна задача, що розв'язується ДП, повинна бути визначена як рекурсивне відношення, а придумати його може бути непросто.
- Я пропоную розглянути багато прикладів задач на ДП, доки ви не матимете чіткого уявлення про закономірності, що використовуються.
- Відео:
- Скієна: CSE373 2020 - Лекція 19 - Вступ до динамічного програмування (відео) Skiena: CSE373 2020 - Lecture 19 - Introduction to Dynamic Programming (video)
- Скієна: CSE373 2020 - Лекція 20 - Редагування відстані (відео) Skiena: CSE373 2020 - Lecture 20 - Edit Distance (video)
- Скієна: CSE373 2020 - Лекція 20 - Редагування відстані (продовження) (відео) Skiena: CSE373 2020 - Lecture 20 - Edit Distance (continued) (video)
- Скієна: CSE373 2020 - Лекція 21 - Динамічне програмування (відео) Skiena: CSE373 2020 - Lecture 21 - Dynamic Programming (video)
- Скієна: CSE373 2020 - Лекція 22 - Динамічне програмування та огляд (відео) Skiena: CSE373 2020 - Lecture 22 - Dynamic Programming and Review (video)
- Саймонсон: Динамічне програмування 0 (починається з 59:18) (відео) Simonson: Dynamic Programming 0 (starts at 59:18) (video)
- Саймонсон: Динамічне програмування I - Лекція 11 (відео) Simonson: Dynamic Programming I - Lecture 11 (video)
- Саймонсон: Динамічне програмування II - Лекція 12 (відео) Simonson: Dynamic programming II - Lecture 12 (video)
- Список окремих задач з ДП (кожна з них коротка): Динамічне програмування (відео) Dynamic Programming (video)
- Єльський конспект лекцій:
- Динамічне програмування Dynamic Programming
- Coursera:
- Проблема вторинної структури РНК (відео) The RNA secondary structure problem (video)
- Алгоритм динамічного програмування (відео) A dynamic programming algorithm (video)
- Ілюстрація алгоритму ДП (відео) Illustrating the DP algorithm (video)
- Час роботи алгоритму DP (відео) Running time of the DP algorithm (video)
- DP проти рекурсивної реалізації (відео) DP vs. recursive implementation (video)
- Глобальне попарне вирівнювання послідовностей (відео) Global pairwise sequence alignment (video)
- Локальне попарне вирівнювання послідовностей (відео) Local pairwise sequence alignment (video)
-
- Короткий огляд UML (відео)
- Вивчіть ці патерни:
- синглтон (strategy)
- синглтон (singleton)
- адаптер (adapter)
- прототип (prototype)
- декоратор (decorator)
- відвідувач (visitor)
- фабрика, абстрактна фабрика (factory, abstract factory)
- фасад (facade)
- спостерігач (observer)
- проксі (proxy)
- делегат (delegate)
- команда (command)
- стан (state)
- memento
- ітератор (iterator)
- композит (composite)
- flyweight
- Розділ 6 (частина 1) - Патерни (відео) Chapter 6 (Part 1) - Patterns (video)
- Розділ 6 (частина 2) - Абстракція-випадок, Загальна Ієрархія, Гравець-Роль, Синглтон, Спостерігач, Делегування (відео) Chapter 6 (Part 2) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (video)
- Розділ 6 (частина 3) - Адаптер, Фасад, Незмінний, Інтерфейс тільки для читання, Проксі (відео) Chapter 6 (Part 3) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (video)
- Серія відео (27 відео) Series of videos (27 videos)
- Шаблони проектування з нуля Head First Design Patterns
- Я знаю, що канонічною книгою є "Патерни проектування: Elements of Reusable Object-Oriented Software", але Head First чудово підходить для початківців в ООП.
- Зручне посилання: 101 патерн проектування та поради для розробників
- Патерни проектування для людей
-
- Математичні навички: Як знайти факторіал, перестановку та комбінацію (на вибір) (відео) Math Skills: How to find Factorial, Permutation and Combination (Choose) (video)
- Make School: Ймовірність (відео) Make School: Probability (video)
- Make School: більше про ймовірності та ланцюжки Маркова Make School: More Probability and Markov Chains (video)
- Академія Хана (Khan Academy):
- Структура курсу:
- Основи теоретичної ймовірності Basic Theoretical Probability
- Всього відео - 41 (кожне просте і кожне коротке):
- Пояснення теорії ймовірностей (відео) Probability Explained (video)
- Структура курсу:
-
- Знати про найвідоміші класи NP-повних задач, такі як задача комівояжера та задача про рюкзак, та вміти розпізнавати їх, коли інтерв'юер задає їх у завуальованій формі.
- Знати, що означає NP-повні задачі.
- Обчислювальна складність (відео) Computational Complexity (video)
- Саймонсон:
- Жадібні алгоритми II та вступ до NP-повноти (відео) Greedy Algs. II & Intro to NP Completeness (video)
- NP-повнота II та скорочення (відео) NP Completeness II & Reductions (video)
- NP-повнота III (відео) NP Completeness III (Video)
- NP-повнота IV (відео) NP Completeness IV (video)
- Скієна:
- CSE373 2012 - Лекція 23 - Вступ до NP-повноти (відео) CSE373 2012 - Lecture 23 - Introduction to NP-Completeness (video)
- CSE373 2012 - Лекція 24 - Доведення NP-повноти (відео) CSE373 2012 - Lecture 24 - NP-Completeness Proofs (video)
- CSE373 2012 - Лекція 25 - Виклик NP-повноти (відео) CSE373 2012 - Lecture 25 - NP-Completeness Challenge (video)
- Складність: P, NP, NP-повнота, редукції (відео) Complexity: P, NP, NP-completeness, Reductions (video)
- Складність: Апроксимаційні алгоритми (відео) Complexity: Approximation Algorithms (video)
- Складність: алгоритми з фіксованими параметрами (відео) Complexity: Fixed-Parameter Algorithms (video)
- Пітер Норвіг обговорює близькі до оптимальних розв'язки задачі комівояжера:
- Сторінки 1048 - 1140 у CLRS, якщо у вас є.
-
- Як процесор виконує програму (відео) How CPU executes a program (video)
- Як комп'ютери обчислюють - ALU (відео) How computers calculate - ALU (video)
- Регістри та оперативна пам'ять (відео) Registers and RAM (video)
- Центральний процесор (CPU) (відео) The Central Processing Unit (CPU) (video)
- Інструкції та програми (відео) Instructions and Programs (video)
-
- Кеш-пам'ять останнього використання (LRU cache):
- Магія кешу LRU (100 днів Google Dev) (відео) The Magic of LRU Cache (100 Days of Google Dev) (video)
- Впровадження LRU (відео) Implementing LRU (video)
- LeetCode - 146 LRU кеш (C++) (відео) LeetCode - 146 LRU Cache (C++) (video)
- Кеш-пам'ять процесора (CPU cache):
- MIT 6.004 L15: Ієрархія пам'яті (відео) MIT 6.004 L15: The Memory Hierarchy (video)
- MIT 6.004 L16: Проблеми з кешем (відео) MIT 6.004 L16: Cache Issues (video)
- Кеш-пам'ять останнього використання (LRU cache):
-
- Computer Science 162 - Операційні системи (25 відео):
- про процеси та потоки див. відео 1-11
- Операційні системи та системне програмування (відео) Operating Systems and System Programming (video)
- Яка різниця між процесом і потоком? What Is The Difference Between A Process And A Thread?
- Охоплює:
- Процеси, потоки, проблеми паралелізму
- різниця між процесами та потоками (processes and threads)
- процеси (processes)
- потоки (threads)
- замки (locks)
- м'ютекси (mutexes)
- семафори (semaphores)
- монітори (monitors)
- як вони працюють (how they work)
- глухий кут (deadlock)
- живий кут (livelock)
- Активність процесора, переривання, перемикання контексту
- Сучасні конструкції паралелізму з багатоядерними процесорами
- Пагінація, сегментація та віртуальна пам'ять (відео) Paging, segmentation and virtual memory (video)
- Переривання (відео) Interrupts (video)
- Планування (відео) Scheduling (video)
- Потреби процесу в ресурсах (пам'ять: код, статична пам'ять, стек, купа, а також дескриптори файлів, ввід/вивід)
- Потреби потоку в ресурсах (ділить вищеперелічене (крім стеку) з іншими потоками у тому ж самому процесі, але у кожного є свій PC, лічильник стеку, регістри та стек)
- Розгалуження - це фактично копіювання на запис (тільки для читання), поки новий процес не запише в пам'ять, після чого він робить повну копію.
- Перемикання контексту
- Як перемикання контексту ініціюється операційною системою та базовим обладнанням
- Процеси, потоки, проблеми паралелізму
- потоки в C++ (серія - 10 відео) threads in C++ (series - 10 videos)
- паралелізм у Python (відео):
- Короткий плейліст про потоки Short series on threads
- Потоки Python Python Threads
- Розуміння Python GIL (2010) Understanding the Python GIL (2010)
- David Beazley - Паралелізм на Python з нуля: LIVE! - PyCon 2015 David Beazley - Python Concurrency From the Ground Up: LIVE! - PyCon 2015
- Доповідь Девіда Бізлі - Теми, що нас цікавлять (Python Asyncio) Keynote David Beazley - Topics of Interest (Python Asyncio)
- Mutex у Python Mutex in Python
- Computer Science 162 - Операційні системи (25 відео):
-
- Охопити:
- як працює модульне тестування
- що таке макетні об'єкти
- що таке інтеграційне тестування
- що таке впровадження залежностей
- Гнучке тестування програмного забезпечення з Джеймсом Бахом (відео) Agile Software Testing with James Bach (video)
- Відкрита лекція Джеймса Баха про тестування програмного забезпечення (відео) Open Lecture by James Bach on Software Testing (video)
- Стів Фрімєн - Розробка, керована тестами (це не те, що ми мали на увазі) (відео) Steve Freeman - Test-Driven Development (that’s not what we meant) (video)
- слайди slides
- Впровадження залежностей:
- відео video
- Дао Тестування Tao Of Testing
- Як писати тести How to write tests
- Охопити:
-
- Седжвік - Масиви суфіксів (відео) Sedgewick - Suffix Arrays (video)
- Седжвік - Пошук у підрядках (відео) Sedgewick - Substring Search (videos)
- 1. Вступ до пошуку підрядків 1. Introduction to Substring Search
- 2. Пошук у підрядках методом грубої сили 2. Brute-Force Substring Search
- 3. Кнут-Морріс Пратт 3. Knuth-Morris Pratt
- 4. Бойєра-Мура 4. Boyer-Moore
- 5. Рабін-Карп 5. Rabin-Karp
- Шаблон пошуку в тексті (відео) Search pattern in text (video)
Якщо вам потрібна додаткова інформація з цієї теми, зверніться до розділу "Співставлення рядків" у Додаткова інформація з деяких тем.
-
- Зверніть увагу, що існують різні типи спроб. Деякі з них мають префікси, деякі ні, а деякі використовують рядок замість бітів для відстеження шляху.
- Переглядаю код, але не буду реалізовувати.
- Седжвік - Префіксні дерева (3 відео) Sedgewick - Tries (3 videos)
- 1. Префіксні дерева R Way 1. R Way Tries
- 2. Префіксні дерева тернарного пошуку 2. Ternary Search Tries
- 3. Символьні операції 3. Character Based Operations
- Примітки про структури даних та методи програмування Notes on Data Structures and Programming Techniques
- Відео короткого курсу:
- Вступ до префіксних дерев (відео) Introduction To Tries (video)
- Ефективність префіксних дерев (відео) Performance Of Tries (video)
- Реалізація префіксного дерева (відео) Implementing A Trie (video)
- Префіксне дерево: занедбана структура даних The Trie: A Neglected Data Structure
- TopCoder - Використання префіксних дерев TopCoder - Using Tries
- Стенфордська лекція (реальний приклад використання) (відео) Stanford Lecture (real world use case) (video)
- MIT, Просунуті структури даних, Рядки (може стати досить незрозумілим приблизно на півдорозі) MIT, Advanced Data Structures, Strings (can get pretty obscure about halfway through)
-
- просте 8-бітне: Представлення чисел з рухомою комою - 1 (відео - є помилка в обчисленнях - дивись опис відео) Representation of Floating Point Numbers - 1 (video - there is an error in calculations - see video description)
-
- Абсолютний мінімум, який кожен розробник програмного забезпечення обов'язково повинен знати про юнікод та набори символів The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets
- Що обов'язково потрібно знати кожному програмісту про кодування та набори символів для роботи з текстом What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text
-
- Старший та молодший порядок байтів Big And Little Endian
- Старший порядок байтів vs Молодший порядок байтів Big Endian Vs Little Endian (video)
- Старший та молодший порядок байтів у подробицях (відео) Big And Little Endian Inside/Out (video)
- Дуже технічна розмова для розробників ядра. Не хвилюйтеся, якщо більшість з них вам не під силу.
- Першої половини достатньо.
-
- Якщо у вас є досвід роботи з мережами або ви хочете стати інженером з надійності або інженером з експлуатації, чекайте на запитання
- В іншому випадку, це просто корисно знати
- Академія Хана Khan Academy
- UDP і TCP: порівняння транспортних протоколів (відео) UDP and TCP: Comparison of Transport Protocols (video)
- Пояснення TCP/IP та моделі OSI (відео) TCP/IP and the OSI Model Explained! (video)
- Передача пакетів через Інтернет. Підручник по роботі в мережі та TCP/IP. (відео) Packet Transmission across the Internet. Networking & TCP/IP tutorial. (video)
- HTTP (відео) HTTP (video)
- SSL та HTTPS (відео) SSL and HTTPS (video)
- SSL/TLS (відео) SSL/TLS (video)
- HTTP 2.0 (відео) HTTP 2.0 (video)
- Серія відео (21 відео) Video Series (21 videos) (video)
- Демістифікація підмережі - частина 5 Нотація CIDR (відео) Subnetting Demystified - Part 5 CIDR Notation (video)
- Сокети:
- Java - Сокети - вступ (відео) Java - Sockets - Introduction (video)
- Програмування сокетів (відео) Socket Programming (video)
У цьому розділі зібрані короткі відео, які ви можете переглянути досить швидко, щоб повторити більшість важливих понять.
Це дуже зручно, якщо ви часто хочете повторити матеріал.
- Серія 2-3-хвилинних коротких тематичних відеороликів (23 відео)
- Відео Videos
- Серія 2-5-хвилинних тематичних відеороликів - Майкл Самбол (48 відео):
- Відео Videos
- Приклади коду Code Examples
- See Resume prep information in the books: "Cracking The Coding Interview" and "Programming Interviews Exposed"
- "This Is What A GOOD Resume Should Look Like" by Gayle McDowell (author of Cracking the Coding Interview),
- Note by the author: "This is for a US-focused resume. CVs for India and other countries have different expectations, although many of the points will be the same."
- "Step-by-step resume guide" by Tech Interview Handbook
- Detailed guide on how to set up your resume from scratch, write effective resume content, optimize it, and test your resume
- How to Pass the Engineering Interview in 2021
- Demystifying Tech Recruiting
- How to Get a Job at the Big 4:
- Cracking The Coding Interview Set 1:
- Cracking the Facebook Coding Interview:
- Prep Courses:
- Python for Data Structures, Algorithms, and Interviews (paid course):
- A Python-centric interview prep course that covers data structures, algorithms, mock interviews, and much more.
- Intro to Data Structures and Algorithms using Python (Udacity free course):
- A free Python-centric data structures and algorithms course.
- Data Structures and Algorithms Nanodegree! (Udacity paid Nanodegree):
- 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 free course):
- Many times, it’s not your technical competency that holds you back from landing your dream job, it’s how you perform on the behavioral interview.
- AlgoMonster (paid course with free content):
- The crash course for LeetCode. Covers all the patterns condensed from thousands of questions.
- Python for Data Structures, Algorithms, and Interviews (paid course):
Mock Interviews:
- Gainlo.co: Mock interviewers from big companies - I used this and it helped me relax for the phone screen and on-site interview
- Pramp: Mock interviews from/with peers - a peer-to-peer model to practice interviews
- interviewing.io: Practice mock interview with senior engineers - anonymous algorithmic/systems design interviews with senior engineers from FAANG anonymously
- Meetapro: Mock interviews with top FAANG interviewers - an Airbnb-style mock interview/coaching platform.
- Hello Interview: Mock Interviews with Expert Coaches and AI - interview directly with AI or with FAANG staff engineers and managers.
- Codemia: Practice system design problems with AI or community solutions and feedback - Practice system design problems via AI practice tool. Share your solution with the community to get human feedback as well.
Think of about 20 interview questions you'll get, along with the lines of the items below. Have 2-3 answers for each. Have a story, not just data, about something you accomplished.
- Why do you want this job?
- What's a tough problem you've solved?
- Biggest challenges faced?
- Best/worst designs seen?
- Ideas for improving an existing product.
- How do you work best, as an individual and as part of a team?
- Which of your skills or experiences would be assets in the role and why?
- What did you most enjoy at [job x / project y]?
- What was the biggest challenge you faced at [job x / project y]?
- What was the hardest bug you faced at [job x / project y]?
- What did you learn at [job x / project y]?
- What would you have done better at [job x / project y]?
Some of mine (I already may know the answers, but want their opinion or team perspective):
- How large is your team?
- What does your dev cycle look like? Do you do waterfall/sprints/agile?
- Are rushes to deadlines common? Or is there flexibility?
- How are decisions made in your team?
- How many meetings do you have per week?
- Do you feel your work environment helps you concentrate?
- What are you working on?
- What do you like about it?
- What is the work life like?
- How is the work/life balance?
Congratulations!
Keep learning.
You're never really done.
*****************************************************************************************************
*****************************************************************************************************
Everything below this point is optional. It is NOT needed for an entry-level interview.
However, by studying these, you'll get greater exposure to more CS concepts and will be better prepared for
any software engineering job. You'll be a much more well-rounded software engineer.
*****************************************************************************************************
*****************************************************************************************************
These are here so you can dive into a topic you find interesting.
- The Unix Programming Environment
- An oldie but a goodie
- The Linux Command Line: A Complete Introduction
- A modern option
- TCP/IP Illustrated Series
- Head First Design Patterns
- A gentle introduction to design patterns
- Design Patterns: Elements of Reusable Object-Oriented Software
- AKA the "Gang Of Four" book or GOF
- The canonical design patterns book
- Algorithm Design Manual (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, and 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
- Pros:
- 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.
- Class textbook on data structures and algorithms
- Can rent it on Kindle
- Answers:
- Errata
- Algorithm (Jeff Erickson)
- Write Great Code: Volume 1: Understanding the Machine
- 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, 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
- 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
- For a richer, more up-to-date (2017), but longer treatment
- 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
- scalability
- START HERE: System Design from HiredInTech
- How Do I Prepare To Answer Design Questions In A Technical Inverview?
- 8 Things You Need to Know Before a System Design Interview
- Algorithm design
- Database Normalization - 1NF, 2NF, 3NF and 4NF (video)
- 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
- Numbers Everyone Should Know
- How long does it take to make a context switch?
- Transactions Across Datacenters (video)
- A plain English introduction to CAP Theorem
- Paxos Consensus algorithm:
- Consistent Hashing
- NoSQL Patterns
- Scalability:
- Great overview (video)
- Short series:
- Scalable Web Architecture and Distributed Systems
- Fallacies of Distributed Computing Explained
- Pragmatic Programming Techniques
- Jeff Dean - Building Software Systems At Google and Lessons Learned (video)
- Introduction to Architecting Systems for Scale
- Scaling mobile games to a global audience using App Engine and Cloud Datastore (video)
- How Google Does Planet-Scale Engineering for Planet-Scale Infra (video)
- The Importance of Algorithms
- Sharding
- Scale at Facebook (2009)
- Scale at Facebook (2012), "Building for a Billion Users" (video)
- Engineering for the Long Game - Astrid Atkinson Keynote(video)
- 7 Years Of YouTube Scalability Lessons In 30 Minutes
- How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs
- How to Remove Duplicates in Large Datasets
- A look inside Etsy's scale and engineering culture with Jon Cowie (video)
- What Led Amazon to its Own Microservices Architecture
- To Compress Or Not To Compress, That Was Uber's Question
- Asyncio Tarantool Queue, Get In The Queue
- When Should Approximate Query Processing Be Used?
- Google's Transition From Single Datacenter, To Failover, To A Native Multihomed Architecture
- Spanner
- Egnyte Architecture: Lessons Learned In Building And Scaling A Multi Petabyte Distributed System
- Machine Learning Driven Programming: A New Programming For A New World
- The Image Optimization Technology That Serves Millions Of Requests Per Day
- A Patreon Architecture Short
- Tinder: How Does One Of The Largest Recommendation Engines Decide Who You'll See Next?
- Design Of A Modern Cache
- Live Video Streaming At Facebook Scale
- A Beginner's Guide To Scaling To 11 Million+ Users On Amazon's AWS
- How Does The Use Of Docker Effect Latency?
- Does AMP Counter An Existential Threat To Google?
- A 360 Degree View Of The Entire Netflix Stack
- Latency Is Everywhere And It Costs You Sales - How To Crush It
- Serverless (very long, just need the gist)
- What Powers Instagram: Hundreds of Instances, Dozens of Technologies
- Cinchcast Architecture - Producing 1,500 Hours Of Audio Every Day
- Justin.Tv's Live Video Broadcasting Architecture
- Playfish's Social Gaming Architecture - 50 Million Monthly Users And Growing
- TripAdvisor Architecture - 40M Visitors, 200M Dynamic Page Views, 30TB Data
- PlentyOfFish Architecture
- Salesforce Architecture - How They Handle 1.3 Billion Transactions A Day
- ESPN's Architecture At Scale - Operating At 100,000 Duh Nuh Nuhs Per Second
- See "Messaging, Serialization, and Queueing Systems" way below for info on some of the technologies that can glue services together
- Twitter:
- For even more, see "Mining Massive Datasets" video series in the 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: System Design from HiredInTech
- cheat sheet
- flow:
- 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
- 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
- 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
- Understand the problem and scope:
- Exercises:
These topics will likely not come up in an interview, but I added them to help you become a well-rounded software engineer, and to be aware of certain technologies and algorithms, so you'll have a bigger toolbox.
-
- Familiarize yourself with a unix-based code editor
- vi(m):
- emacs:
-
- Khan Academy
- more about Markov processes:
- See more in MIT 6.050J Information and Entropy series below.
-
- Intro
- Parity
- Hamming Code:
- Error Checking
-
- also see videos below
- make sure to watch information theory videos first
- Information Theory, Claude Shannon, Entropy, Redundancy, Data Compression & Bits (video)
-
- also see videos below
- make sure to watch information theory videos first
- Khan Academy Series
- Cryptography: Hash Functions
- Cryptography: Encryption
-
- make sure to watch information theory videos first
- Computerphile (videos):
- Compressor Head videos
- (optional) Google Developers Live: GZIP is not enough!
-
- Given a Bloom filter with m bits and k hashing functions, both insertion and membership testing are O(k)
- Bloom Filters
- Bloom Filters | Mining of Massive Datasets | Stanford University
- Tutorial
- How To Write A Bloom Filter App
-
- used to determine the similarity of documents
- the opposite of MD5 or SHA which are used to determine if 2 documents/strings are exactly the same.
- Simhashing (hopefully) made simple
-
-
Know least one type of balanced binary tree (and know how it's implemented):
-
"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.
-
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)
- AVL Trees (video)
- AVL Tree Implementation (video)
- Split And Merge
- [Review] AVL Trees (playlist) in 19 minutes (video)
-
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)
- MIT Lecture: Splay Trees:
- Gets very mathy, but watch the last 10 minutes for sure.
- Video
-
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)
- Aduni - Algorithms - Lecture 5 (video)
- Black Tree
- An Introduction To Binary Search And Red Black Tree
- [Review] Red-Black Trees (playlist) in 30 minutes (video)
-
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)
- Binary View of 23-Tree
- 2-3 Trees (student recitation) (video)
-
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)
- Bottom Up 234-Trees (video)
- Top Down 234-Trees (video)
-
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
-
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
- Introduction to B-Trees (video)
- B-Tree Definition and Insertion (video)
- B-Tree Deletion (video)
- MIT 6.851 - Memory Hierarchy Models (video) - 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)
- [Review] B-Trees (playlist) in 26 minutes (video)
-
-
- great for finding number of points in a rectangle or higher dimension object
- a good fit for k-nearest neighbors
- Kd Trees (video)
- kNN K-d tree algorithm (video)
-
- "These are somewhat of a cult data structure" - Skiena
- Randomization: Skip Lists (video)
- For animations and a little more detail
-
- Combination of a binary search tree and a heap
- Treap
- Data Structures: Treaps explained (video)
- Applications in set operations
-
- see videos below
-
- Why ML?
- Google's Cloud Machine learning tools (video)
- Google Developers' Machine Learning Recipes (Scikit Learn & Tensorflow) (video)
- Tensorflow (video)
- Tensorflow Tutorials
- Practical Guide to implementing Neural Networks in Python (using Theano)
- Courses:
- Great starter course: Machine Learning - videos only - see videos 12-18 for a review of linear algebra (14 and 15 are duplicates)
- Neural Networks for Machine Learning
- Google's Deep Learning Nanodegree
- Google/Kaggle Machine Learning Engineer Nanodegree
- Self-Driving Car Engineer Nanodegree
- Resources:
--
I added these to reinforce some ideas already presented above, but didn't want to include them
above because it's just too much. It's easy to overdo it on a subject.
You want to get hired in this century, right?
-
Union-Find
-
More Dynamic Programming (videos)
- 6.006: Dynamic Programming I: Fibonacci, Shortest Paths
- 6.006: Dynamic Programming II: Text Justification, Blackjack
- 6.006: DP III: Parenthesization, Edit Distance, Knapsack
- 6.006: DP IV: Guitar Fingering, Tetris, Super Mario Bros.
- 6.046: Dynamic Programming & Advanced DP
- 6.046: Dynamic Programming: All-Pairs Shortest Paths
- 6.046: Dynamic Programming (student recitation)
-
Advanced Graph Processing (videos)
-
MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
-
String Matching
- Rabin-Karp (videos):
- Knuth-Morris-Pratt (KMP):
- Boyer–Moore string search algorithm
- Coursera: Algorithms on Strings
- starts off great, but by the time it gets past KMP it gets more complicated than it needs to be
- nice explanation of tries
- can be skipped
-
Sorting
- Stanford lectures on sorting:
- Shai Simonson, Aduni.org:
- Steven Skiena lectures on sorting:
Sit back and enjoy. "Netflix and skill" :P
-
List of individual Dynamic Programming problems (each is short)
-
Excellent - MIT Calculus Revisited: Single Variable Calculus
-
Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory
-
CSE373 - Analysis of Algorithms (25 videos)
-
UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)
-
Carnegie Mellon - Computer Architecture Lectures (39 videos)
-
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)
-
MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)