Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
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.
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.
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.
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.
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.
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.
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.
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.
Tree ve Binary Search Tree: C# ile Insert, Delete ve Traversal
Binary search tree'de arama ve ekleme tree'nin yüksekliği kadar sürer; aynı 10.000 ID sıralı insert edilince tree bir zincire dönüşüyor ve 1.000 arama rastgele sıralı tree'den 221 kat yavaş. Yazıda insert, find, delete'in üç durumunu, recursive ve iterative traversal'ları, doğru BST doğrulamasını ve düz bir kategori tablosundan Dictionary ile O(n)'de tree kurup ASP.NET Core minimal API'den JSON olarak vermeyi testlerle yazıyoruz.
Binary Search Derinlemesine: Lower Bound, Off-by-One ve Cevap Üzerinde Binary Search
Binary search'ü doğru yazmanın yolu bir invariant'a, ör. half-open [lo, hi) aralığına göre yazmak; 1 milyon elemanda en fazla 20 karşılaştırma yapar ama lo = mid gibi tek bir sınır hatası onu sonsuz döngüye sokar. Yazıda lower ve upper bound'u, Array.BinarySearch'ün ~index dönüşünü, minimum kamyon kapasitesini bulan cevap üzerinde binary search'ü ve log'da zaman aralığı aramayı xUnit testleriyle yazıyoruz.
Quick Sort, Introsort ve Counting/Radix Sort: .NET'in Array.Sort'u Nasıl Sıralar
Array.Sort introsort kullanır: quick sort, derinlik 2·log n'i aşınca heapsort, 16 ve altı element'te insertion sort; bu yüzden son element'i pivot seçen ders kitabı quick sort'u sıralı 10.000 elemanda 749 kat yavaşlarken Array.Sort etkilenmez. Yazıda Lomuto ve Hoare partition'ı, median-of-three'yi, Ω(n log n) alt sınırını, Array.Sort'tan 11–12 kat hızlı counting ve radix sort'u ve a - b comparer tuzağını testlerle anlatıyoruz.
Sorting Algoritmaları 1: Insertion Sort, Merge Sort ve Stability
Array.Sort stable değil: tarihe göre sıralı 200 siparişi müşteriye göre sıralayınca her müşterinin tarih sırası bozuluyor, merge sort ve LINQ OrderBy ise koruyor. Yazıda insertion sort'u (neredeyse sıralı 10.000 elemanda Array.Sort'tan 6 kat hızlı), top-down ve bottom-up merge sort'u, external merge sort fikrini ve stability'yi xUnit testleri ve BenchmarkDotNet ölçümleriyle anlatıyoruz.