36 KiB
Алгоритми JavaScript та структури даних
Даний репозиторій приклади багатьох популярних алгоритмів та структур даних на основі JavaScript.
Кожен алгоритм та структура даних має свій окремий README-файл із відповідними поясненнями та посиланнями для подальшого вивчення (включаючи посилання на відео на YouTube).
Вивчення матеріалу на інших мовах: English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Bahasa Indonesia, Arabic, Deutsch
☝ Зверніть увагу! Даний проект призначений лише для навчальних та дослідницьких цілей, і він не призначений для виробництва (продакшн).
Структури даних
Структура даних (в програмуванні) - це спосіб організації даних в комп'ютерах. Часто разом зі структурою даних пов'язується і специфічний перелік операцій, що можуть бути виконаними над даними, організованими в таку структуру. Точніше, структура даних - це сукупність даних цінності, взаємозв'язки між ними та функції або операції, до яких можна застосувати дані.
B
- Початківець, A
- Просунутий рівень
B
Зв'язаний списокB
Двобічно зв'язаний списокB
ЧергаB
СтекB
Геш-таблицяB
Купа, стіс або піраміда - max and min heap versionsB
Черга з пріоритетомA
Префіксне деревоA
ДеревоA
Двійкове дерево пошукуA
АВЛ-деревоA
Червоно-чорне деревоA
Дерево відрізків - with min/max/sum range queries examplesA
Дерево Фенвіка (Binary Indexed Tree)
A
Граф (абстрактний тип даних) (both directed and undirected)A
Система неперетинних множинA
Фільтр Блума
Алгоритми
Алгоритм - це однозначна специфікація способу вирішення класу задач. Це набір правил, які точно визначають послідовність операцій.
B
- Початківець, A
- Просунутий рівень
Алгоритми за тематикою
- Математика
B
Бітова маніпуляція - встановити / отримати / оновити / очистити біти, множення / ділення на два, робити від’ємними тощоB
ФакторіалB
Послідовність Фібоначчі - класична та закриті версіїB
Основні фактори - пошук простих множників і підрахунок їх за допомогою теореми Харді-РамануджанаB
Тест простоти (метод пробного поділу)B
Алгоритм Евкліда - метод обчислення найбільшого спільного дільника (НСД)B
Найменше спільне кратне (НСК)B
Решето Ератосфена - алгоритм знаходження всіх простих чисел менших деякого цілого числа nB
Піднесення до степеня - перевірити, чи є число ступенем двох (просте та побітове рішення)B
Трикутник ПаскаляB
Комплексне число - комплексні числа та основні операції з нимиB
Радіани & Градуси - перетворення радіанів у градуси та навпакиB
Швидке піднесення до степеняB
Схема Горнера - поліноміальна оцінкаA
Розбиття числаA
Метод дотичних (метод Ньютона) - метод наближеного знаходження кореня дійсного рівнянняA
Алгоритм Лю Хуея - розрахунок числа π з заданою точністю методом вписаних правильних багатокутниківA
Дискретне перетворення Фур'є - розкладання тимчасової функції (сигналу) на частотні складові
- Множина
B
Декартів добуток множин - множина усіх можливих впорядкованих парB
Тасування Фішера - Єйтса - створення випадкових перестановок кінцевого безлічіA
Булеан - множина всіх підмножин даної множини (бітові та зворотні рішення)A
Перестановка (з повтореннями та без)A
Комбінації (з повтореннями та без)A
Пошук найдовшої спільної підпослідовностіA
Завдання пошуку найбільшою збільшується підпослідовностіA
Найменша загальна супер-послідовністьA
Задача пакування рюкзака - приклади "0/1" та "Необмежений"A
Максимальний підмасив - метод «Грубої сили» та алгоритм КаданаA
Комбінована сума - знайти всі комбінації, що утворюють конкретну суму
- Алгоритми роботи з рядками
B
Відстань Геммінга - число позицій, у яких відповідні цифри двох двійкових слів однакової довжини різніA
Відстань Левенштейна - міра відмінності двох послідовностей символів (рядків)A
Алгоритм Кнута — Морріса — Пратта пошук підрядків (узгодження шаблонів)A
Z-функція - пошук підрядків (зіставлення зразків)A
Алгоритм Рабіна — Карпа - алгоритм пошуку рядкаA
Найбільший загальний підрядокA
Підбирання регулярного виразу
- Алгоритми пошуку
B
Лінійний пошукB
Пошук блоків - пошук у відсортованому масивіB
Двійковий пошук - знаходження заданого значення у впорядкованому масивіB
Інтерполяційний алгоритм пошуку - алгоритм для пошуку за заданим ключем в індексованому масиві, який впорядкований за значенням ключів
- Алгоритми сортування
- Зв’язані списки
- Дерева
- Графи
B
Пошук у глибинуB
Пошук у ширинуB
Алгоритм Крускала - алгоритм побудови мінімального кістякового дерева зваженого неорієнтовного графаA
Алгоритм Дейкстри - знаходження найкоротшого шляху від однієї вершини графа до всіх інших вершинA
Алгоритм Беллмана — Форда - алгоритм пошуку найкоротшого шляху в зваженому графіA
Алгоритм Флойда — Воршелла - знаходження найкоротшого шляху в зваженому графі з додатними або від'ємними вагами ребер (але без від'ємнозначних циклів)A
Циклічний граф - граф, що складається з єдиного циклу, або, іншими словами, деякого числа вершин, з'єднаних замкнутим ланцюгом.A
Алгоритм Прима - жадібний алгоритм побудови мінімального кістякового дерева зваженого зв'язного неорієнтованого графаA
Топологічне сортування - впорядковування вершин безконтурного орієнтованого графа згідно з частковим порядком, визначеним ребрами цього графу на множині його вершинA
Алгоритм Тар'яна - алгоритм пошуку компонент сильної зв'язності в орієнтованому графі, що працює за лінійний часA
Міст (теорія графів)A
Ейлерів ланцюг - ланцюг у графі, який проходить кожне ребро рівно один разA
Гамільтонів граф - шлях, що містить кожну вершину графа рівно один разA
Компонента сильної зв'язності графа - Алгоритм Косараджу - алгоритм для знаходження компонент сильної зв’язності орієнтованого графуA
Задача комівояжера - знаходження найвигіднішого маршруту, що проходить через вказані міста хоча б по одному разу
- Криптографія
B
Хеш-функція - функція, що перетворює вхідні дані будь-якого (як правило великого) розміру в дані фіксованого розміру.B
Шифр Цезаря (шифр зсуву) - симетричний моноалфавітний алгоритм шифрування, в якому кожна буква відкритого тексту заміняється на ту, що віддалена від неї в алфавіті на сталу кількість позиційB
Шифр Гілла - поліграмний шифр підстановки, заснований на лінійній алгебрі
- Машинне навчання
B
Нано-нейрон - 7 простих функцій JS, які ілюструють, як машини насправді можуть навчатися (пряме та зворотнє поширення)B
Метод k-найближчих сусідів - простий непараметричний класифікаційний метод, де для класифікації об'єктів у рамках простору властивостей використовуються відстані (зазвичай евклідові), пораховані до усіх інших об'єктівB
Кластеризація методом к–середніх - популярний метод кластеризації, — впорядкування множини об'єктів в порівняно однорідні групи.
- Без категорії
B
Ханойська вежаB
Поворот квадратної матриціB
Гра стрибків - зворотне відстеження, динамічне програмування (зверху вниз + знизу вгору) та жадібні прикладиB
Проблема унікальних шляхів - зворотне відстеження, динамічне програмування та приклади на основі Трикутника ПаскаляB
Дощові тераси - проблема захоплення дощової води (динамічне програмування та версії грубої сили)B
Завдання про рекурсивні сходи - підрахунок кількості способів досягти вершини (4 рішення)A
Задача про вісім ферзівA
Задача про хід коня
Парадигма програмування
Парадиигма програмува́ння — це система ідей і понять, які визначають стиль написання комп'ютерних програм, а також спосіб мислення програміста. Це спосіб концептуалізації, що визначає організацію обчислень і структурування роботи, яку виконує комп'ютер.
- Метод «грубої сили» або повний перебір - метод рішення криптографічної задачі шляхом перебору всіх можливих варіантів ключа
B
Лінійний пошукB
Дощові тераси - задача про дощові терасиB
Завдання про рекурсивні сходи - підрахунок кількості способів досягти вершиниA
Максимальний підмасивA
Задача комівояжера - знаходження найвигіднішого маршруту, що проходить через вказані міста хоча б по одному разуA
Дискретне перетворення Фур'є - розкладання тимчасової функції (сигналу) на частотні складові
- "Жадібні" алгоритми - простий і прямолінійний евристичний алгоритм, який приймає найкраще рішення, виходячи з наявних на кожному етапі даних, не зважаючи на можливі наслідки, сподіваючись урешті-решт отримати оптимальний розв'язок
B
Гра стрибків - зворотне відстеження, динамічне програмування (зверху вниз + знизу вгору) та жадібні прикладиA
Задача пакування рюкзака - приклади "0/1" та "Необмежений"A
Алгоритм Дейкстри - знаходження найкоротшого шляху від однієї вершини графа до всіх інших вершинA
Алгоритм Прима - жадібний алгоритм побудови мінімального кістякового дерева зваженого зв'язного неорієнтованого графаA
Алгоритм Крускала - алгоритм побудови мінімального кістякового дерева зваженого неорієнтовного графа
- Розділяй і володарюй - важлива парадигма розробки алгоритмів, що полягає в рекурсивному розбитті розв'язуваної задачі на дві або більше підзадачі того ж типу, але меншого розміру, і комбінуванні їх розв'язків для отримання відповіді до вихідного завдання. Розбиття виконуються доти, поки всі підзавдання не стануть елементарними.
B
Двійковий пошук - знаходження заданого значення у впорядкованому масивіB
Ханойська вежаB
Трикутник ПаскаляB
Алгоритм Евкліда - метод обчислення найбільшого спільного дільника (НСД)B
Сортування злиттямB
Швидке сортуванняB
Пошук у глибинуB
Пошук у ширинуB
Гра стрибків - зворотне відстеження, динамічне програмування (зверху вниз + знизу вгору) та жадібні прикладиB
Швидке піднесення до степеняA
Перестановка (з повтореннями та без)A
Комбінації (з повтореннями та без)
- Динамічне програмування - розділ математики, який присвячено теорії і методам розв'язання багатокрокових задач оптимального управління
B
Послідовність Фібоначчі - класична та закриті версіїB
Гра стрибків - зворотне відстеження, динамічне програмування (зверху вниз + знизу вгору) та жадібні прикладиB
Проблема унікальних шляхів - зворотне відстеження, динамічне програмування та приклади на основі Трикутника ПаскаляB
Дощові тераси - проблема захоплення дощової води (динамічне програмування та версії грубої сили)B
Завдання про рекурсивні сходи - підрахунок кількості способів досягти вершини (4 рішення)A
Відстань Левенштейна - міра відмінності двох послідовностей символів (рядків)A
Пошук найдовшої спільної підпослідовностіA
Найбільший загальний підрядокA
Завдання пошуку найбільшою збільшується підпослідовностіA
Найменша загальна супер-послідовністьA
Задача пакування рюкзака - приклади "0/1" та "Необмежений"A
Розбиття числаA
Максимальний підмасивA
Алгоритм Беллмана — Форда - алгоритм пошуку найкоротшого шляху в зваженому графіA
Алгоритм Флойда — Воршелла - знаходження найкоротшого шляху в зваженому графі з додатними або від'ємними вагами ребер (але без від'ємнозначних циклів)A
Підбирання регулярного виразу
- Пошук із зворотом - подібно до грубої сили, намагайтеся генерувати всі можливі рішення, але кожного разу, коли ви створюєте наступне рішення, тестуєте чи він задовольняє всім умовам, і лише потім продовжуєте генерувати наступні рішення. В іншому випадку поверніться назад і рухайтесь далі іншим шляхом пошуку рішення.
B
Гра стрибків - зворотне відстеження, динамічне програмування (зверху вниз + знизу вгору) та жадібні прикладиB
Проблема унікальних шляхів - зворотне відстеження, динамічне програмування та приклади на основі Трикутника ПаскаляB
Булеан - множина всіх підмножин даної множини (бітові та зворотні рішення)A
Гамільтонів граф - шлях, що містить кожну вершину графа рівно один разA
Задача про вісім ферзівA
Задача про хід коняA
Комбінована сума - знайти всі комбінації, що утворюють конкретну суму
- Метод гілок і меж - один з поширених методів дискретної оптимізації. Метод працює на дереві рішень та визначає принципи роботи конкретних алгоритмів пошуку розв'язків, тобто, є мета-алгоритмом. Для різних задач комбінаторної оптимізації створюють спеціалізовані алгоритми гілок та меж.
Як користуватися цим репозиторієм
Встановіть усі залежності
npm install
Запустіть ESLint
Запустіть для перевірки якості коду
npm run lint
Запустіть усі тести
npm test
Запустіть тести за назвою
npm test -- 'LinkedList'
Ігрище
Ви можете побавитись зі структурами даних та алгоритмами в файлі ./src/playground/playground.js
та писати тести до них в даному файлі ./src/playground/__test__/playground.test.js
.
Для перевірки, чи працює ваш код належним чином запустіть команду:
npm test -- 'playground'
Корисна інформація
Список літератури
▶ Структури даних та алгоритми на YouTube
Асимптотична нотація великого О (нотація Ландау)
Асимптотична нотація великого О (нотація Ландау) розповсюджена математична нотація для формального запису асимптотичної поведінки функцій. Широко вживається в теорії складності обчислень, інформатиці та математиці.
Джерело: Асимптотична нотація великого О.
Нижче наведено список деяких найбільш часто використовуваних позначень нотації Ландаута їх порівняння продуктивності з різними розмірами вхідних даних.
Нотація Ландау | Обчислення для 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)) |
Б-дерево | 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 | - | Під час пошуку можливі помилкові спрацьовування |
Складність алгоритмів сортування масивів
Назва | Найкращий | Середній | Найгірший | Пам'ять | Стабільність | Коментарі |
---|---|---|---|---|---|---|
Сортування бульбашкою | 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 | Ні | |
Сортування підрахунком | n + r | n + r | n + r | n + r | Так | Де r - найбільше число в масиві |
Сортування за розрядами | n * k | n * k | n * k | n + k | Так | Де k - довжина найдовшого ключа |
Патронати проекту
Ви можете підтримати цей проект через ❤️️ GitHub або ❤️️ Patreon.
Люди, які підтримують цей проект ∑ = 1
ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev