README.uk-UA.md
Даний репозиторій приклади багатьох популярних алгоритмів та структур даних на основі JavaScript.
Кожен алгоритм та структура даних має свій окремий README-файл із відповідними поясненнями та посиланнями для подальшого вивчення (включаючи посилання на відео на YouTube).
Вивчення матеріалу на інших мовах: English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Bahasa Indonesia, Arabic, Tiếng Việt, Deutsch, Uzbek עברית
Структура даних (в програмуванні) - це спосіб організації даних в комп'ютерах. Часто разом зі структурою даних пов'язується і специфічний перелік операцій, що можуть бути виконаними над даними, організованими в таку структуру. Точніше, структура даних - це сукупність даних цінності, взаємозв'язки між ними та функції або операції, до яких можна застосувати дані.
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 | n<sup>2</sup> | n<sup>2</sup> | 1 | Так | |
| Сортування включенням | n | n<sup>2</sup> | n<sup>2</sup> | 1 | Так | |
| Сортування вибором | n<sup>2</sup> | n<sup>2</sup> | n<sup>2</sup> | 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) | n<sup>2</sup> | log(n) | Ні | Швидке сортування зазвичай виконується на місці з використанням O (log (n)) додаткової пам'яті |
| Сортування Шелла | n log(n) | залежить від послідовності проміжків | n (log(n))<sup>2</sup> | 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