Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Balanced Tree'ler: AVL, Red-Black ve Veritabanı Index'lerinin B-Tree'si
Balanced tree, insert sırası ne olursa olsun yüksekliği O(log n) tutar: sıralı 10.000 id'de düz BST'nin yüksekliği 10.000, AVL'ninki 14. C# ile AVL insert ve rotation'ları yazıyor, SortedSet'in red-black tree'sine reflection ile bakıyor, PostgreSQL'de pageinspect ile gerçek bir B+tree index'in seviyelerini ve leaf zincirini inceliyoruz.
Heap ve Priority Queue: C# ile Binary Heap, Heapify, Heap Sort ve Top-K
Heap, en küçük elemanı her zaman tepede tutan ve array'de saklanan bir tree'dir; insert ve en küçüğü çıkarma O(log n), bottom-up build-heap O(n). C# ile BinaryHeap ve heap sort yazıyor, .NET PriorityQueue'nun 4-ary yapısını ve eşit öncelikte FIFO vermediğini gerçek çıktıyla gösteriyor, top-K, k-way merge ve running median örneklerini BenchmarkDotNet ölçümüyle tamamlıyoruz.
Trie: C# ile Autocomplete, Prefix Arama ve Bellek Maliyeti
Trie, key'leri karakter karakter saklayıp bir prefix'i O(m) adımda bulur, ama bellek maliyeti yüksektir: 234.456 kelimede sıralı array 11,7 MB, trie 148,9 MB. C# ile trie ve en iyi N öneri yazıyor, Türkçe İ/ı case folding tuzağını çözüyor, minimal API ve Angular arama kutusu kuruyor, sıralı array, PostgreSQL LIKE ve trie'yi ölçümle karşılaştırıyoruz.
Graph Temelleri: Adjacency List, BFS ve DFS ile Gezinmek
Seyrek graph'lar adjacency list ile tutulur ve BFS en az adımı O(V + E)'de bulur; 5.000 vertex'lik graph'ta adjacency matrix ile BFS 46 kat yavaş. C# ile generic Graph, BFS mesafe ve yol, recursive ve iterative DFS, connected component ve grid flood fill yazıyor; visited'ı queue'dan çıkarırken işaretlemenin 2.000 yerine 2 milyon ekleme yaptığını gerçek çıktıyla gösteriyoruz.
Topological Sort ve Cycle Detection: Bağımlılık Sırası ve Kahn Algoritması
Topological sort, bir DAG'in vertex'lerini her bağımlılık bağımlısından önce gelecek şekilde O(V + E)'de sıralar; Kahn algoritması in-degree ve queue ile, DFS ise üç renkle çalışır. C# ile ikisini yazıyor, seed data ve build sırası üretiyor, cycle yolunu raporluyor, EF Core'un SaveChanges'ta aynı algoritmayı kullandığını ve DI container'ın circular dependency hatasını gerçek çıktıyla gösteriyoruz.
Shortest Path: Dijkstra, PriorityQueue ve A*'a Kısa Bakış
Negatif olmayan ağırlıklı graph'ta en ucuz yolu Dijkstra bulur: PriorityQueue'da decrease-key olmadığı için lazy deletion ile O((V + E) log V). Şehirler arası kargo ağında Dijkstra'yı adım adım izliyor, path reconstruction yapıyor, negatif ağırlıkta yanlış sonucu ve Bellman-Ford'u gösteriyor, A*'ın 200 × 200 depo grid'inde 33.600 yerine 1.845 hücreyle aynı yolu bulduğunu ölçüyoruz.
Union-Find ve Minimum Spanning Tree: Kruskal ile Ağ Kurmak
Union-Find, path compression ve union by rank ile "bu iki eleman aynı grupta mı?" sorusunu pratikte sabit sürede cevaplar; naive versiyon uzun zincirde 4.300 kat yavaş. C# ile DisjointSet yazıyor, ortak e-posta ve telefon üzerinden duplicate müşteri hesaplarını birleştiriyor, Kruskal ile ofisler arası en ucuz fiber ağını kuruyor ve Prim ile aynı sonucu doğruluyoruz.
Backtracking: Permutation, Subset ve Sudoku ile Arama Ağacını Budamak
Backtracking, choose, explore ve unchoose adımlarıyla bütün seçenekleri sistemli dener; asıl gücü çözüme varamayacak dalları erken budamaktır: 8-Queens'te 19 milyon node yerine 2.057. C# ile yield return kullanan permutation, subset ve combination üreticileri, N-Queens, en kısıtlı hücreden başlayan bir Sudoku solver ve kurallı bir ürün konfigüratörü yazıyoruz.
Greedy Algoritmalar: Ne Zaman İşe Yarar, Ne Zaman Yanıltır
Greedy algoritma her adımda o an en iyi görünen seçimi yapar ve yalnız greedy choice property varsa doğrudur: en erken biten toplantıyı seçmek optimaldir, {1, 3, 4} paralarıyla 6 için en büyük parayı seçmek değildir. C# ile activity selection, min-heap ile oda sayısı ve Huffman coding yazıyor, exchange argument'i açıklıyor ve greedy'yi bir hakemle karşılaştırıp karşı örnek arıyoruz.
Dynamic Programming 1: Memoization, Tabulation ve Alt Problemleri Tanımak
Dynamic programming, tekrar eden alt problemleri bir kez çözüp saklayarak exponential bir hesabı polinom zamana indirir: naive Fibonacci F(40) için 331 milyon çağrı yapar, memoization 79. C# ile memoization, tabulation ve O(1) bellek versiyonlarını ölçüyor, beş adımlı tarifle climbing stairs, house robber ve coin change'i çözüyor, yanlış memo key'ini ve stack overflow'u gerçek çıktıyla gösteriyoruz.
Dynamic Programming 2: Edit Distance, LCS ve Knapsack ile Gerçek Problemler
İki boyutlu DP tabloları iki string'in ya da bir bütçenin prefix'lerini tutar: Levenshtein ile "Bunu mu demek istediniz?", LCS ile git diff'le aynı çıktıyı veren bir diff, 0/1 knapsack ile bütçe sınırlı kampanya seçimi. C# ile üçünü yazıyor, eşikli Levenshtein'ın 20 kat hızlandığını ölçüyor, tek satırlık knapsack'te döngü yönü tuzağını gösteriyor ve seriyi bir pattern karar tablosuyla kapatıyoruz.