To repozytorium zawiera wiele przykładów JavaScript opartych na znanych algorytmach i strukturach danych.
Każdy algorytm i struktura danych zawiera osobny plik README wraz z powiązanymi wyjaśnieniami i odnośnikami do dalszego czytania (włącznie z tymi do YouTube videos).
Read this in other languages: English 简体中文, 繁體中文, 한국어, 日本語, Français, Español, Português, Русский, Türk, Italiana
Struktura danych to sposób uporządkowania i przechowywania informacji w komputerze żeby mogłaby być sprawnie dostępna i efektywnie zmodyfikowana. Dokładniej, struktura danych jest zbiorem wartości danych, relacjami pomiędzy nimi, zadaniami lub działaniami, które mogą dotyczyć danych.
B
- Początkujący, A
- Zaawansowany
B
ListaB
Lista DwukierunkowaB
KolejkaB
StosB
Tabela SkrótuB
StertaB
Kolejka PriorytetowaA
TrieA
Drzewo
A
Wyszukiwanie BinarneA
AVL DrzewoA
Drzewa czerwono-czarneA
Drzewo Segmentu - z przykładami zapytań o min / max / sumie sumA
Drzewo Fenwicka (Drzewo Indeksowane Binarnie)A
Graf (zarówno skierowane i nieukierunkowane)A
Rozłączny ZestawA
Filtr BloomaAlgorytm jest to skończony ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań. Sposób postępowania prowadzący do rozwiązania problemu.
B
- Początkujący, A
- Zaawansowany
B
Manipulacja Bitami - ustaw / uzyskaj / aktualizuj / usuwaj bity, mnożenie / dzielenie przez dwa, tworzenie negatywów itp.B
SilnaB
Ciąg FibonacciegoB
Test Pierwszorzędności (metoda podziału na próby)B
Algorytm Euclideana - obliczyć Największy Wspólny Dzielnik (GCD)B
Najmniejsza Wspólna Wielokrotność (LCM)B
Sito Eratosthenes-a - znajdowanie wszystkich liczb pierwszych do określonego limituB
Jest Potęgą Dwójki - sprawdź, czy liczba jest potęgą dwóch (algorytmy naiwne i bitowe)B
Trójkąt PascalaA
Partycja CałkowitaA
Algorytm Liu Huia - przybliżone obliczenia na podstawie N-gonówB
Produkt Kartezyjny - wynik wielu zestawówB
Przetasowanie Fisher Yates-a - losowa permutacja kończącej się seriiA
Zestaw Zasilający - podzbiór wszystkich seriiA
Permutacje (z albo bez powtórzeń)A
Kombinacje (z albo bez powtórzeń)A
Najdłuższa Wspólna Podsekwencja (LCS)A
Najdłuższa Wzrostająca PodsekwencjaA
Najkrótsza Wspólna Supersekwencja (SCS)A
Problem Knapsacka - “0/1” i “Rozwiązany”A
Maksymalna Podtablica - “Metoda Siłowa” i “Dynamiczne Programowanie” (Kadane-a) wersjeA
Suma Kombinacji -
znajdź wszystkie kombinacje, które tworzą określoną sumęB
Odległość Hamminga - liczba pozycji, w których symbole są różneA
Odległość Levenshteina - minimalna odległość edycji między dwiema sekwencjamiA
Algorytm Knuth–Morris–Pratta (Algorytm KMP) - dopasowywanie wzorców (dopasowywanie wzorców)A
Algorytm Z - szukanie podłańcucha(dopasowywanie wzorców)A
Algorytm Rabin Karpa - szukanie podłańcuchaA
Najdłuższa Wspólna PodłańcuchaA
Dopasowanie Wyrażeń RegularnychB
Wyszukiwanie LinioweB
Jump Search (lub Przeszukiwanie Bloku) - szukaj w posortowanej tablicyB
Wyszukiwanie Binarne - szukaj w posortowanej tablicyB
Wyszukiwanie Interpolacyjne - szukaj w równomiernie rozłożonej, posortowanej tablicyB
Sortowanie bąbelkoweB
Sortowanie przez wymianeB
Sortowanie przez wstawianieB
Sortowanie stogoweB
Sortowanie przez scalanieB
Sortowanie szybkie - wdrożenia w miejscu i nie na miejscuB
Sortowanie ShellaB
Sortowanie przez zliczanieB
Sortowanie pozycyjneB
Przeszukiwanie w głąb (DFS)B
Przeszukiwanie wszerz (BFS)B
Przeszukiwanie w głąb (DFS)B
Przeszukiwanie wszerz (BFS)B
Algorytm Kruskala - znalezienie Minimalnego Drzewa Opinającego (MST) dla ważonego nieukierunkowanego wykresuA
Algorytm Dijkstry - znajdowanie najkrótszej ścieżki z pojedynczego źródła w grafieA
Algorytm Bellmana-Forda - znajdowanie najkrótszych ścieżek do wszystkich wierzchołków wykresu z jednego wierzchołkaA
Algorytm Floyd-Warshalla - znajdź najkrótsze ścieżki między wszystkimi parami wierzchołkówA
Detect Cycle - zarówno dla wykresów skierowanych, jak i nieukierunkowanych(wersje oparte na DFS i Rozłączny Zestaw)A
Algorytm Prima - znalezienie Minimalnego Drzewa Opinającego (MST) dla ważonego nieukierunkowanego wykresuA
Sortowanie Topologiczne - metoda DFSA
Punkty Artykulacji - Algorytm Tarjana (oparty o DFS)A
Mosty - Oparty na algorytmie DFSA
Ścieżka Euleriana i Obwód Euleriana - Algorytm Fleurya - Odwiedź każdą krawędź dokładnie razA
Cykl Hamiltoniana - Odwiedź każdy wierzchołek dokładnie razA
Silnie Połączone Komponenty - Algorytm KosarajaA
Travelling Salesman Problem - najkrótsza ścieżka która odwiedza każde miasto i wraca miasta początkującegoB
Wieża HanoiB
Kwadratowa Matryca Obrotu - algorytm w miejscuB
Jump Game - cofanie, dynamiczne programowanie (od góry do dołu + od dołu do góry) i przykłady chciwegoB
Unikatowe Ścieżki - cofanie, dynamiczne programowanie i przykłady oparte na Trójkącie PascalaA
Problem N-QueensA
Knight’s TourParadygmat algorytmiczny jest ogólną metodą lub podejściem, które jest podstawą projektowania klasy algorytmów. Jest abstrakcją wyższą niż pojęcie algorytmu, podobnie jak algorytm jest abstrakcją wyższą niż program komputerowy.
B
Wyszukiwanie LinioweA
Maksymalna PodtablicaA
Problem z Podróżującym Sprzedawcą - najkrótsza możliwa trasa, która odwiedza każde miasto i wraca do miasta początkowegoB
Jump GameA
Niezwiązany Problem Knapsacka A
Algorytm Dijkstry -
znalezienie najkrótszej ścieżki do wszystkich wierzchołków grafuA
Algorytm Prima - znalezienie Minimalnego Drzewa Opinającego (MST) dla ważonego nieukierunkowanego wykresuA
Algorytm Kruskala - znalezienie Minimalnego Drzewa Opinającego (MST) dla ważonego nieukierunkowanego wykresuB
Wyszukiwanie BinarneB
Wieża HanoiB
Trójkąt PascalaB
Algorytm Euclideana - obliczyć Największy Wspólny Dzielnik(GCD)B
Sortowanie przez scalanieB
Szybkie SortowanieB
Drzewo Przeszukiwania W Głąb (DFS)B
Graf Przeszukiwania W Głąb (DFS)B
Jump GameA
Permutacje (z albo bez powtórzeń)A
Kombinacje (z albo bez powtórzeń)B
Ciąg FibonacciegoB
Jump GameB
Unikatowe ScieżkiA
Dystans Levenshteina - minimalna odległość edycji między dwiema sekwencjamiA
Najdłuższa Wspólna Podsekwencja (LCS)A
Najdłuższa Wspólna PodłańcuchaA
Najdłuższa Wzrostająca PodsekwencjaA
Najkrótsza Wspólna SupersekwencjaA
0/1 Problem KnapsackaA
Partycja CałkowitaA
Maksymalne PodtabliceA
Algorytm Bellman-Forda - znalezienie najkrótszej ścieżki wszystkich wierzchołków wykresuA
Algorytm Floyd-Warshalla -
znajdź najkrótsze ścieżki między wszystkimi parami wierzchołkówA
Dopasowanie Wyrażeń RegularnychB
Jump GameB
Unikatowe ScieżkiA
Cykl Hamiltoniana - Odwiedź każdy wierzchołek dokładnie razA
Problem N-QueensA
Knight’s TourA
Zestaw Sumy - znajduje wszystkie zestawy które tworzą określoną sumęZainstaluj wszystkie zależnosci
npm install
Uruchom ESLint
Możesz to uruchomić aby sprawdzić jakość kodu.
npm run lint
Uruchom wszystkie testy
npm test
Uruchom testy używając określonej nazwy
npm test -- 'LinkedList'
Playground
Możesz pociwiczyć ze strukturą danych i algorytmami w ./src/playground/playground.js
zakartotekuj i napisz
testy do tego w ./src/playground/__test__/playground.test.js
.
Następnie uruchom następującą komendę w celu przetestowania czy twoje kod działa według oczekiwań:
npm test -- 'playground'
â–¶ Struktury Danych i Algorytmy na YouTube
Kolejność wzrastania algorytmów według Big O notacji.
Źródło: Big O Cheat Sheet.
Poniżej umieszczamy listę najbardziej używanych Big O notacji i ich porównania wydajności do róznych rozmiarów z wprowadzonych danych.
Big O notacja | Obliczenia na 10 elementów | Obliczenia na 100 elementów | Obliczenia na 1000 elementów |
---|---|---|---|
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 |
Struktura Danych | Dostęp | Szukaj | Umieszczanie | Usuwanie | Komentarze |
---|---|---|---|---|---|
Szereg | 1 | n | n | n | |
Sterta | n | n | 1 | 1 | |
Kolejka | n | n | 1 | 1 | |
Lista Powiązana | n | n | 1 | 1 | |
Tablica funkcji mieszanej | - | n | n | n | W wypadku idealnej funkcji skrótu koszt mógłby sie równać O(1) |
Binarne Drzewo Poszukiwań | n | n | n | n | W przypadku zrównoważonych kosztów drzew byłoby O(log(n)) |
B-Drzewo | log(n) | log(n) | log(n) | log(n) | |
Drzewa czerwono-czarne | log(n) | log(n) | log(n) | log(n) | |
AVL Drzewo | log(n) | log(n) | log(n) | log(n) | |
Filtr Blooma | - | 1 | 1 | - | Fałszywe dotatnie są możliwe podczas wyszukiwania |
Nazwa | Najlepszy | Średni | Najgorszy | Pamięć | Stabilność | Komentarze |
---|---|---|---|---|---|---|
Sortowanie bąbelkowe | n | n2 | n2 | 1 | Yes | |
Sortowanie przez wstawianie | n | n2 | n2 | 1 | Yes | |
Sortowanie przez wybieranie | n2 | n2 | n2 | 1 | No | |
Sortowanie przez kopcowanie | n log(n) | n log(n) | n log(n) | 1 | No | |
Sortowanie przez scalanie | n log(n) | n log(n) | n log(n) | n | Yes | |
Szybkie sortowanie | n log(n) | n log(n) | n2 | log(n) | No | Szybkie sortowanie jest zazwyczaj robione w miejsce O(log(n)) stosu przestrzeni |
Sortowanie Shella | n log(n) | zależy od luki w układzie | n (log(n))2 | 1 | No | |
Sortowanie przez zliczanie | n + r | n + r | n + r | n + r | Yes | r - największy numer w tablicy |
Sortowanie Radix | n * k | n * k | n * k | n + k | Yes | k -długość najdłuższego klucza |