24 KiB
Algoritme dan Struktur Data Javascript
Repositori ini berisi contoh-contoh algoritme dan struktur data yang populer menggunakan JavaScript.
Setiap algoritma dan struktur data memiliki README-nya tersendiri dengan penjelasan yang berkaitan dan tautan untuk bacaan lebih lanjut (termasuk tautan menuju video YouTube).
Baca ini dalam bahasa yang lain: English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Українська, Arabic, Tiếng Việt, Deutsch, Uzbek עברית
Struktur Data
Struktur data adalah cara tertentu untuk mengatur dan menyimpan data dalam komputer sehingga dapat diakses dan diubah secara efisien. Lebih tepatnya, struktur data adalah kumpulan dari nilai data, relasi di antara data-data, dan fungsi atau operasi yang dapat diterapkan pada data.
P - Pemula, L - Lanjutan
PSenarai BerantaiPSenarai Berantai GandaPAntreanPTumpukanPTabel HashPHeap - versi heap maksimum dan minimumPAntrean PrioritasLTrieLPohonLPohon Telusur BinerLAVL TreeLPohon Merah HitamLSegment Tree - dengan contoh min/max/sum range queryLPohon Fenwick (Binary Indexed Tree)
LGraf (directed dan undirected)LDisjoint SetLBloom Filter
Algoritma
Algoritma adalah sebuah perincian yang jelas tentang cara untuk memecahkan suatu masalah. Ia adalah sekumpulan aturan yang menjelaskan secara tepat urutan-urutan dari sebuah operasi.
P - Pemula, L - Lanjutan
Algoritma Berdasarkanan Topik
- Matematika
PManipulasi Bit - menetapkan/mendapatkan/memperbarui/menghapus bit, perkalian/pembagian dengan angka 2, membuat bilangan negatif dan lain-lain.PFaktorialPBilangan Fibonacci - versi klasik dan bentuk tertutupPFaktor Prima - menemukan faktor prima dan menghitungnya menggunakan teorema Hardy-RamanujanPPengujian Bilangan Prima (metode trial division)PAlgoritma Euclidean - menghitung Faktor Persekutuan Terbesar (FPB)PLeast Common Multiple (LCM)PSieve of Eratosthenes - menemukan semua bilangan prima hingga batas yang ditentukanPIs Power of Two - mengecek apakah sebuah bilangan adalah hasil dari pangkat dua (algoritma naive dan bitwise)PSegitiga PascalPBilangan Kompleks - bilangan kompleks dengan operasi dasarnyaPRadian & Derajat - konversi radian ke derajat dan sebaliknyaPFast PoweringPMetode Horner - evaluasi polinomialLPartisi Bilangan BulatLAkar Pangkat Dua - metode NewtonLAlgoritma π Liu Hui - perkiraan perhitungan π berdasarkan segibanyakLTransformasi Diskrit Fourier - menguraikan fungsi waktu (sinyal) menjadi frekuensi yang menyusunnya
- Himpunan
PProduk Kartesian - hasil dari beberapa himpunanPPengocokan Fisher–Yates - permutasi acak dari sebuah urutan terhinggaLHimpunan Kuasa - semua himpunan bagian dari sebuah himpunanLPermutasi (dengan dan tanpa pengulangan)LKombinasi (dengan dan tanpa pengulangan)LLongest Common Subsequence (LCS)LLongest Increasing SubsequenceLShortest Common Supersequence (SCS)LPermasalahan Knapsack - "0/1" dan yang tidak "dibatasi"LUpalarik Maksimum - "Brute Force" dan "Pemrograman Dinamis" versi KadaneLCombination Sum - menemukan semua kombinasi yang membentuk jumlah tertentu
- String
PJarak Hamming - jumlah posisi di mana ditemukan simbol-simbol yang berbedaLAlgoritma Jarak Levenshtein - edit distance minimum antara dua urutanLAlgoritma Knuth–Morris–Pratt (Algoritma KMP) - pencarian substring (pencocokan pola)LAlgoritma Z - pencarian substring (pencocokan pola)LAlgoritma Rabin Karp - pencarian substringLLongest Common SubstringLPencocokan Ekspresi Reguler
- Pencarian
PPencarian LinierPPencarian Lompat (atau Block Search) - pencarian di larik tersortirPPencarian Biner - pencarian di larik tersortirPPencarian Interpolasi - pencarian di larik tersortir yang terdistribusi seragam
- Penyortiran
PSortir GelembungPSortir SeleksiPSortir SisipanPSortir HeapPSortir GabunganPSortir Cepat - implementasi in-place dan non-in-placePSortir ShellPSortir PerhitunganPSortir Akar
- Senarai Berantai
- Pohon
PPencarian Kedalaman Pertama (DFS)PPencarian Luas Pertama (BFS)
- Graf
PPencarian Kedalaman Pertama (DFS)PPencarian Luas Pertama (BFS)PAlgoritma Kruskal - mencari rentang pohon minimum untuk graf tidak berarah berbobotLAlgoritma Dijkstra - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalLAlgoritma Bellman-Ford - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalLAlgoritma Floyd-Warshall - menemukan jalur terpendek antara semua pasangan sudutLMendeteksi Siklus - untuk graf berarah dan tidak berarah (berdasarkan versi DFS dan Disjoint Set)LALgoritma Prim - mencari rentang pohon minimum untuk graf tidak berarah berbobotLSortir Topologi - metode DFSLPoin Artikulasi - Algoritma Tarjan (berdasarkan DFS)LJembatan - Algoritma berdasarkan DFSLJalur dan Sirkuit Eulerian - Algoritma Fleury - Mengunjungi setiap tepinya tepat satu kaliLSiklus Hamiltonian - mengunjungi setiap sudutnya tepat satu kaliLKomponen yang Terkoneksi dengan Kuat - Algoritma KosarajuLPermasalahan Penjual Keliling - kemungkinan rute terpendek untuk mengunjungi setiap kota dan kembali lagi ke kota asal
- Kriptografi
PPolinomial Hash - fungsi rolling hash berdasarkan polinomialPSandi Caesar - sandi pengganti sederhana
- Pembelajaran Mesin
PNanoNeuron - 7 fungsi JS sederhana yang mengilustrasikan bagaimana mesin-mesin dapat benar-benar belajar (perambatan maju/mundur)
- Tidak Dikategorikan
PMenara HanoiPPerputaran Matriks Persegi - algoritma in-placePPermainan Melompat - runut-balik, pemrograman dinamis (atas ke bawah + bawah ke atas) and contoh-contoh greedyPUnique Paths - runut-balik, pemrograman dinamis and contoh-contoh beradsarkan Segitiga PascalPRain Terraces - permasalahan trapping rain water (versi pemrograman dinamis and brute force)PTangga Rekursif - menghitung jumlah cara untuk mencapai ke atas tangga (4 solusi)LPermainan N-QueenLPermainan Knight's Tour
Algoritma Berdasarkan Paradigma
Paradigma algoritmik adalah sebuah metode atau pendekatan umum yang mendasari desain sebuah tingkatan algoritma. Paradigma algoritmik merupakan abstraksi yang lebih tinggi dari gagasan sebuah algoritma, seperti halnya sebuah algoritma merupakan abstraksi yang lebih tinggi dari sebuah program komputer.
- Brute Force - melihat ke semua kemungkinan dan memilih solusi yang terbaik
PPencarian LinierPRain Terraces - permasalahan trapping rain waterPTangga Rekursif - menghitung jumlah cara untuk mencapai ke atas tanggaLUpalarik MaksimumLPermasalahan Penjual Keliling - kemungkinan rute terpendek untuk mengunjungi setiap kota dan kembali lagi ke kota asalLTransformasi Diskrit Fourier - menguraikan fungsi waktu (sinyal) menjadi frekuensi yang menyusunnya
- Greedy - memilih pilihan terbaik pada saat ini tanpa mempertimbangkan masa yang akan datang
PPermainan MelompatLPermasalahan Knapsack yang Tidak DibatasiLAlgoritma Dijkstra - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalLAlgoritma Prim - mencari rentang pohon minimum untuk graf tidak berarah berbobotLAlgoritma Kruskal - mencari rentang pohon minimum untuk graf tidak berarah berbobot
- Memecah dan Menaklukkan - membagi masalah menjadi bagian-bagian yang kecil, lalu memcahkan bagian-bagian tersebut
PPencarian BinerPMenara HanoiPSegitiga PascalPAlgoritma Euclidean - menghitung Faktor Persekutuan Terbesar (FPB)PSortir GabunganPSortir CepatPPencarian Kedalaman Pertama untuk Pohon (DFS)PPencarian Kedalaman Pertama untuk Graf (DFS)PPermainan MelompatPFast PoweringLPermutasi (dengan dan tanpa pengulangan)LKombinasi (dengan dan tanpa pengulangan)
- Pemrograman Dinamis - membangun sebuah solusi menggunakan upasolusi yang ditemukan sebelumnya
PBilangan FibonacciPPermainan MelompatPUnique PathsPRain Terraces - permasalahan trapping rain waterPTangga Rekursif - menghitung jumlah cara untuk mencapai ke atas tanggaLAlgoritma Jarak Levenshtein - edit distance minimum antara dua urutanLLongest Common Subsquence (LCS)LLongest Common SubstringLLongest Increasing SubsequenceLShortest Common SupersequenceLPermasalahan Knapsack 0/1LPartisi Bilangan BulatLUpalarik MaksimumLAlgoritma Bellman-Ford - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalLAlgoritma Floyd-Warshall - menemukan jalur terpendek antara semua pasangan sudutLPencocokan Ekspresi Reguler
- Runut-balik - sama halnya dengan brute force, algoritma ini mencoba untuk menghasilkan segala kemungkinan solusi, tetapi setiap kali anda menghasilkan solusi selanjutnya, anda akan menguji apakah solusi tersebut memenuhi semua kondisi dan setelah itu baru akan menghasilkan solusi berikutnya. Apabila tidak, maka akan merunut-balik dan mencari solusi di jalur yang berbeda. Biasanya menggunakan lintas DFS dari ruang keadaan.
PPermainan MelompatPUnique PathsPHimpunan Kuasa - semua himpunan bagian dari sebuah himpunanLSiklus Hamiltonian - mengunjungi setiap sudutnya tepat satu kaliLPermainan N-QueenLPermainan Knight's TourLCombination Sum - menemukan semua kombinasi yang membentuk jumlah tertentu
- Mencabang dan Membatasi - digunakan untuk membuang solusi parsial dengan biaya yang lebih besar dari solusi dengan biaya yang terendah yang ditemukan sejauh ini dengan cara mengingat solusi dengan biaya terendah yang ditemukan pada setiap tahap dari pencarian runut-balik dan menggunakan biaya dari solusi dengan biaya terendah sejauh ini sebagai batas bawah pada biaya dari solusi dengan biaya yang paling sedikit untuk permasalahannya. Biasanya menggunakan lintas BFS yang berkombinasi dengan lintas DFS dari pohon ruang keadaan.
Cara menggunakan repositori ini
Meng-install semua dependensi
npm install
Menjalankan ESLint
Anda dapat menjalankannya untuk memeriksa kualitas kode.
npm run lint
Menjalankan semua tes
npm test
Menjalankan tes berdasarkan nama
npm test -- 'LinkedList'
Playground
Anda dapat bermain dengan algoritma dan struktur data di file ./src/playground/playground.js dan menuliskan tesnya di ./src/playground/__test__/playground.test.js.
Lalu, hanya tinggal menjalankan perintah berikut untuk mengetes apakah kode playground anda bekerja sesuai dengan keinginan:
npm test -- 'playground'
Informasi Bermanfaat
Referensi
▶ Algoritma dan Struktur Data di YouTube
Notasi Big O
Notasi Big O digunakan untuk mengklasifikasikan algoritma berdasarkan durasi atau ruang yang dibutuhkan seiring bertambahnya input. Pada grafik dibawah, anda dapat menemukan urutan pertumbuhan yang paling umum dari algoritma yang ditentukan dalam notasi Big O.
Sumber: Big O Cheat Sheet.
Di bawah ini adalah daftar dari beberapa notasi Big O yang sering digunakan dan perbandingan kinerjanya terhadap berbagai ukuran input data.
| Notasi Big O | Komputasi untuk 10 elemen | Komputasi untuk 100 elemen | Komputasi untuk 1000 elemen |
|---|---|---|---|
| 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 |
Kompleksitas Operasi Struktur Data
| Struktur Data | Akses | Pencarian | Penyisipan | Penghapusan | Keterangan |
|---|---|---|---|---|---|
| Array (Larik) | 1 | n | n | n | |
| Stack (Tumpukan) | n | n | 1 | 1 | |
| Queue (Antrean) | n | n | 1 | 1 | |
| Linked List (Senarai Berantai) | n | n | 1 | n | |
| Hash Table | - | n | n | n | Apabila fungsi hash sempurna, biayanya akan menjadi O(1) |
| Binary Search Tree (Pohon Telusur Biner) | n | n | n | n | Apabila pohon seimbang, biayanya akan menjadi O(log(n)) |
| B-Tree | log(n) | log(n) | log(n) | log(n) | |
| Red-Black Tree (Pohon Merah-Hitam) | log(n) | log(n) | log(n) | log(n) | |
| AVL Tree | log(n) | log(n) | log(n) | log(n) | |
| Bloom Filter | - | 1 | 1 | - | Positif palsu dimungkinkan saat pencarian |
Kompleksitas Algoritma Sortir Larik
| Nama | Terbaik | Rata-rata | Terburuk | Memori | Stabil | Keterangan |
|---|---|---|---|---|---|---|
| Bubble sort (Sortir Gelembung) | n | n2 | n2 | 1 | Ya | |
| Insertion sort (Sortir Sisipan) | n | n2 | n2 | 1 | Ya | |
| Selection sort (Sortir Seleksi) | n2 | n2 | n2 | 1 | Tidak | |
| Heap sort (Sortir Heap) | n log(n) | n log(n) | n log(n) | 1 | Tidak | |
| Merge Sort (Sortir Gabungan) | n log(n) | n log(n) | n log(n) | n | Ya | |
| Quick sort (Sortir Cepat) | n log(n) | n log(n) | n2 | log(n) | Tidak | Sortir Cepat biasanya dilakukan secara in-place dengan O(log(n)) ruang tumpukan |
| Shell sort (Sortir Shell) | n log(n) | tergantung pada jarak urutan | n (log(n))2 | 1 | Tidak | |
| Counting sort (Sortir Perhitungan) | n + r | n + r | n + r | n + r | Ya | r - angka terbesar dalam larik |
| Radix sort (Sortir Akar) | n * k | n * k | n * k | n + k | Ya | k - panjang dari kunci terpanjang |
Pendukung Proyek
Anda dapat mendukung proyek ini via ❤️️ GitHub atau ❤️️ Patreon.
Orang-orang yang mendukung proyek ini ∑ = 1
ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev
