Этот репозиторий содержит 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
Короткая Общая СуперпоследовательностьA
0/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 - длина самого длинного ключа |