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, Русский, Italiana, Bahasa Indonesia, Українська, Arabic
☝ 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
B
Bağlantılı Veri YapısıB
Çift Yönlü Bağlı ListeB
KuyrukB
YığınB
Hash TableB
Heap - max and min heap versionsB
Öncelikli KuyrukA
TrieA
AğaçA
İkili Arama AğaçlarıA
AVL TreeA
Red-Black TreeA
Segment Tree - with min/max/sum range queries examplesA
Fenwick Tree (Binary Indexed Tree)
A
Graph (both directed and undirected)A
Disjoint SetA
Bloom 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
B
Bit Manipülasyonu - set/get/update/clear bits, multiplication/division by two, make negative etc.B
FaktöriyelB
Fibonacci Sayısı - klasik ve kapalı-form versiyonlarıB
Asallık Testi (trial division method)B
Öklid Algoritması - En büyük ortak bölen hesaplama (EBOB)B
En küçük Ortak Kat (EKOK)B
Sieve of Eratosthenes - belirli bir sayıya kadarki asal sayıları bulmaB
Is Power of Two - sayı ikinin katı mı sorgusu (naive ve bitwise algoritmaları)B
Paskal ÜçgeniB
Karmaşık Sayılar - karmaşık sayılar ve bunlarla temel işlemlerB
Radyan & Derece - radyandan dereceye çeviri ve tersiB
Fast PoweringA
Tamsayı BölümüA
Karekök - Newton yöntemiA
Liu Hui π Algoritması - N-gons'a göre yaklaşık π hesabıA
Ayrık Fourier Dönüşümü - bir zaman fonksiyonunu (bir sinyal) onu oluşturan frekanslara ayırır
- Setler
B
Kartezyen Ürün - product of multiple setsB
Fisher–Yates Shuffle - sonlu bir dizinin rastgele permütasyonuA
Power Set - all subsets of a set (bitwise and backtracking solutions)A
Permütasyonlar(tekrarlı ve tekrarsız)A
Kombinasyonlar (tekrarlı ve tekrarsız)A
En Uzun Ortak Altdizi (LCS)A
En Uzun Artan AltdiziA
En Kısa Ortak Üst Sıra (SCS)A
Knapsack Problem - "0/1" and "Unbound" onesA
Maksimum Altdizi - "Brute Force" ve "Dinamik Programlara" (Kadane'nin) versiyonuA
Kombinasyon Toplamı - belirli toplamı oluşturan tüm kombinasyonları bulun
- Metin
B
Hamming Mesafesi - sembollerin farklı olduğu konumların sayısıA
Levenshtein Mesafesi - iki sekans arasındaki minimum düzenleme mesafesiA
Knuth–Morris–Pratt Algoritması (KMP Algorithm) - substring search (pattern matching)A
Z Algoritması - altmetin araması (desen eşleştirme)A
Rabin Karp Algoritması - altmetin aramasıA
En Uzun Ortak Alt MetinA
Regular Expression Eşleme
- Aramalar
B
Doğrusal AramaB
Jump Search (ya da Block Search) - sıralı dizide araB
İkili Arama - sıralı dizide araB
Interpolation Search - tekdüze dağıtılmış sıralı dizide arama
- Sıralama
B
Bubble SortB
Selection SortB
Insertion SortB
Heap SortB
Merge SortB
Quicksort - in-place and non-in-place implementationsB
ShellsortB
Counting SortB
Radix Sort
- Bağlantılı Liste
- Ağaçlar
B
Depth-First Search (DFS)B
Breadth-First Search (BFS)
- Graphs
B
Depth-First Search (DFS)B
Breadth-First Search (BFS)B
Kruskal’s Algorithm - ağırlıklı yönlendirilmemiş grafik için Minimum Yayılma Ağacı'nı (MST) bulmaA
Dijkstra Algorithm - tek tepe noktasından tüm grafik köşelerine en kısa yolları bulmakA
Bellman-Ford Algorithm - tek tepe noktasından tüm grafik köşelerine en kısa yolları bulmakA
Floyd-Warshall Algorithm - tüm köşe çiftleri arasındaki en kısa yolları bulunA
Detect Cycle - hem yönlendirilmiş hem de yönlendirilmemiş grafikler için (DFS ve Ayrık Küme tabanlı sürümler)A
Prim’s Algorithm - ağırlıklı yönlendirilmemiş grafik için Minimum Yayılma Ağacı'nı (MST) bulmaA
Topological Sorting - DFS metoduA
Articulation Points - Tarjan's algoritması (DFS based)A
Bridges - DFS yöntemi ile algoritmaA
Eulerian Path and Eulerian Circuit - Fleury'nin algoritması - Her kenara tam olarak bir kez ulaşA
Hamiltonian Cycle - Her köşeyi tam olarak bir kez ziyaret etA
Strongly Connected Components - Kosaraju's algorithmA
Travelling Salesman Problem - her şehri ziyaret eden ve başlangıç şehrine geri dönen mümkün olan en kısa rota
- Kriptografi
B
Polynomial Hash - polinom temelinde dönen hash işleviB
Caesar Cipher - simple substitution cipher
- Makine Öğrenmesi
B
NanoNeuron - 7 simple JS functions that illustrate how machines can actually learn (forward/backward propagation)
- Kategoriye Ayrılmayanlar
B
Tower of HanoiB
Square Matrix Rotation - in-place algorithmB
Jump Game - backtracking, dynamic programming (top-down + bottom-up) and greedy examplesB
Unique Paths - backtracking, dynamic programming and Pascal's Triangle based examplesB
Rain Terraces - trapping rain water problem (dynamic programming and brute force versions)B
Recursive Staircase - tepeye ulaşmanın yollarını sayma (4 çözüm)A
N-Queens ProblemA
Knight'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ç
B
Doğrusal AramaB
Rain Terraces - trapping rain water problemB
Recursive Staircase - tepeye çıkmanın yollarını hesaplaA
Maximum SubarrayA
Travelling Salesman Problem - her şehri ziyaret eden ve başlangıç şehrine geri dönen mümkün olan en kısa rotaA
Discrete 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
B
Jump GameA
Unbound Knapsack ProblemA
Dijkstra Algorithm - tüm grafik köşelerine giden en kısa yolu bulmakA
Prim’s Algorithm - ağırlıklı yönlendirilmemiş grafik için Minimum Yayılma Ağacı'nı (MST) bulmaA
Kruskal’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
B
Binary SearchB
Tower of HanoiB
Pascal's TriangleB
Euclidean Algorithm - calculate the Greatest Common Divisor (GCD)B
Merge SortB
QuicksortB
Tree Depth-First Search (DFS)B
Graph Depth-First Search (DFS)B
Jump GameB
Fast PoweringA
Permutations (tekrarlı ve tekrarsız)A
Combinations (tekrarlı ve tekrarsız)
- Dinamik Programlama - önceden bulunan alt çözümleri kullanarak bir çözüm oluşturmak
B
Fibonacci SayısıB
Jump GameB
Eşsiz YolB
Rain Terraces - trapping rain water problemB
Recursive Staircase - zirveye ulaşmanın yollarının sayısını sayınA
Levenshtein Distance - iki sekans arasındaki minimum düzenleme mesafesiA
Longest Common Subsequence (LCS)A
Longest Common SubstringA
Longest Increasing SubsequenceA
Shortest Common SupersequenceA
0/1 Knapsack ProblemA
Integer PartitionA
Maximum SubarrayA
Bellman-Ford Algorithm - tüm grafik köşelerine giden en kısa yolu bulmakA
Floyd-Warshall Algorithm - tüm köşe çiftleri arasındaki en kısa yolları bulunA
Regular 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.
B
Jump GameB
Unique PathsB
Power Set - all subsets of a setA
Hamiltonian Cycle - Her köşeyi tam olarak bir kez ziyaret edinA
N-Queens ProblemA
Knight's TourA
Combination 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.