Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Big-O'nun Söylemedikleri: Sabitler, Cache ve BenchmarkDotNet ile Ölçmek
Big-O büyümeyi söyler ama gerçek süreyi sabitler, cache, allocation ve girdi dağılımı belirler. 10 kitapta O(n²) insertion sort'un LINQ'ten iki kat hızlı olması, LinkedList'in 3,8 kat yavaşlığı, kötü GetHashCode ile Dictionary'nin O(n²)'ye düşmesi ve doubling experiment ile complexity'yi ölçerek tahmin etmek.
Amortized Analysis: List<T>.Add Neden O(1) Sayılır
List<T>.Add bazen bütün listeyi kopyalar ama kapasite ikiye katlandığı için n Add'in toplam maliyeti 3n'i geçmez; bu yüzden amortized O(1) sayılır. Aggregate, accounting ve potential method, +10 büyümenin 50 milyar kopyası, Dictionary'nin asal boyutları ve 38 ms'lik resize spike'ı gerçek ölçümlerle.
Space Complexity: Ek Bellek, Recursion Stack'i ve Allocation
Space complexity, bir algoritmanın aynı anda canlı tuttuğu belleğin n ile nasıl büyüdüğüdür; recursion derinliği de stack'te bellektir. 1,5 MB'lık thread stack'inde düşen recursion, Split ile Span, memoization ve 1 GB'lık log dosyasını 52 MB ile okumak; ReadAllLines'ın 512 MB'lık container'da ne yaptığı gerçek çıktılarla.
Koddan Time Complexity Çıkarmak: Döngüler, log n ve Recursion
Koddan complexity okumak için ardışık blokları topla, iç içe döngüleri çarp, her adımda yarıya inen döngüye log n de, recursion için recurrence yaz. Gerçek sayımlarla üçgen döngü, naive Fibonacci, merge sort, Master theorem, LINQ'in gizli döngüleri ve O(n·m)'den O(n+m)'e inen sipariş eşleştirme benchmark'ı.
Big-O Notation Nedir: Büyüme Hızı, O, Ω, Θ ve Worst Case
Big-O bir algoritmanın süresini saniyeyle değil, girdi boyutu n büyüdükçe adım sayısının nasıl büyüdüğüyle anlatır. O, Ω ve Θ farkı, n'i doğru seçmek, best/average/worst case ve List, HashSet ile binary search'ün 10 ile 1.000.000 element arasında BenchmarkDotNet ile ölçülmüş gerçek büyümesi.