Для тех кто хочет действительно хорошо разобраться в алгоритмах придется очень сильно прокачать свои аналитические способности. Именно эти способности нам потом помогают эффективней разбираться вообще в чем угодно, что касается программирования.
Но достаточно ли такого аргумента в защиту изучения этой дисциплины?
В этом видео я рассказал зачем и о чем, с моей точки зрения, она на самом деле. В этом же посте оставил подборку очень доходчивых материалов на эту тему.
00:31 Зачем это изучать?
01:40 Методы разработки алгоритмов
02:08 #1. Метод грубой силы / полный перебор / исчерпывающий поиск (Brute-Force)
03:23 Что делать, когда не получается решить задачу?
03:38 #2. Разделяй и властвуй / метод декомпозиции (Divide and Conquer)
04:26 Уменьшай и властвуй (Decrease and Conquer)
04:53 Примеры задач
05:40 #3. Динамическое программирование (Dynamic Programming)
06:02 Сверху вниз / Мемоизация (Top-down / Memoization)
06:53 Снизу вверх / Табуляция (Bottom-up / Tabulation)
07:07 Примеры задач
07:34 #4. Жадный алгоритм (Greedy Algorithm)
09:01 Примеры задач
09:33 #5. Поиск с возвратом (Backtracking)
10:09 Метод ветвей и границ (Branch and Bound)
11:43 Примеры задач
11:56 #6. Локальный поиск (Local Search)
12:47 Суть
13:10 Примеры задач
13:34 #7. Преобразуй и властвуй / метод преобразования (Transform and Conquer)
14:01 Примеры задач
14:42 Анализ алгоритмов и другое
15:13 Так всё-таки зачем?
17:50 Итоги
Задействованные видео:
- Введение в системное мышление
- K-Means Clustering - The Math of Intelligence (Week 3)
- 017. Малый ШАД - Алгоритмы для NP трудных задач - Александр Куликов
- MERGE SORT ALGORITHM | Sorting Algorithm | DSA | GeeksforGeeks
- Lecture 19: Dynamic Programming I: Fibonacci, Shortest Paths
- Dynamic Programming
- What is backpropagation really doing? | Chapter 3, Deep learning
- Как устроен формат mp3?
- Gradient descent, how neural networks learn | Chapter 2, Deep learning
- Fog in the Forest - Al Sabo Land Preserve Virtual Run
Музыка (распространяется на условиях лицензии CC BY 4.0):
- Chris Zabriskie — CGI Snake
- Chris Zabriskie — Wonder Cycle
Как и другим коллегам, возможно мне не удалось убедить в полезности изучения этой дисциплины. Возможно лично ты знаешь успешных программистов, которые не изучали алгоритмы глубоко, если вообще изучали.
Таких программистов на самом деле очень много. Но сложность задач, которые они решают, со временем уменьшается, благодаря прогрессу технологий, из-за чего и спрос на решение таких задач тоже падает.
Дальновидность
Стоит подумать о жизнеспособности нашей позиции на рынке. Если мы забили на обновление своих знаний — есть шанс, что мы в конечном счете станем невостребованными специалистами. Это необязательно означает, что специалистов такого уровня, в той области, которую мы выбрали, больше не будет. Но это как минимум означает, что их количество может быть значительно сокращено.
Лишь изучение новых библиотек, фреймворков и языков программирования недостаточно для поддержания себя на рынке. Периодическое углубление в фундаментальные дисциплины — это одна из подходящих тактик для решения этой проблемы.
В качестве альтернативы можно также рассматривать и периодическую смену сферы деятельности. Это тоже работает, по крайней мере сейчас. Главное не пропускать те моменты, когда очередная индустрия приближается к глобальному сокращению. Сегодня нейронная сеть уже демонстрирует способность верстать страницы например. А в промышленном геймдеве набирает популярность автоматизированное тестирование.
Подробней по вопросу пользы применения мы прошлись еще в новом видео.
Алгоритмы — всё же не самое главное
Несмотря на то что эта дисциплина реально важная, я не защищаю идею того что она самая важная. Самой важной дисциплины или не существует, или зависит от конкретной цели которую мы пытаемся добиться.
Есть куча как фундаментальных, так и узкоспециализированных вещей, которые могут оказаться более важными. Например, если наша цель стать Android-разработчиком — возможно для нас важнее будет разобраться в тонкостях Android API и различиях конкретных железок. Если наша цель стать специалистом в области анализа данных — возможно самым важным тогда окажется изучить некоторые разделы математики.
Дополнительную поправку дает сложность проектов, с которыми мы будем сталкиваться.
Об опасностях при изучении алгоритмов
Если они всё еще будут оставаться актуальными — запишу на эту тему отдельное видео, но пока сфокусирую внимание на следующем: всегда следует ожидать опечатки и неточности в любых материалах, включая информацию из моих видео. Эти материалы чудовищно сложно подготовить, от того в них столько проблем.
Тратим поменьше сил и времени на негативные эмоции, касаемо качества материалов и пускаем это время на что-то более продуктивное. Выгодней будет считать все эти неточности фичами, а не багами: поиск этих неточностей будет дополнительной головоломкой, которая продвигает наше аналитическое мышление, помогает разобраться в предмете еще глубже и подкидывает идеи для блога (а иногда и для целого выступления на митапе/конференции).
Подборка материалов
Курсы
- MIT 6.006 Introduction to Algorithms + практика
- MIT 6.046J Design and Analysis of Algorithms + практика
- MIT 6.851 Advanced Data Structures + практика
Дополнительные материалы
Computational Complexity
- Сложность алгоритмов (из Базовых алгоритмов для школьников)
- Upper and lower bounds
- Recurrence Relations
- P vs. NP and the Computational Complexity Zoo
Divide and Conquer (and Combine)
- Decrease and Conquer: Decrease by a Constant, Decrease by a Constant Factor, Variable-Size-Decrease
- Topological sort
- Lowest Common Ancestor (LCA)
- Quick Sort
Greedy Algorithm
- Kadane’s Algorithm (Max Sum Subarray) (хотя его чаще к Dynamic Programming относят)
- Huffman Coding
- Greedy Coloring Algorithm
- Fractional Knapsack Problem
Dynamic Programming
- Dynamic Programming
- Counting sort
- Rabin Karp (substring search)
- Detect a loop in a linked list (Floyd’s Algorithm)
- Detect Cycle in Directed Graph Algorithm
- Wildcard Matching
- Regular Expression Dynamic Programming
- Edit Distance
- 0/1 Knapsack Problem
Backtracking
Branch and Bound
- What are the differences between ‘backtracking’ and ‘Branch & Bound’ algorithm techniques?
- Branch and bound: Applications
- 0/1 Knapsack problem (1, 2)
- Traveling Salesman
Local Search
- Local Search
- Iterated local search
- What are alternatives of Gradient Descent?
- The Evolution of Gradient Descent
Transform and Conquer
Другое
- Algorithmic paradigm
- Tries
- Binary Heaps
- Error Control and CRC
- Traveling Salesman Problem Visualization
- Малый ШАД - Алгоритмы для NP трудных задач - Александр Куликов
- M* — алгоритм поиска кратчайшего пути, через весь мир, на смартфоне
- Алгоритмы и структуры данных в ядре Linux, Chromium и не только
Практика
- HackerRank
- LeetCode
- GeeksforGeeks
- Codeforces
Справочники
Этот пост будет обновляться в будущем
Добавляй в закладки, чтобы не потерять!
Nostr Login
Nostr Login
Relays not found 🤷
Please choose and set them in your NIP-07 compatible browser extension or in your 👤 profile.
Here's the list of recommended relays:
Report this comment thread? 💬