23 KiB
Algoritma JavaScript dan Struktur Data
🇺🇦 UKRAINE SEDANG DISERANG OLEH TENTERA RUSIA. ORANG AWAM SEMAKIN DIBUNUH. KAWASAN KEDIAMAN SEMAKIN DIBOM.
- Bantu Ukraine melalui Bank Negara Ukraine
- Bantu Ukraine melalui dana SaveLife
- Maklumat lanjut tentang war.ukraine.ua
[](https://github.com/trekhleb/javascript-algorithms/actions?query=workflow% 3ACI+cawangan%3Amaster)
Repositori ini mengandungi banyak contoh berasaskan JavaScript algoritma dan struktur data yang popular.
Setiap algoritma dan struktur data mempunyai README tersendiri dengan penjelasan dan pautan berkaitan untuk bacaan lanjut (termasuk yang kepada video YouTube).
Baca ini dalam bahasa lain: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Bahasa Indonesia, Українська, Arab, Tiếng Việt, Deutsch
☝ Ambil perhatian bahawa projek ini bertujuan untuk digunakan untuk tujuan pembelajaran dan penyelidikan sahaja, dan ia tidak bertujuan untuk digunakan untuk pengeluaran.
Struktur Data
Struktur data ialah cara tertentu untuk mengatur dan menyimpan data dalam komputer supaya ia boleh boleh diakses dan diubah suai dengan cekap. Lebih tepat lagi, struktur data ialah himpunan data nilai, hubungan di antara mereka, dan fungsi atau operasi yang boleh digunakan data itu.
B
- Pemula, A
- Lanjutan
B
Senarai TerpautB
Senarai Terpaut BergandaB
[Barisan](src/struktur-data/baris gilir)B
TimbunanB
[Jadual Hash](src/struktur-data/jadual cincang)B
Timbunan - versi timbunan maks dan minB
[Baris Keutamaan](src/struktur-data/baris gilir keutamaan)A
TrieA
PokokA
Pokok Carian PerduaanA
AVL TreeA
Pokok Merah-HitamA
Pokok Segmen - dengan contoh pertanyaan julat min/maks/jumlahA
Pokok Fenwick (Pokok Berindeks Perduaan)
A
Graf (kedua-dua terarah dan tidak terarah)A
Set TerpisahA
Bloom Filter
Algoritma
Algoritma ialah spesifikasi yang tidak jelas tentang cara menyelesaikan kelas masalah. Ia adalah satu set peraturan yang mentakrifkan dengan tepat urutan operasi.
B
- Pemula, A
- Lanjutan
Algoritma mengikut Topik
- Matematik
B
Manipulasi Bit - set/dapatkan/kemas kini/kosongkan bit, darab/bahagi dengan dua, jadikan negatif dsb.B
[Titik Terapung Perduaan](src/algoritma/matematik/titik terapung binari) - perwakilan binari nombor titik terapung.B
FactorialB
Nombor Fibonacci - versi klasik dan bentuk tertutupB
Faktor Perdana - mencari faktor perdana dan mengiranya menggunakan teorem Hardy-RamanujanB
Ujian Primaliti (kaedah pembahagian percubaan)B
Algoritma Euclidean - kira Pembahagi Sepunya Terhebat (GCD)B
Garab Sepunya Terkecil (LCM)B
Ayak Eratosthenes - mencari semua nombor perdana sehingga mana-mana had tertentuB
Adalah Kuasa Dua - semak sama ada nombor itu kuasa dua (algoritma naif dan bitwise)B
Segitiga PascalB
Nombor Kompleks - nombor kompleks dan operasi asas dengannyaB
Radian & Darjah - penukaran radian kepada darjah dan ke belakangB
Fast PoweringB
Kaedah Horner - penilaian polinomialB
Matriks - matriks dan operasi matriks asas (pendaraban, transposisi, dsb.)B
Jarak Euclidean - jarak antara dua titik/vektor/matriksA
Pembahagian IntegerA
Akar Kuasa Dua - Kaedah NewtonA
Algoritma Liu Hui π - anggaran π pengiraan berdasarkan N-gonsA
Transformasi Fourier Diskret - menguraikan fungsi masa (suatu isyarat) kepada frekuensi yang membentuknya
- Set
B
[Produk Cartesian](src/algoritma/set/produk cartesian) - hasil daripada berbilang setB
Fisher–Yates Shuffle - pilih atur rawak bagi urutan terhinggaA
Set Kuasa - semua subset set (penyelesaian bitwise dan backtracking)A
Permutasi (dengan dan tanpa ulangan)A
Gabungan (dengan dan tanpa ulangan)A
Turutan Sepunya Terpanjang (LCS)A
Surutan Bertambah TerpanjangA
Jurutan Sepunya Terpendek (SCS)A
Masalah Knapsack - "0/1" dan "Unbound"A
Maximum Subarray - versi "Brute Force" dan "Dynamic Programming" (Kadane's)A
Jumlah Gabungan - cari semua gabungan yang membentuk jumlah tertentu
- Rentetan
B
[Jarak Hamming](src/algoritma/rentetan/jarak hamming) - bilangan kedudukan di mana simbol berbezaB
Palindrome - semak sama ada rentetan adalah sama secara terbalikA
Jarak Levenshtein - jarak edit minimum antara dua jujukanA
Algoritma Knuth–Morris–Pratt (Algoritma KMP) - carian subrentetan (padanan corak)A
Z Algoritma - carian subrentetan (padanan corak)A
Algoritma Rabin Karp - carian subrentetanA
Subrentetan Biasa TerpanjangA
Padanan Ungkapan Biasa- Carian
B
Carian LinearB
Cari Lompat (atau Carian Sekat) - cari dalam tatasusunan yang diisihB
Carian Binari - cari dalam tatasusunan yang diisihB
Carian Interpolasi - cari dalam tatasusunan tersusun yang diedarkan secara seragam
- Menyusun
B
Isih BuihB
Isih PilihanB
Isih SisipanB
Isih TimbunanB
Isih GabungB
Quicksort - pelaksanaan di tempat dan bukan di tempatB
ShellsortB
Isih MengiraB
Isih Radix
- Senarai Terpaut
- Pokok
B
Depth-First Search (DFS)B
Breadth-First-search (BFS)
- Graf
B
Depth-First Search (DFS)B
Breadth-First Search (BFS)B
Algoritma Kruskal - mencari Pokok Spanning Minimum (MST) untuk graf tidak berwajaranA
Algoritma Dijkstra - mencari laluan terpendek ke semua bucu graf dari bucu tunggalA
Algoritma Bellman-Ford - mencari laluan terpendek ke semua bucu graf daripada bucu tunggalA
Algoritma Floyd-Warshall - cari laluan terpendek antara semua pasangan bucuA
Detect Cycle - untuk kedua-dua graf terarah dan tidak terarah (versi berasaskan DFS dan Disjoint Set)A
Algoritma Prim - mencari Pokok Spanning Minimum (MST) untuk graf tidak berwajaranA
Isih Topologi - Kaedah DFSA
Mata Artikulasi - Algoritma Tarjan (berasaskan DFS)A
Bridges - algoritma berasaskan DFSA
Eulerian Path and Eulerian Circuit - Algoritma Fleury - Lawati setiap tepi tepat sekaliA
Kitaran Hamiltonian - Lawati setiap bucu tepat sekaliA
Komponen Bersambung Kuat - Algoritma KosarajuA
Masalah Jurujual Perjalanan - laluan terpendek mungkin yang melawati setiap bandar dan kembali ke bandar asal
- Kriptografi
B
[Cincangan Polinomial](src/algoritma/kriptografi/cincang polinomial) - fungsi cincang bergolek berdasarkan polinomialB
Sifir Pagar Rel - algoritma sifir transposisi untuk pengekodan mesejB
Caesar Cipher - sifir penggantian mudahB
[Sifir Bukit](src/algoritma/kriptografi/sifir bukit) - sifir penggantian berdasarkan algebra linear
- Pembelajaran Mesin
B
NanoNeuron - 7 fungsi JS mudah yang menggambarkan bagaimana mesin sebenarnya boleh belajar (perambatan ke hadapan/belakang)B
k-NN - algoritma klasifikasi jiran terdekat kB
k-Means - algoritma pengelompokan k-Means
- Pemprosesan imej
B
Ukiran Jahitan - algoritma saiz semula imej sedar kandungan
- Statistik
B
Rawak Berwajaran - pilih item rawak daripada senarai berdasarkan berat item
- Algoritma evolusi
A
Algoritma genetik - contoh cara algoritma genetik boleh digunakan untuk melatih kereta letak sendiri- Tidak dikategorikan
B
[Menara Hanoi](src/algoritma/tidak dikategorikan/menara-hanoi)B
[Putaran Matriks Persegi](src/algoritma/tidak dikategorikan/putaran-matriks-persegi) - algoritma di tempatB
[Permainan Lompat](src/algoritma/tidak dikategorikan/permainan lompat) - menjejak ke belakang, pengaturcaraan dinamik (atas ke bawah + bawah ke atas) dan contoh tamakB
Laluan Unik - penjejakan ke belakang, pengaturcaraan dinamik dan contoh berasaskan Segitiga PascalB
[Teres Hujan](src/algoritma/tidak dikategorikan/teres hujan) - memerangkap masalah air hujan (versi pengaturcaraan dinamik dan kekerasan)B
[Tangga Rekursif](src/algoritma/tidak dikategorikan/tangga rekursif) - kira bilangan cara untuk sampai ke atas (4 penyelesaian)B
[Masa Terbaik Untuk Membeli Saham Jual](src/algoritma/tidak dikategorikan/masa-terbaik-untuk-membeli-menjual-saham) - bahagikan dan takluk serta contoh satu laluanA
Masalah N-QueensA
[Lawatan Kesatria](src/algoritma/tidak dikategorikan/jelajah kesatria)
Algoritma mengikut Paradigma
Paradigma algoritma ialah kaedah atau pendekatan generik yang mendasari reka bentuk kelas daripada algoritma. Ia adalah abstraksi yang lebih tinggi daripada tanggapan algoritma, sama seperti an algoritma adalah abstraksi yang lebih tinggi daripada program komputer.
- Brute Force - lihat semua kemungkinan dan pilih penyelesaian terbaik
B
Carian LinearB
Rain Terraces - memerangkap masalah air hujanB
[Tangga Rekursif](src/algoritma/tak berkategori/tangga rekursif) - kira bilangan cara untuk sampai ke atasA
[Subarray Maksimum](src/algoritma/set/subarray maksimum)A
Masalah Jurujual Perjalanan - laluan terpendek mungkin yang melawati setiap bandar dan kembali ke bandar asalA
Transformasi Fourier Diskret - menguraikan fungsi masa (suatu isyarat) kepada frekuensi yang membentuknya
- Rakus - pilih pilihan terbaik pada masa semasa, tanpa sebarang pertimbangan untuk masa hadapan
B
[Permainan Lompat](src/algoritma/tidak dikategorikan/permainan lompat)A
Masalah Knapsack Tidak TerikatA
Algoritma Dijkstra - mencari laluan terpendek ke semua bucu grafA
Algoritma Prim - mencari Pokok Spanning Minimum (MST) untuk graf tidak berwajaranA
Algoritma Kruskal - mencari Pokok Spanning Minimum (MST) untuk graf tidak berwajaran
- Divide and Conquer - bahagikan masalah kepada bahagian yang lebih kecil dan kemudian selesaikan bahagian tersebut
B
Carian PerduaanB
[Menara Hanoi](src/algoritma/tidak dikategorikan/menara-hanoi)B
Segitiga PascalB
Algoritma Euclidean - kira Pembahagi Sepunya Terhebat (GCD)B
Isih GabungB
Isih PantasB
Carian Kedalaman-Pertama Pokok (DFS)B
Graph Depth-First Search (DFS)B
Matriks - menjana dan melintasi matriks pelbagai bentukB
[Permainan Lompat](src/algoritma/tidak dikategorikan/permainan lompat)B
Fast PoweringB
[Masa Terbaik Untuk Membeli Saham Jual](src/algoritma/tidak dikategorikan/masa-terbaik-untuk-membeli-menjual-saham) - bahagikan dan takluk serta contoh satu laluanA
Permutasi (dengan dan tanpa ulangan)A
Gabungan (dengan dan tanpa ulangan)A
[Subarray Maksimum](src/algoritma/set/subarray maksimum)
- Pengaturcaraan Dinamik - bina penyelesaian menggunakan sub-penyelesaian yang ditemui sebelum ini
-
B
[Permainan Lompat](src/algoritma/tidak dikategorikan/permainan lompat) -
B
[Laluan Unik](src/algoritma/tidak dikategorikan/laluan-unik) -
B
Rain Terraces - memerangkap masalah air hujan -
B
[Tangga Rekursif](src/algoritma/tak berkategori/tangga rekursif) - kira bilangan cara untuk sampai ke atas -
B
Ukiran Jahitan - algoritma saiz semula imej sedar kandungan -
A
Jarak Levenshtein - jarak edit minimum antara dua jujukan -
A
Turutan Sepunya Terpanjang (LCS) -
A
[Subarray Maksimum](src/algoritma/set/subarray maksimum) -
A
Algoritma Bellman-Ford - mencari laluan terpendek ke semua bucu graf -
A
Algoritma Floyd-Warshall - cari laluan terpendek antara semua pasangan bucu
- Penjejakan Belakang - sama seperti kekerasan, cuba jana semua penyelesaian yang mungkin, tetapi setiap kali anda menjana penyelesaian seterusnya anda menguji
jika ia memenuhi semua syarat, dan hanya kemudian terus menjana penyelesaian seterusnya. Jika tidak, mundur, dan teruskan a
jalan yang berbeza untuk mencari penyelesaian. Biasanya traversal DFS bagi ruang keadaan sedang digunakan.
-
B
[Permainan Lompat](src/algoritma/tidak dikategorikan/permainan lompat) -
B
[Laluan Unik](src/algoritma/tidak dikategorikan/laluan-unik) -
B
Set Kuasa - semua subset set -
A
Kitaran Hamiltonian - Lawati setiap bucu tepat sekali -
A
[Lawatan Kesatria](src/algoritma/tidak dikategorikan/jelajah kesatria) -
A
Jumlah Gabungan - cari semua gabungan yang membentuk jumlah tertentu -
Branch & Bound - ingat penyelesaian kos terendah yang terdapat pada setiap peringkat penjejakan ke belakang cari, dan gunakan kos penyelesaian kos terendah yang ditemui setakat ini sebagai had yang lebih rendah pada kos penyelesaian kos termurah untuk masalah, untuk membuang penyelesaian separa dengan kos lebih besar daripada penyelesaian kos terendah ditemui setakat ini. Biasanya traversal BFS digabungkan dengan traversal DFS of state-space pokok sedang digunakan.
-
Cara menggunakan repositori ini
Pasang semua kebergantungan
pemasangan npm
Jalankan ESLint
Anda mungkin mahu menjalankannya untuk menyemak kualiti kod.
npm run lint
Jalankan semua ujian
ujian npm
Jalankan ujian mengikut nama
ujian npm -- 'LinkedList'
Penyelesaian masalah
Jika linting atau ujian gagal, cuba padamkan folder node_modules
dan pasang semula pakej npm:
rm -rf ./node_modules
npm i
Juga pastikan anda menggunakan versi Nod yang betul (>=14.16.0
). Jika anda menggunakan nvm untuk pengurusan versi Nod, anda boleh menjalankan nvm use
daripada folder akar projek dan versi yang betul akan diambil.
Taman permainan
Anda boleh bermain dengan struktur data dan algoritma dalam fail ./src/playground/playground.js
dan tulis
mengujinya dalam ./src/playground/__test__/playground.test.js
.
Kemudian hanya jalankan arahan berikut untuk menguji sama ada kod taman permainan anda berfungsi seperti yang diharapkan:
ujian npm -- 'taman permainan'
Informasi berguna
Rujukan
▶ Struktur Data dan Algoritma di YouTube
Notasi O Besar
Notasi O Besar digunakan untuk mengklasifikasikan algoritma mengikut cara masa berjalan atau keperluan ruang mereka berkembang apabila saiz input bertambah. Pada carta di bawah anda mungkin menemui susunan pertumbuhan algoritma yang paling biasa yang dinyatakan dalam tatatanda Big O.
Sumber: Big O Cheat Sheet.
Di bawah ialah senarai beberapa tatatanda Big O yang paling banyak digunakan dan perbandingan prestasinya terhadap saiz data input yang berbeza.
Notasi O Besar | Taip | Pengiraan untuk 10 elemen | Pengiraan untuk 100 elemen | Pengiraan untuk 1000 elemen |
---|---|---|---|---|
O(1) | Malar | 1 | 1 | 1 |
O(log N) | Logaritma | 3 | 6 | 9 |
O(N) | Linear | 10 | 100 | 1000 |
O(N log N) | n log(n) | 30 | 600 | 9000 |
O(N^2) | Kuadratik | 100 | 10000 | 1000000 |
O(2^N) | Eksponen | 1024 | 1.26e+29 | 1.07e+301 |
O(N!) | Faktorial | 3628800 | 9.3e+157 | 4.02e+2567 |
Kerumitan Operasi Struktur Data
Struktur Data | Akses | Cari | Sisipan | Pemadaman | Komen |
---|---|---|---|---|---|
Array | 1 | n | n | n | |
Timbunan | n | n | 1 | 1 | |
Beratur | n | n | 1 | 1 | |
Senarai Terpaut | n | n | 1 | n | |
Jadual Hash | - | n | n | n | Dalam kes kos fungsi cincang yang sempurna ialah O(1) |
Pokok Carian Binari | n | n | n | n | Dalam kes kos pokok seimbang ialah O(log(n)) |
B-Tree | log(n) | log(n) | log(n) | log(n) | |
Pokok Merah-Hitam | log(n) | log(n) | log(n) | log(n) | |
Pokok AVL | log(n) | log(n) | log(n) | log(n) | |
Penapis Bloom | - | 1 | 1 | - | Positif palsu mungkin semasa mencari |
Kerumitan Algoritma Pengisihan Tatasusunan
Nama | Terbaik | Purata | Paling teruk | Memori | Stabil | Komen |
---|---|---|---|---|---|---|
Isih gelembung | n | n2 | n2 | 1 | Ya | |
Isihan sisipan | n | n2 | n2 | 1 | Ya | |
Isih pilihan | n2 | n2 | n2 | 1 | Tidak | |
Isihan timbunan | n log(n) | n log(n) | n log(n) | 1 | Tidak | |
Isih gabung | n log(n) | n log(n) | n log(n) | n | Ya | |
Isih cepat | n log(n) | n log(n) | n2 | log(n) | Tidak | Quicksort biasanya dilakukan di tempat dengan ruang tindanan O(log(n)) |
Isih cangkerang | n log(n) | bergantung pada jujukan jurang | n (log(n))2 | 1 | Tidak | |
Isih mengira | n + r | n + r | n + r | n + r | Ya | r - nombor terbesar dalam tatasusunan |
Isih Radix | n * k | n * k | n * k | n + k | Ya | k - panjang kunci terpanjang |
Penyokong Projek
Anda boleh menyokong projek ini melalui ❤️️ GitHub atau ❤️️ Patreon.
Orang yang menyokong projek ini ∑ = 0
ℹ️ Beberapa lagi projek dan artikel tentang JavaScript dan algoritma pada [trekhleb.dev](https:/ /trekhleb.dev)