36 KiB
Алгоритми JavaScript та структури даних
Даний репозиторій приклади багатьох популярних алгоритмів та структур даних на основі JavaScript.
Кожен алгоритм та структура даних має свій окремий README-файл із відповідними поясненнями та посиланнями для подальшого вивчення (включаючи посилання на відео на YouTube).
Вивчення матеріалу на інших мовах: English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Bahasa Indonesia, Arabic, Tiếng Việt, 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Алгоритм Кнута — Морріса — Пратта пошук підрядків (узгодження шаблонів)AZ-функція - пошук підрядків (зіставлення зразків)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