Javascript алгоритмы: основные понятия и работа с массивами

Классические алгоритмы и структуры данных на JavaScript / Хабр

trehleb

Время на прочтение 2 мин

Количество просмотров

90K

JavaScript *Программирование *Алгоритмы *

Привет Всем! Я недавно запустил на GitHub проект JavaScript Algorithms and Data Structures, который содержит примеры классических алгоритмов и структур данных написанных на JavaScript с объяснениями, примерами и ссылками для дальнейшего изучения (в частности на соответствующие YouTube видео).

Основная задача проекта — помочь программистам в изучении и применении алгоритмов и сделать это на JavaScript-е.

Для того, чтобы сделать процесс изучения более понятным я постарался добавить графические иллюстрации для каждого алгоритма и структуры данных, чтобы быстрее визуально понять о чем идет речь и как тот или иной алгоритм функционирует.

2))
  • Список с конкретными значениями Big O (чтобы понимать насколько большое или маленькое значение у 10! (а оно у него аж 3628800))
  • Сложность выполнения базовых операций для структур данных (чтобы понять у каких структур быстрое чтение, а у каких поиск или удаление)
  • Сравнительная таблица сложности алгоритмов сортировки (чтобы понять какой способ сортировки выбрать и в каком случае, стабильная ли сортировка или нет)
  • Весь код на 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 г.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *