Классические алгоритмы и структуры данных на JavaScript / Хабр
trehlebВремя на прочтение 2 мин
Количество просмотров90K
JavaScript *Программирование *Алгоритмы *
Привет Всем! Я недавно запустил на GitHub проект JavaScript Algorithms and Data Structures, который содержит примеры классических алгоритмов и структур данных написанных на JavaScript с объяснениями, примерами и ссылками для дальнейшего изучения (в частности на соответствующие YouTube видео).
Основная задача проекта — помочь программистам в изучении и применении алгоритмов и сделать это на JavaScript-е.
Для того, чтобы сделать процесс изучения более понятным я постарался добавить графические иллюстрации для каждого алгоритма и структуры данных, чтобы быстрее визуально понять о чем идет речь и как тот или иной алгоритм функционирует.
Весь код на 100% покрыт unit-тестами. Это сделано не только для того, чтобы сохранять код в работоспособном состоянии, но так же и для того, чтобы проиллюстрировать методы и случаи употребления данного конкретного алгоритма или структуры данных (что делать, например, если граф направленный в одном из алгоритмов).
Репозиторий так же содержит песочницу. Это небольшой шаблон функции и пустого теста для нее, который должен помочь программисту сразу же приступить к экспериментам с алгоритмами, вместо того, чтобы создавать заново шаблонный код.
На данный момент в репозитории реализованы следующие структуры данных:
- Linked List
- Queue
- Stack
- Hash Table
- Heap
- Priority Queue
- Trie
- Tree (Binary Search Tree, AVL Tree)
- Graph (both directed and undirected)
- Disjoint Set
Дополнительно так же реализованы более 50 популярных алгоритмов. Среди которых есть алгоритмы сортировки, поиска, алгоритмы связанные с графами, деревьями, множествами, строками и математическими выкладками. Алгоритмы разделены на следующие группы:
- Brute Force Algorithms (перебор всех возможных комбинаций и выбор правильного решения)
- Greedy Algorithms (выбор оптимального решения на каждом текущем шаге)
- Divide and Conquer Algorithms (разделение проблемы на меньшие части и решение этих частей проблемы по-отдельности)
- Dynamic Programming Algorithms (построение решения на основании вычисленных ранее на предыдущих шагах данных)
- Backtracking Algorithms (перебор всех комбинаций (как и в Brute Force) с постоянной проверкой того, удовлетворяет ли текущее решение установленным ограничениям или нет, иначе — возврат на шаг назад)
Репозиторий JavaScript Algorithms and Data Structures находится в активной разработке. Это значит, что там будут появляться новые имплементации алгоритмов и структур данных. Тем не менее, надеюсь уже сейчас этот репозиторий может быть вам полезен. Легкого кодинга!
Теги:
- javascript
- algorithms
- data structures
- programming
- algorithm
- data structure
Хабы:
- JavaScript
- Программирование
- Алгоритмы
Всего голосов 76: ↑71 и ↓5 +66
Комментарии 31
Алексей @trehleb
Программист
Комментарии Комментарии 31
Базовый набор JavaScript алгоритмов: для начинающих | by Mad Eight
TL;DR: Список коротких и полезных JavaScript алгоритмов.
Перевод статьи Aurélien Hervé.
Отталкиваясь от моего опыта программирования на Ruby, во время изучения JavaScript, я был разочарован тем, что в языке упущены множество таких базовых методов как merge
,flatten
илиuniq
.
Затем я открыл для себя lodash и это было круто… До тех пор, пока я не понял, что вам стоит быть очень осторожным во время обновлений, потому что очень легко сломать что-то самым невероятным способом (это конечно произошло и со мной; представьте себе, как это прекрасно отлаживать ваш код, когда lodash изменил используемый вами метод и теперь он делает почти тоже самое, но не совсем так как должен был это делать. И как бонус вы не сразу понимаете, что причина в lodash)
Несколько лет спустя, вещи кажутся мне проще благодаря новому стандарту ES6 и теперь я реже использую lodash или любую другую библиотеку для базовых алгоритмов. Вот не полный список того что я использую при написании кода.
Оговорка: Я не претендую на то чтобы превзойти lodash по эффективности или сложности. Кроме того, lodash это невероятный проект. Мои примеры это лишь несложные, простые в написании куски кода, которые работают быстро для достаточно простых случаев. Нам не всегда нужны тяжелые орудия.
Весь код ниже уважает принципы неизменности. Мы никогда не изменяем первоначальный объект, вместо этого мы будем возвращать новый объект с необходимыми свойствами.
Надеюсь это также поможет вам!
Уникальный массив
два способа унифицирование массиваПрежде чем переходить к массиву, помните, что у Set
есть такие полезные методы как size
или has
.
Обновление объекта в массиве по свойству
Мы обновим объект с id: 3
в массиве.
Удаление объекта из массива по свойству
Давайте удалим объект из массива, для которого id === 3
Удаления ключа из объекта
Мы можем использовать деструктуризацию в обратном направлении:
Объединение массива объектов
Следующим кодом мы можем с легкостью объединить вместе объекты или обновить их свойства:
методы reduce и spread прекрасно работают вместеFlatten
Преобразование многомерного массива в одномерный:
преобразование первого уровняFromPairs
Преобразование массива в объект из пар ключ-значение
мне очень нравится деструктурирующее присвоениеВычитание из наборов
Удаление повторяющихся элементов из двух наборов (массивов)
не так часто используемое, но вся равно полезноеЗаключение
Вот и все на сегодня. Не стесняйтесь отправить мне больше примеров или попросите меня показать алгоритм, который я забыл! Я бы с радостью обновил этот список 🙂
Оригинал: https://hackernoon.com/basic-javascript-algorithms-toolbox-starter-kit-dc2af3ceebad
Issues · trekhleb/javascript-algorithms · GitHub
Новый выпускЕсть вопрос по этому проекту? Зарегистрируйте бесплатную учетную запись GitHub, чтобы открыть задачу и связаться с ее сопровождающими и сообществом.
Зарегистрируйтесь на GitHub
Нажимая «Зарегистрироваться на GitHub», вы соглашаетесь с нашими условиями обслуживания и Заявление о конфиденциальности. Время от времени мы будем отправлять вам электронные письма, связанные с учетной записью.
Уже на GitHub? Войти на ваш счет
запутанная сложность времени вставки и удаления в связанном списке
#1001 открыт 28 февраля 2023 г. автором happyuniv
«i» цикла for можно инициализировать значением 2
#990 открыт 31 января 2023 г. автором phcmiguez
Эстудос
#986 открыт 26 января 2023 г. автором Gui7F
вэн
#985 открыт 26 января 2023 г. автором Fourfour444
ЕС не имеет значения
#960 открыт 17 ноября 2022 г. автором Hirasawa-San
перевод кода#958 открыт 11 ноября 2022 г. автором DevBrunoo
Ошибка синтаксического анализа Eslint
#955 открыт 30 октября 2022 г. автором alifhs
чтение-черное дерево
#939 открыт 26 сентября 2022 г. автором 158
384
Добавить CombSort
#931 открыт 27 августа 2022 г. автором шфлери
Набор диаграмм Эйлера
#911 открыт 9 июля 2022 г. автором brunolnetto
Персидский язык
#907 открыт 30 июня 2022 г. автором DariushStony
isPowerOfTwo
алгоритмы не указывают свои диапазоны
#889 открыт 29 мая 2022 г. автором Rudxain
Находит ли эйлеров путь все возможные циклы?
#883 открыт 29 апр. 2022 г. автором лансджполлард
Быстрая сортировка по месту ссылка ведет на странный сайт
#881 открыт 24 апр. 2022 г. автором iicdii
[Опечатка] README. md
#880 открыт 19 апр. 2022 г. автором Leprekus
[ОШИБКА] Функция сильно связанных компонентов прерывается при добавлении ребер в противоположных направлениях
#873 открыт 21 марта 2022 г. автором jackap
Пакет(ы) npm
#872 открыт 7 марта 2022 г. автором Брунольнетто
Ваш проект добавлен в список работ, не подлежащих копированию.
#868 открыт 25 февраля 2022 г. автором apotheon
Добавить алгоритм цепи Маркова или процесса Маркова
#867 открыт 25 февраля 2022 г. автором acfatah
изображения в алгоритмах и структурах данных не отображаются в темной теме github по умолчанию
#866 открыт 22 февраля 2022 г. автором Tig-rank
npm 该更新了 它老了呀
#858 открыт 9 февраля, 2022 по Husselina2019
#857 открыт 7 февраля 2022 г. автором aman-ghanghor
Вставка, удаление, доступ, изменение по индексу в связанном списке
#835 открыт 16 января 2022 г. автором willow-iam
feat: связанный список добавить новый метод
#832 открыт 10 января 2022 г. автором lxhyl
Укажите возможные пути из A в B в ориентированном графе
#830 открыт 9 января, 2022 по brunolnetto
ProTip! Смешивайте и подбирайте фильтры, чтобы сузить поиск.
Запросы на вытягивание · Трехлеб/javascript-алгоритмы · GitHub
Новый пул-реквест Новый
Большие буквы О и маленькие буквы О
#1000 открыт 23 февраля 2023 г. автором Уджаладев15 Загрузка…
Изменен компонент BinarySearch с функции на функцию стрелки.
#999 открыт 20 февраля 2023 г. автором Бен-парень Загрузка…
добавление некоторых алгоритмов скользящего окна
#994 открыт 11 февраля 2023 г. автором Рамзи-Абиди Загрузка…
Обновление README.md
#993 открыт 4 февраля 2023 г. автором ммдзов Загрузка…
Обновленные зависимости и оптимизированные образы
#992 открыт 4 февраля 2023 г. автором Раджанирайин Загрузка…
Обновление README.uk-UA.md
#991 открыт 1 февраля 2023 г. автором владсоснов Загрузка…
обновление перевода кэша LRU для ko-KR
#987 открыт 27 января 2023 г. автором лиахинком Загрузка…
Добавить функцию fastPoweringBitwise
#983 открыт 26 января 2023 г. автором Лампезе Загрузка…
Очистить от рекламного текста
#982 открыт 25 января 2023 г. автором car1ot Загрузка…
рутинная работа: переименование необработанного индекса в желаемый индекс
#977 открыт 9 января 2023 г. автором Кадиенван Загрузка…
Предлагается дополнительная LCS
#974 открыт 5 января 2023 г. автором Letscode-17 Загрузка…
год обновления
#972 открыт 1 января 2023 г. автором IcedMonk Загрузка…
Добавить перевод на испанский
#971 открыт 27 декабря 2022 г. автором Зерновые Z Загрузка…
Обновить README.md
#966 открыт 7 декабря 2022 г. автором Саломондж11 Загрузка…
Обновление factorial.js
#962 открыт 26 ноября 2022 г. автором Франенкобо Загрузка…
Обновление README.ar-AR.md
#959 открыт 15 ноября 2022 г. автором ЮсефРабеи Загрузка…
обновить ES README исправление языка
#952 открыт 27 октября 2022 г. автором лилипопсы Загрузка…
Создать циклSort.js
#949 открыт 17 октября 2022 г. автором шаансурадж Загрузка…
Добавлен алгоритм сортировки дерева
#945 открыт 6 октября 2022 г. автором Гульшанхандале Загрузка…
Реализация списка пропусков
#944 открыт 5 октября 2022 г. автором j0pgrm Загрузка…
Кодирование Хаффмана с использованием жадного алгоритма
#938 открыт 22 сентября 2022 г. автором сайед-набиль Загрузка…
Информация об обновлении 2
#935 открыт 3 сентября 2022 г.