* update-readme * deploy * deploy Co-authored-by: name <your mail> Co-authored-by: Oleksii Trekhleb <trehleb@gmail.com>
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
BSenarai TerpautBSenarai Terpaut BergandaB[Barisan](src/struktur-data/baris gilir)BTimbunanB[Jadual Hash](src/struktur-data/jadual cincang)BTimbunan - versi timbunan maks dan minB[Baris Keutamaan](src/struktur-data/baris gilir keutamaan)ATrieAPokokAPokok Carian PerduaanAAVL TreeAPokok Merah-HitamAPokok Segmen - dengan contoh pertanyaan julat min/maks/jumlahAPokok Fenwick (Pokok Berindeks Perduaan)
AGraf (kedua-dua terarah dan tidak terarah)ASet TerpisahABloom 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
BManipulasi 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.BFactorialBNombor Fibonacci - versi klasik dan bentuk tertutupBFaktor Perdana - mencari faktor perdana dan mengiranya menggunakan teorem Hardy-RamanujanBUjian Primaliti (kaedah pembahagian percubaan)BAlgoritma Euclidean - kira Pembahagi Sepunya Terhebat (GCD)BGarab Sepunya Terkecil (LCM)BAyak Eratosthenes - mencari semua nombor perdana sehingga mana-mana had tertentuBAdalah Kuasa Dua - semak sama ada nombor itu kuasa dua (algoritma naif dan bitwise)BSegitiga PascalBNombor Kompleks - nombor kompleks dan operasi asas dengannyaBRadian & Darjah - penukaran radian kepada darjah dan ke belakangBFast PoweringBKaedah Horner - penilaian polinomialBMatriks - matriks dan operasi matriks asas (pendaraban, transposisi, dsb.)BJarak Euclidean - jarak antara dua titik/vektor/matriksAPembahagian IntegerAAkar Kuasa Dua - Kaedah NewtonAAlgoritma Liu Hui π - anggaran π pengiraan berdasarkan N-gonsATransformasi Fourier Diskret - menguraikan fungsi masa (suatu isyarat) kepada frekuensi yang membentuknya
- Set
B[Produk Cartesian](src/algoritma/set/produk cartesian) - hasil daripada berbilang setBFisher–Yates Shuffle - pilih atur rawak bagi urutan terhinggaASet Kuasa - semua subset set (penyelesaian bitwise dan backtracking)APermutasi (dengan dan tanpa ulangan)AGabungan (dengan dan tanpa ulangan)ATurutan Sepunya Terpanjang (LCS)ASurutan Bertambah TerpanjangAJurutan Sepunya Terpendek (SCS)AMasalah Knapsack - "0/1" dan "Unbound"AMaximum Subarray - versi "Brute Force" dan "Dynamic Programming" (Kadane's)AJumlah Gabungan - cari semua gabungan yang membentuk jumlah tertentu
- Rentetan
B[Jarak Hamming](src/algoritma/rentetan/jarak hamming) - bilangan kedudukan di mana simbol berbezaBPalindrome - semak sama ada rentetan adalah sama secara terbalikAJarak Levenshtein - jarak edit minimum antara dua jujukanAAlgoritma Knuth–Morris–Pratt (Algoritma KMP) - carian subrentetan (padanan corak)AZ Algoritma - carian subrentetan (padanan corak)AAlgoritma Rabin Karp - carian subrentetanASubrentetan Biasa TerpanjangAPadanan Ungkapan Biasa- Carian
BCarian LinearBCari Lompat (atau Carian Sekat) - cari dalam tatasusunan yang diisihBCarian Binari - cari dalam tatasusunan yang diisihBCarian Interpolasi - cari dalam tatasusunan tersusun yang diedarkan secara seragam
- Menyusun
BIsih BuihBIsih PilihanBIsih SisipanBIsih TimbunanBIsih GabungBQuicksort - pelaksanaan di tempat dan bukan di tempatBShellsortBIsih MengiraBIsih Radix
- Senarai Terpaut
- Pokok
BDepth-First Search (DFS)BBreadth-First-search (BFS)
- Graf
BDepth-First Search (DFS)BBreadth-First Search (BFS)BAlgoritma Kruskal - mencari Pokok Spanning Minimum (MST) untuk graf tidak berwajaranAAlgoritma Dijkstra - mencari laluan terpendek ke semua bucu graf dari bucu tunggalAAlgoritma Bellman-Ford - mencari laluan terpendek ke semua bucu graf daripada bucu tunggalAAlgoritma Floyd-Warshall - cari laluan terpendek antara semua pasangan bucuADetect Cycle - untuk kedua-dua graf terarah dan tidak terarah (versi berasaskan DFS dan Disjoint Set)AAlgoritma Prim - mencari Pokok Spanning Minimum (MST) untuk graf tidak berwajaranAIsih Topologi - Kaedah DFSAMata Artikulasi - Algoritma Tarjan (berasaskan DFS)ABridges - algoritma berasaskan DFSAEulerian Path and Eulerian Circuit - Algoritma Fleury - Lawati setiap tepi tepat sekaliAKitaran Hamiltonian - Lawati setiap bucu tepat sekaliAKomponen Bersambung Kuat - Algoritma KosarajuAMasalah 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 polinomialBSifir Pagar Rel - algoritma sifir transposisi untuk pengekodan mesejBCaesar Cipher - sifir penggantian mudahB[Sifir Bukit](src/algoritma/kriptografi/sifir bukit) - sifir penggantian berdasarkan algebra linear
- Pembelajaran Mesin
BNanoNeuron - 7 fungsi JS mudah yang menggambarkan bagaimana mesin sebenarnya boleh belajar (perambatan ke hadapan/belakang)Bk-NN - algoritma klasifikasi jiran terdekat kBk-Means - algoritma pengelompokan k-Means
- Pemprosesan imej
BUkiran Jahitan - algoritma saiz semula imej sedar kandungan
- Statistik
BRawak Berwajaran - pilih item rawak daripada senarai berdasarkan berat item
- Algoritma evolusi
AAlgoritma 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 tamakBLaluan 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 laluanAMasalah 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
BCarian LinearBRain 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)AMasalah Jurujual Perjalanan - laluan terpendek mungkin yang melawati setiap bandar dan kembali ke bandar asalATransformasi 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)AMasalah Knapsack Tidak TerikatAAlgoritma Dijkstra - mencari laluan terpendek ke semua bucu grafAAlgoritma Prim - mencari Pokok Spanning Minimum (MST) untuk graf tidak berwajaranAAlgoritma 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
BCarian PerduaanB[Menara Hanoi](src/algoritma/tidak dikategorikan/menara-hanoi)BSegitiga PascalBAlgoritma Euclidean - kira Pembahagi Sepunya Terhebat (GCD)BIsih GabungBIsih PantasBCarian Kedalaman-Pertama Pokok (DFS)BGraph Depth-First Search (DFS)BMatriks - menjana dan melintasi matriks pelbagai bentukB[Permainan Lompat](src/algoritma/tidak dikategorikan/permainan lompat)BFast PoweringB[Masa Terbaik Untuk Membeli Saham Jual](src/algoritma/tidak dikategorikan/masa-terbaik-untuk-membeli-menjual-saham) - bahagikan dan takluk serta contoh satu laluanAPermutasi (dengan dan tanpa ulangan)AGabungan (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) -
BRain Terraces - memerangkap masalah air hujan -
B[Tangga Rekursif](src/algoritma/tak berkategori/tangga rekursif) - kira bilangan cara untuk sampai ke atas -
BUkiran Jahitan - algoritma saiz semula imej sedar kandungan -
AJarak Levenshtein - jarak edit minimum antara dua jujukan -
ATurutan Sepunya Terpanjang (LCS) -
A[Subarray Maksimum](src/algoritma/set/subarray maksimum) -
AAlgoritma Bellman-Ford - mencari laluan terpendek ke semua bucu graf -
AAlgoritma 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) -
BSet Kuasa - semua subset set -
AKitaran Hamiltonian - Lawati setiap bucu tepat sekali -
A[Lawatan Kesatria](src/algoritma/tidak dikategorikan/jelajah kesatria) -
AJumlah 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)
