21 KiB
JavaScript Algoritmalar ve Veri Yapıları
Bu repository JavaScript'e ait popüler algoritma ve veri yapılarını içermektedir.
Her bir algoritma ve veri yapısı kendine ait açıklama ve videoya sahip README dosyası içerir.
Read this in other languages: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português
☝ Not, bu proje araştırma ve öğrenme amacı ile yapılmış olup üretim için yaplılmamıştır.
Veri Yapıları
Bir veri yapısı, verileri bir bilgisayarda organize etmenin ve depolamanın belirli bir yoludur, böylece verimli bir şekilde erişilebilir ve değiştirilebilir. Daha doğrusu, bir veri yapısı bir veri koleksiyonudur, aralarındaki ilişkiler, ve işlevler veya işlemler veriye uygulanabilir.
B - Başlangıç, A - İleri Seviye
BBağlantılı Veri YapısıBÇift Yönlü Bağlı ListeBKuyrukBYığınBHash TableBHeap - max and min heap versionsBÖncelikli KuyrukATrieAAğaçAİkili Arama AğaçlarıAAVL TreeARed-Black TreeASegment Tree - with min/max/sum range queries examplesAFenwick Tree (Binary Indexed Tree)
AGraph (both directed and undirected)ADisjoint SetABloom Filter
Algoritmalar
Bir algoritma, bir problem sınıfının nasıl çözüleceğine dair kesin bir tanımlamadır. Bu bir işlem dizisini kesin olarak tanımlayan bir dizi kural.
B - Başlangıç, A - İleri Seviye
Konusuna göre Algoritma
- Matematik
BBit Manipülasyonu - set/get/update/clear bits, multiplication/division by two, make negative etc.BFaktöriyelBFibonacci Sayısı - klasik ve kapalı-form versiyonlarıBAsallık Testi (trial division method)BÖklid Algoritması - En büyük ortak bölen hesaplama (EBOB)BEn küçük Ortak Kat (EKOK)BSieve of Eratosthenes - belirli bir sayıya kadarki asal sayıları bulmaBIs Power of Two - sayı ikinin katı mı sorgusu (naive ve bitwise algoritmaları)BPaskal ÜçgeniBKarmaşık Sayılar - karmaşık sayılar ve bunlarla temel işlemlerBRadyan & Derece - radyandan dereceye çeviri ve tersiBFast PoweringATamsayı BölümüAKarekök - Newton yöntemiALiu Hui π Algoritması - N-gons'a göre yaklaşık π hesabıAAyrık Fourier Dönüşümü - bir zaman fonksiyonunu (bir sinyal) onu oluşturan frekanslara ayırır
- Setler
BKartezyen Ürün - product of multiple setsBFisher–Yates Shuffle - sonlu bir dizinin rastgele permütasyonuAPower Set - all subsets of a set (bitwise and backtracking solutions)APermütasyonlar(tekrarlı ve tekrarsız)AKombinasyonlar (tekrarlı ve tekrarsız)AEn Uzun Ortak Altdizi (LCS)AEn Uzun Artan AltdiziAEn Kısa Ortak Üst Sıra (SCS)AKnapsack Problem - "0/1" and "Unbound" onesAMaksimum Altdizi - "Brute Force" ve "Dinamik Programlara" (Kadane'nin) versiyonuAKombinasyon Toplamı - belirli toplamı oluşturan tüm kombinasyonları bulun
- Metin
BHamming Mesafesi - sembollerin farklı olduğu konumların sayısıALevenshtein Mesafesi - iki sekans arasındaki minimum düzenleme mesafesiAKnuth–Morris–Pratt Algoritması (KMP Algorithm) - substring search (pattern matching)AZ Algoritması - altmetin araması (desen eşleştirme)ARabin Karp Algoritması - altmetin aramasıAEn Uzun Ortak Alt MetinARegular Expression Eşleme
- Aramalar
BDoğrusal AramaBJump Search (ya da Block Search) - sıralı dizide araBİkili Arama - sıralı dizide araBInterpolation Search - tekdüze dağıtılmış sıralı dizide arama
- Sıralama
BBubble SortBSelection SortBInsertion SortBHeap SortBMerge SortBQuicksort - in-place and non-in-place implementationsBShellsortBCounting SortBRadix Sort
- Bağlantılı Liste
- Ağaçlar
BDepth-First Search (DFS)BBreadth-First Search (BFS)
- Graphs
BDepth-First Search (DFS)BBreadth-First Search (BFS)BKruskal’s Algorithm - ağırlıklı yönlendirilmemiş grafik için Minimum Yayılma Ağacı'nı (MST) bulmaADijkstra Algorithm - tek tepe noktasından tüm grafik köşelerine en kısa yolları bulmakABellman-Ford Algorithm - tek tepe noktasından tüm grafik köşelerine en kısa yolları bulmakAFloyd-Warshall Algorithm - tüm köşe çiftleri arasındaki en kısa yolları bulunADetect Cycle - hem yönlendirilmiş hem de yönlendirilmemiş grafikler için (DFS ve Ayrık Küme tabanlı sürümler)APrim’s Algorithm - ağırlıklı yönlendirilmemiş grafik için Minimum Yayılma Ağacı'nı (MST) bulmaATopological Sorting - DFS metoduAArticulation Points - Tarjan's algoritması (DFS based)ABridges - DFS yöntemi ile algoritmaAEulerian Path and Eulerian Circuit - Fleury'nin algoritması - Her kenara tam olarak bir kez ulaşAHamiltonian Cycle - Her köşeyi tam olarak bir kez ziyaret etAStrongly Connected Components - Kosaraju's algorithmATravelling Salesman Problem - her şehri ziyaret eden ve başlangıç şehrine geri dönen mümkün olan en kısa rota
- Kriptografi
BPolynomial Hash - polinom temelinde dönen hash işleviBCaesar Cipher - simple substitution cipher
- Makine Öğrenmesi
BNanoNeuron - 7 simple JS functions that illustrate how machines can actually learn (forward/backward propagation)
- Kategoriye Ayrılmayanlar
BTower of HanoiBSquare Matrix Rotation - in-place algorithmBJump Game - backtracking, dynamic programming (top-down + bottom-up) and greedy examplesBUnique Paths - backtracking, dynamic programming and Pascal's Triangle based examplesBRain Terraces - trapping rain water problem (dynamic programming and brute force versions)BRecursive Staircase - tepeye ulaşmanın yollarını sayma (4 çözüm)AN-Queens ProblemAKnight's Tour
Algoritmik Paradigma
Algoritmik paradigma, bir sınıfın tasarımının altında yatan genel bir yöntem veya yaklaşımdır. Algoritma dizayn tekniği olarak düşünülebilir. Her bir altproblemi (subproblem) asıl problemle benzerlik gösteren problemlere uygulanabilir.
- Brute Force - mümkün olan tüm çözümleri tara ve en iyisini seç
BDoğrusal AramaBRain Terraces - trapping rain water problemBRecursive Staircase - tepeye çıkmanın yollarını hesaplaAMaximum SubarrayATravelling Salesman Problem - her şehri ziyaret eden ve başlangıç şehrine geri dönen mümkün olan en kısa rotaADiscrete Fourier Transform - bir zaman fonksiyonunu (bir sinyal) onu oluşturan frekanslara ayırır
- Açgözlü - geleceği düşünmeden şu an için en iyi seçeneği seçin
BJump GameAUnbound Knapsack ProblemADijkstra Algorithm - tüm grafik köşelerine giden en kısa yolu bulmakAPrim’s Algorithm - ağırlıklı yönlendirilmemiş grafik için Minimum Yayılma Ağacı'nı (MST) bulmaAKruskal’s Algorithm - ağırlıklı yönlendirilmemiş grafik için Minimum Yayılma Ağacı'nı (MST) bulma
- Böl ve Fethet - sorunu daha küçük parçalara bölün ve sonra bu parçaları çözün
BBinary SearchBTower of HanoiBPascal's TriangleBEuclidean Algorithm - calculate the Greatest Common Divisor (GCD)BMerge SortBQuicksortBTree Depth-First Search (DFS)BGraph Depth-First Search (DFS)BJump GameBFast PoweringAPermutations (tekrarlı ve tekrarsız)ACombinations (tekrarlı ve tekrarsız)
- Dinamik Programlama - önceden bulunan alt çözümleri kullanarak bir çözüm oluşturmak
BFibonacci SayısıBJump GameBEşsiz YolBRain Terraces - trapping rain water problemBRecursive Staircase - zirveye ulaşmanın yollarının sayısını sayınALevenshtein Distance - iki sekans arasındaki minimum düzenleme mesafesiALongest Common Subsequence (LCS)ALongest Common SubstringALongest Increasing SubsequenceAShortest Common SupersequenceA0/1 Knapsack ProblemAInteger PartitionAMaximum SubarrayABellman-Ford Algorithm - tüm grafik köşelerine giden en kısa yolu bulmakAFloyd-Warshall Algorithm - tüm köşe çiftleri arasındaki en kısa yolları bulunARegular Expression Matching
- Backtracking - brute forceye benzer, mümkün tüm sonuçları tara, ancak bir sonraki çözümü her ürettiğinizde test edersiniz
tüm koşulları karşılıyorsa ve ancak o zaman sonraki çözümleri üretmeye devam edin. Aksi takdirde, geri dönün ve farklı bir çözüm arayın(?).
Normally the DFS traversal of state-space is being used.
BJump GameBUnique PathsBPower Set - all subsets of a setAHamiltonian Cycle - Her köşeyi tam olarak bir kez ziyaret edinAN-Queens ProblemAKnight's TourACombination Sum - belirli toplamı oluşturan tüm kombinasyonları bulun
- Branch & Bound - remember the lowest-cost solution found at each stage of the backtracking search, and use the cost of the lowest-cost solution found so far as a lower bound on the cost of a least-cost solution to the problem, in order to discard partial solutions with costs larger than the lowest-cost solution found so far. Normally BFS traversal in combination with DFS traversal of state-space tree is being used.
Repository'in Kullanımı
Bütün dependencyleri kurun
npm install
ESLint'i başlatın
Bunu kodun kalitesini kontrol etmek amacı ile çalıştırabilirsin.
npm run lint
Bütün testleri çalıştır
npm test
Testleri ismine göre çalıştır
npm test -- 'LinkedList'
Deneme Alanı
data-structures ve algorithms içerisinde ./src/playground/playground.js
yazarak ./src/playground/__test__/playground.test.js için test edebilirsin.
Ardından basitçe alttaki komutu girerek kodunun beklendiği gibi çalışıp çalışmadığını test edebilirsin:
npm test -- 'playground'
Yararlı Bilgiler
Referanslar
▶ Data Structures and Algorithms on YouTube
Big O Notation
- Big O notation *, algoritmaları, giriş boyutu büyüdükçe çalışma süresi veya alan gereksinimlerinin nasıl arttığına göre sınıflandırmak için kullanılır. Aşağıdaki grafikte, Big O gösteriminde belirtilen algoritmaların en yaygın büyüme sıralarını bulabilirsiniz.
Kaynak: Big O Cheat Sheet.
Altta Big O notations ve farklı input boyutlarına karşın yapılmış performans karşılaştırması listelenmektedir.
| Big O Notation | 10 Element için hesaplama | 100 Element için hesaplama | 1000 Element için hesaplama |
|---|---|---|---|
| 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 |
Veri Yapısı İşlem Karmaşıklığı
| Veri Yapısı | Access | Search | Insertion | Deletion | Comments |
|---|---|---|---|---|---|
| Dizi | 1 | n | n | n | |
| Yığın | n | n | 1 | 1 | |
| Sıralı | n | n | 1 | 1 | |
| Bağlantılı Liste | n | n | 1 | n | |
| Yığın Tablo | - | n | n | n | Kusursuz hash fonksiyonu durumunda sonuç O(1) |
| İkili Arama Ağacı | n | n | n | n | In case of balanced tree costs would be O(log(n)) |
| B-Tree | log(n) | log(n) | log(n) | log(n) | |
| Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
| AVL Tree | log(n) | log(n) | log(n) | log(n) | |
| Bloom Filter | - | 1 | 1 | - | Arama esnasında yanlış sonuçlar çıkabilir |
Dizi Sıralama Algoritmaları Karmaşıklığı
| İsim | En İyi | Ortalama | En Kötü | Hafıza | Kararlı | Yorumlar |
|---|---|---|---|---|---|---|
| Bubble sort | n | n2 | n2 | 1 | Evet | |
| Insertion sort | n | n2 | n2 | 1 | Evet | |
| Selection sort | n2 | n2 | n2 | 1 | Hayır | |
| Heap sort | n log(n) | n log(n) | n log(n) | 1 | Hayır | |
| Merge sort | n log(n) | n log(n) | n log(n) | n | Evet | |
| Quick sort | n log(n) | n log(n) | n2 | log(n) | Hayır | Hızlı sıralama genellikle O(log(n)) yığın alanıyla yapılır |
| Shell sort | n log(n) | depends on gap sequence | n (log(n))2 | 1 | Hayır | |
| Counting sort | n + r | n + r | n + r | n + r | Evet | r - dizideki en büyük sayı |
| Radix sort | n * k | n * k | n * k | n + k | Evet | k - en uzun key'in uzunluğu |
Projeyi Destekleme
Bu projeyi buradan destekleyebilirsiniz ❤️️ GitHub veya ❤️️ Patreon.
