Этот репозиторий содержит JavaScript-примеры многих популярных алгоритмов и структур данных.
Каждый алгоритм и структура данных имеет собственный отдельный README файл с объяснением и ссылками для получения подробной информации (включая видеоролики на YouTube).
Read this in other languages: English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português
☝Обратите внимание, проект предназначен для использования только в учебных и исследовательских целях - не предназначен для использования в реальных проектах.
Структура данных - это особый способ организации и хранения данных в компьютере, который позволяет данным быть доступными и эффективно изменяться. Также, структура данных - это коллекция данных, содержащая зависимости между ними и функции или операции, работающие с данными.
B - Начинающий, A - Продвинутый
BСвязный списокBДвусвязный списокBОчередьBСтекBХэш таблицаBПирамида - (куча, сортирующее дерево) максимальные и минимальные версииBОчередь с приоритетомAПрефиксное ДеревоAДеревоAДвоичное Дерево ПоискаAАВЛ-деревоAКрасно-чёрное ДеревоAСегмент Дерева - с примерами запросов диапазона min / max / sumAДерево Фенвика (Двоичное индексируемое дерево)
AГраф (как направленный, так и ненаправленный)AНепересекающийся НаборAФильтр Блума
Алгоритм - конечная совокупность точно заданных правил решения произвольного класса задач или набор инструкций, описывающих порядок действий исполнителя для решения задачи.
B - Начинающий, A - Продвинутый
- Математика
BНебольшая Манипуляция - установка/получение/обновление/очистка битов, умножение/деление на два, сделать отрицательным и т.д.BФакториалBЧисла Фибоначчи - классический и закрытый вариантыBТест примитивности (метод пробного деления)BАлгоритм Евклида - вычислить наибольший общий делитель (GCD)BНаименьшее Общее Кратное (LCM)BРешето Эратосфена - поиск всех простых чисел до любого заданного пределаBСила Двух - проверьте, является ли число силой двух (наивные и побитовые алгоритмы)BТреугольник ПаскаляBКомплексное Число - комплексные числа и основные операции с нимиBРадиан & Степень - радиан в степень и обратное преобразованиеBБыстрое ВключениеAЦелочисленное РазбиениеAКвадратный Корень - метод НьютонаAАлгоритм Лю Хуэя π - приближенные π расчеты на основе N-gonsAДискретное Преобразование Фурье - декомпозиция функции времени (сигнал) на частоты, которые составляют его
- Наборы
BДекартово Произведение - продукт из нескольких наборовBТасование Фишера-Йетса - случайная перестановка конечной последовательностиAАлгоритм установки мощности - все подмножества множества (побитовые и обратные решения)AПерестановка (с повторениями и без них)AКомбинация (с повторениями и без них)AНаибольшая Общая Подпоследовательность Longest Common Subsequence (LCS)AНаибольшая Возрастающая ПодпоследовательностьAКороткая Общая Суперпоследовательность Shortest Common Supersequence (SCS)AПроблема Рюкзака - "0/1" и "Свободный"AМаксимальный Подмассив - "Грубая Сила" и "Динамическое программирование" (Kadane) версииAСумма Комбинаций - найти все комбинации, которые образуют определенную сумму
- Строки
BРасстояние Хемминга - количество позиций, в которых символы различаютсяAРасстояние Левенштейна - минимальное изменяемое расстояние между двумя последовательностямиAАлгоритм Кнута-Морриса-Пратта (KMP Алгоритм) - поиск подстроки (сопоставление шаблонов)AАлгоритм Z - поиск подстроки (сопоставление шаблонов)AАлгоритм Рабина Карпа - поиск подстрокиAНаибольшая общая подстрокаAСопоставление Регулярных Выражений
- Поиски
BЛинейный ПоискBПрыжковый Поиск (или блочный поиск) - поиск в отсортированном массивеBБинарный Поиск (или двоичный поиск) - поиск в отсортированном массивеBИнтерполяционный Поиск - поиск в равномерно распределенном отсортированном массиве
- Сортировки
BПузырьковая СортировкаBСортировка ВыборомBСортировка ВставкамиBПирамидальная СортировкаBСортировка СлияниемBБыстрая Сортировка - разные реализацииBСортировка Шелла - сортировка включениями с убывающими приращениямиBСортировка ПодсчётомBПоразрядная Сортировка
- Связные списки
- Деревья
BПоиск в глубину Depth-First Search (DFS)BПоиск в ширину Breadth-First Search (BFS)
- Графы
BПоиск в глубину Depth-First Search (DFS)BПоиск в ширину Breadth-First Search (BFS)BАлгоритм Крускала - поиск минимального остовного дерева (MST) для взвешенного неориентированного графаAАлгоритм Дейкстры - поиск кратчайших путей ко всем вершинам графа из одной вершиныAАлгоритм Беллмана-Форда - поиск кратчайших путей ко всем вершинам графа из одной вершиныAАлгоритм Флойда-Уоршолла - найти кратчайший путь между всеми парами вершинAОбнаружения Цикла - как для направленных, так и для неориентированных графов (версии на основе DFS и непересекающихся наборов)AАлгоритм Прима - поиск минимального остовного дерева (MST) для взвешенного неориентированного графаAТопологическая Сортировка - метод DFSAТочки Сочленения - Алгоритм Тарьяна (основанный на DFS)AМосты - Алгоритм на основе DFSAЭйлеров путь и Эйлерова цепь - Алгоритм Флери - посещение каждого края ровно один разAГамильтонов Цикл - посещение каждой вершины ровно один разAСильно Связные Компоненты - Алгоритм КосарайюAЗадача Коммивояжера - кратчайший маршрут, по которому посещает каждый город и возвращается в исходный город
- Криптография
BПолиномиальный Хэш - хэш-функция на основе полинома
- Без категории
BХанойская БашняBКвадратная Матрица Вращения - алгоритм на местеBАлгоритм прыжка - обратное отслеживание, динамическое программирование (сверху вниз + снизу вверх) и примерыBУникальный Путь - обратное отслеживание, динамическое программирование и примеры на основе треугольника ПаскаляBДождь Террасы - проблема улавливания дождевой воды (версии динамического программирования и грубой силы)BРекурсивная Лестница - подсчитать количество способов добраться до вершины (4 решения)AПроблема N-QueensAРыцарский Тур
Алгоритмическая парадигма - это общий метод или подход, который лежит в основе проектирования класса алгоритмов. Это абстракция выше, чем понятие алгоритма, так же как алгоритм - это абстракция выше, чем компьютерная программа.
- Грубая Сила (Полный перебор) - посмотрите на все возможности и выберите лучшее решение
BЛинейный ПоискBДождь Террасы - проблема улавливания дождевой водыBРекурсивная Лестница - подсчитать количество способов добраться до вершиныAМаксимальный ПодмассивAЗадача Коммивояжера - кратчайший маршрут, по которому посещает каждый город и возвращается в исходный городAДискретное Преобразование Фурье - декомпозиция функции времени (сигнал) на частоты, которые составляют его
- Жадный алгоритм - выбирайте оптимальный вариант на текущий момент, без каких-либо раздумий на будущее
BАлгоритм прыжкаAПроблема Сободного РюкзакаAАлгоритм Дейкстры - поиск кратчайших путей ко всем вершинам графа из одной вершиныAАлгоритм Прима - поиск минимального остовного дерева (MST) для взвешенного неориентированного графаAАлгоритм Крускала - поиск минимального остовного дерева (MST) для взвешенного неориентированного графа
- Разделяй и властвуй - разделите проблему на более мелкие части, а затем решите эти части
BБинарный ПоискBХанойская БашняBТреугольник ПаскаляBАлгоритм Евклида - вычислить наибольший общий делитель (GCD)BСортировка СлияниемBБыстрая СортировкаBПоиск по дереву в глубину (DFS)BПоиск по графам в глубину (DFS)BАлгоритм прыжкаBБыстрое ВключениеAПерестановка (с повторениями и без них)AКомбинация (с повторениями и без них)
- Динамическое Программирование - создайте решение, используя ранее найденные подрешения
BЧисла ФибоначчиBАлгоритм прыжкаBУникальный ПутьBДождь Террасы - проблема улавливания дождевой водыBРекурсивная Лестница - подсчитать количество способов добраться до вершиныAРасстояние Левенштейна - минимальное изменяемое расстояние между двумя последовательностямиAНаибольшая Общая Подпоследовательность (LCS)AНаибольшая общая подстрокаAНаибольшая Возрастающая ПодпоследовательностьAКороткая Общая СуперпоследовательностьA0/1 Проблема РюкзакаAЦелочисленное РазбиениеAМаксимальный ПодмассивAАлгоритм Беллмана-Форда - поиск кратчайших путей ко всем вершинам графа из одной вершиныAАлгоритм Флойда-Уоршолла - найти кратчайший путь между всеми парами вершинAСопоставление Регулярных Выражений
- Возврат (Бэктрекинг) - подобно "грубой силе", попробуйте создать все возможные решения, но каждый раз, когда вы создаете следующее решение, тестируйте его
на удовлетворение всем условиям, и только тогда продолжайте генерировать последующие решения. В противном случае, отступите и продолжайте
искать другой путь поиска решения. Обычно используется метод DFS.
BАлгоритм прыжкаBУникальный ПутьBАлгоритм установки мощности - все подмножества множестваAГамильтонов Цикл - посещение каждой вершины ровно один разAПроблема N-QueensAРыцарский ТурAСумма Комбинаций - найти все комбинации, которые образуют определенную сумму
- Ветви И Границы - запомните самое дешевое решение - это решение найденное на каждом этапе возврата (бэктрекинга), используйте решение найденное до нижней границы стоимости решения проблемы, чтобы отказаться от решений с затратами больше, чем самое дешевое решение которое уже найдено. Обычно используется метод BFS в сочетании с методом DFS.
Установите все зависимости
npm install
Запуск ESLint
Вы можете запустить его, чтобы проверить качество кода.
npm run lint
Запуск тестов
npm test
Запуск теста по имени
npm test -- 'LinkedList'
Песочница
Вы можете играть с структурами данных и алгоритмами в файле ./src/playground/playground.js и написать тесты в ./src/playground/__test__/playground.test.js.
Затем просто запустите следующую команду, чтобы проверить, работает ли ваш код в песочнице так, как ожидалось:
npm test -- 'playground'
▶ Data Structures and Algorithms on YouTube
Big O нотации используется для классификации алгоритмов в соответствии с тем, как их требования к времени выполнения или пространству растут по мере увеличения размера входных данных. На диаграмме ниже вы можете найти наиболее распространенные порядки роста алгоритмов, указанных в нотации Big O.
Источник: Big O Cheat Sheet.
Ниже приведен список некоторых из наиболее часто используемых обозначений Big O и их сравнение производительности с различными размерами входных данных.
| Big O нотация | Вычисления для 10 элементов | Вычисления для 100 элементов | Вычисления для 1000 элементов |
|---|---|---|---|
| O(1) | 1 | 1 | 1 |
| O(log N) | 3 | 6 | 9 |
| O(N) | 10 | 100 | 1000 |
| O(N log N) | 30 | 600 | 9000 |
| O(N^2) | 100 | 10000 | 1000000 |
| O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
| O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
| Структура данных | Доступ | Поиск | Вставка | Удаление | Комментарий |
|---|---|---|---|---|---|
| Массив | 1 | n | n | n | |
| Стэк | n | n | 1 | 1 | |
| Очередь | n | n | 1 | 1 | |
| Связный список | n | n | 1 | n | |
| Хэш таблица | - | n | n | n | В случае идеальной хэш-функции затраты будут O(1) |
| Двоичное Дерево Поиска | n | n | n | n | В случае сбалансированного дерева затраты будут O(log(n)) |
| B-дерево | log(n) | log(n) | log(n) | log(n) | |
| Красно-чёрное Дерево | log(n) | log(n) | log(n) | log(n) | |
| АВЛ-дерево | log(n) | log(n) | log(n) | log(n) | |
| Фильтр Блума | - | 1 | 1 | - | Возможны ложные срабатывания при поиске |
| Name | Лучшее | Среднее | Худшее | Память | Стабильность | Комментарий |
|---|---|---|---|---|---|---|
| Пузырьковая Сортировка | n | n2 | n2 | 1 | Да | |
| Сортировка Вставками | n | n2 | n2 | 1 | Да | |
| Сортировка Выбором | n2 | n2 | n2 | 1 | Нет | |
| Пирамидальная Сортировка | n log(n) | n log(n) | n log(n) | 1 | Нет | |
| Сортировка Слиянием | n log(n) | n log(n) | n log(n) | n | Да | |
| Быстрая Сортировка | n log(n) | n log(n) | n2 | log(n) | Нет | Быстрая сортировка обычно выполняется с сложностью o(log (n)) |
| Сортировка Шелла | n log(n) | зависит от последовательности | n (log(n))2 | 1 | No | |
| Сортировка Подсчётом | n + r | n + r | n + r | n + r | Да | r - самое большое число в массиве |
| Поразрядная Сортировка | n * k | n * k | n * k | n + k | Да | k - длина самого длинного ключа |
