README.id-ID.md
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 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
P Senarai BerantaiP Senarai Berantai GandaP AntreanP TumpukanP Tabel HashP Heap - versi heap maksimum dan minimumP Antrean PrioritasL TrieL Pohon
L Pohon Telusur BinerL AVL TreeL Pohon Merah HitamL Segment Tree - dengan contoh min/max/sum range queryL Pohon Fenwick (Binary Indexed Tree)L Graf (directed dan undirected)L Disjoint SetL Bloom FilterAlgoritma 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
P Manipulasi Bit - menetapkan/mendapatkan/memperbarui/menghapus bit, perkalian/pembagian dengan angka 2, membuat bilangan negatif dan lain-lain.P FaktorialP Bilangan Fibonacci - versi klasik dan bentuk tertutupP Faktor Prima - menemukan faktor prima dan menghitungnya menggunakan teorema Hardy-RamanujanP Pengujian Bilangan Prima (metode trial division)P Algoritma Euclidean - menghitung Faktor Persekutuan Terbesar (FPB)P Least Common Multiple (LCM)P Sieve of Eratosthenes - menemukan semua bilangan prima hingga batas yang ditentukanP Is Power of Two - mengecek apakah sebuah bilangan adalah hasil dari pangkat dua (algoritma naive dan bitwise)P Segitiga PascalP Bilangan Kompleks - bilangan kompleks dengan operasi dasarnyaP Radian & Derajat - konversi radian ke derajat dan sebaliknyaP Fast PoweringP Metode Horner - evaluasi polinomialL Partisi Bilangan BulatL Akar Pangkat Dua - metode NewtonL Algoritma π Liu Hui - perkiraan perhitungan π berdasarkan segibanyakL Transformasi Diskrit Fourier - menguraikan fungsi waktu (sinyal) menjadi frekuensi yang menyusunnyaP Produk Kartesian - hasil dari beberapa himpunanP Pengocokan Fisher–Yates - permutasi acak dari sebuah urutan terhinggaL Himpunan Kuasa - semua himpunan bagian dari sebuah himpunanL Permutasi (dengan dan tanpa pengulangan)L Kombinasi (dengan dan tanpa pengulangan)L Longest Common Subsequence (LCS)L Longest Increasing SubsequenceL Shortest Common Supersequence (SCS)L Permasalahan Knapsack - "0/1" dan yang tidak "dibatasi"L Upalarik Maksimum - "Brute Force" dan "Pemrograman Dinamis" versi KadaneL Combination Sum - menemukan semua kombinasi yang membentuk jumlah tertentuP Jarak Hamming - jumlah posisi di mana ditemukan simbol-simbol yang berbedaL Algoritma Jarak Levenshtein - edit distance minimum antara dua urutanL Algoritma Knuth–Morris–Pratt (Algoritma KMP) - pencarian substring (pencocokan pola)L Algoritma Z - pencarian substring (pencocokan pola)L Algoritma Rabin Karp - pencarian substringL Longest Common SubstringL Pencocokan Ekspresi RegulerP Pencarian LinierP Pencarian Lompat (atau Block Search) - pencarian di larik tersortirP Pencarian Biner - pencarian di larik tersortirP Pencarian Interpolasi - pencarian di larik tersortir yang terdistribusi seragamP Sortir GelembungP Sortir SeleksiP Sortir SisipanP Sortir HeapP Sortir GabunganP Sortir Cepat - implementasi in-place dan non-in-placeP Sortir ShellP Sortir PerhitunganP Sortir AkarP Pencarian Kedalaman Pertama (DFS)P Pencarian Luas Pertama (BFS)P Pencarian Kedalaman Pertama (DFS)P Pencarian Luas Pertama (BFS)P Algoritma Kruskal - mencari rentang pohon minimum untuk graf tidak berarah berbobotL Algoritma Dijkstra - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalL Algoritma Bellman-Ford - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalL Algoritma Floyd-Warshall - menemukan jalur terpendek antara semua pasangan sudutL Mendeteksi Siklus - untuk graf berarah dan tidak berarah (berdasarkan versi DFS dan Disjoint Set)L ALgoritma Prim - mencari rentang pohon minimum untuk graf tidak berarah berbobotL Sortir Topologi - metode DFSL Poin Artikulasi - Algoritma Tarjan (berdasarkan DFS)L Jembatan - Algoritma berdasarkan DFSL Jalur dan Sirkuit Eulerian - Algoritma Fleury - Mengunjungi setiap tepinya tepat satu kaliL Siklus Hamiltonian - mengunjungi setiap sudutnya tepat satu kaliL Komponen yang Terkoneksi dengan Kuat - Algoritma KosarajuL Permasalahan Penjual Keliling - kemungkinan rute terpendek untuk mengunjungi setiap kota dan kembali lagi ke kota asalP Polinomial Hash - fungsi rolling hash berdasarkan polinomialP Sandi Caesar - sandi pengganti sederhanaP NanoNeuron - 7 fungsi JS sederhana yang mengilustrasikan bagaimana mesin-mesin dapat benar-benar belajar (perambatan maju/mundur)P Menara HanoiP Perputaran Matriks Persegi - algoritma in-placeP Permainan Melompat - runut-balik, pemrograman dinamis (atas ke bawah + bawah ke atas) and contoh-contoh greedyP Unique Paths - runut-balik, pemrograman dinamis and contoh-contoh beradsarkan Segitiga PascalP Rain Terraces - permasalahan trapping rain water (versi pemrograman dinamis and brute force)P Tangga Rekursif - menghitung jumlah cara untuk mencapai ke atas tangga (4 solusi)L Permainan N-QueenL Permainan Knight's TourParadigma 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.
P Pencarian LinierP Rain Terraces - permasalahan trapping rain waterP Tangga Rekursif - menghitung jumlah cara untuk mencapai ke atas tanggaL Upalarik MaksimumL Permasalahan Penjual Keliling - kemungkinan rute terpendek untuk mengunjungi setiap kota dan kembali lagi ke kota asalL Transformasi Diskrit Fourier - menguraikan fungsi waktu (sinyal) menjadi frekuensi yang menyusunnyaP Permainan MelompatL Permasalahan Knapsack yang Tidak DibatasiL Algoritma Dijkstra - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalL Algoritma Prim - mencari rentang pohon minimum untuk graf tidak berarah berbobotL Algoritma Kruskal - mencari rentang pohon minimum untuk graf tidak berarah berbobotP Pencarian BinerP Menara HanoiP Segitiga PascalP Algoritma Euclidean - menghitung Faktor Persekutuan Terbesar (FPB)P Sortir GabunganP Sortir CepatP Pencarian Kedalaman Pertama untuk Pohon (DFS)P Pencarian Kedalaman Pertama untuk Graf (DFS)P Permainan MelompatP Fast PoweringL Permutasi (dengan dan tanpa pengulangan)L Kombinasi (dengan dan tanpa pengulangan)P Bilangan FibonacciP Permainan MelompatP Unique PathsP Rain Terraces - permasalahan trapping rain waterP Tangga Rekursif - menghitung jumlah cara untuk mencapai ke atas tanggaL Algoritma Jarak Levenshtein - edit distance minimum antara dua urutanL Longest Common Subsquence (LCS)L Longest Common SubstringL Longest Increasing SubsequenceL Shortest Common SupersequenceL Permasalahan Knapsack 0/1L Partisi Bilangan BulatL Upalarik MaksimumL Algoritma Bellman-Ford - menemukan jalur terpendek ke semua sudut graf dari sudut tunggalL Algoritma Floyd-Warshall - menemukan jalur terpendek antara semua pasangan sudutL Pencocokan Ekspresi RegulerP Permainan MelompatP Unique PathsP Himpunan Kuasa - semua himpunan bagian dari sebuah himpunanL Siklus Hamiltonian - mengunjungi setiap sudutnya tepat satu kaliL Permainan N-QueenL Permainan Knight's TourL Combination Sum - menemukan semua kombinasi yang membentuk jumlah tertentuMeng-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'
▶ Algoritma dan Struktur Data di YouTube
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 |
| 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 |
| Nama | Terbaik | Rata-rata | Terburuk | Memori | Stabil | Keterangan |
|---|---|---|---|---|---|---|
| Bubble sort (Sortir Gelembung) | n | n<sup>2</sup> | n<sup>2</sup> | 1 | Ya | |
| Insertion sort (Sortir Sisipan) | n | n<sup>2</sup> | n<sup>2</sup> | 1 | Ya | |
| Selection sort (Sortir Seleksi) | n<sup>2</sup> | n<sup>2</sup> | n<sup>2</sup> | 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) | n<sup>2</sup> | 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))<sup>2</sup> | 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 |
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