Чтобы действительно хорошо разобраться в алгоритмах — вы будете вынуждены очень сильно прокачать свои аналитические способности. Именно эти способности вам потом помогут эффективней разбираться вообще в чем угодно, что касается программирования.
Но достаточно ли такого аргумента в защиту изучения этой дисциплины?
В этом видео я рассказал зачем и о чем, с моей точки зрения, она на самом деле. В этом же посте вы найдете подборку очень доходчивых материалов на эту тему.
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
Другое
- Tries
- Binary Heaps
- Error Control and CRC
- Traveling Salesman Problem Visualization
- Малый ШАД - Алгоритмы для NP трудных задач - Александр Куликов
- M* — алгоритм поиска кратчайшего пути, через весь мир, на смартфоне
- Алгоритмы и структуры данных в ядре Linux, Chromium и не только
Практика
- HackerRank
- LeetCode
- GeeksforGeeks
- Codeforces
Справочники
- List of terms relating to algorithms and data structures
- Dictionary of Algorithms and Data Structures
Этот пост будет обновляться в будущем
Добавляй в закладки, чтобы не потерять!
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? 💬