Sparse Table: Değişmeyen Verilerde Işık Hızında Aralık Sorguları

Bir dizideki belirli aralıkların minimumunu, maksimumunu ya da EBOB’unu defalarca bulmanız gerektiğini düşünün. Veri hiç değişmiyorsa, her sorguda aralığı baştan taramak gereksiz bir maliyettir. Sparse Table, ön işlem süresini ve belleği göze alarak sorguları özellikle minimum/maksimum gibi işlemlerde $O(1)$ sürede cevaplayan etkileyici bir veri yapısıdır. Adındaki “sparse” kelimesi yanıltıcı olabilir: Bu yapı seyrek verilerden çok, $2$’nin kuvveti uzunluğundaki önceden hesaplanmış aralık bloklarından oluşur.

Devamı...

Skip List: Dengeli Ağaçlara Olasılıksal ve Pratik Bir Alternatif

Sıralı verilerde arama yapmak istediğinizde bağlı listeler basit ama yavaştır; dengeli ikili arama ağaçları ise hızlı ama uygulaması görece karmaşıktır. Skip List, bu iki dünyanın arasına eğlenceli bir olasılık fikri yerleştirir: Bazı düğümlere rastgele seçilen ek “hız şeritleri” verir. Böylece listeyi tamamen yeniden dengelemeden, ortalama durumda oldukça hızlı arama, ekleme ve silme işlemleri sunar.

Devamı...

Raft Konsensüs Algoritması: Lider Seçimi ve Tutarlı Verinin Anatomisi

Dağıtık sistemlerde aynı veriyi birden fazla makinede tutmak harikadır; tek bir sunucu bozulduğunda sistem ayakta kalır. Fakat işin zor kısmı şudur: Ağ gecikebilir, makineler sessizce kapanabilir ve iki sunucu aynı anda farklı şeylerin doğru olduğuna inanabilir. Raft, bu kaosu yönetmek için tasarlanmış, anlaşılabilirliği önceleyen bir konsensüs algoritmasıdır. Temel hedefi, tüm sağlıklı düğümlerin işlemleri aynı sırayla uygulamasını sağlamaktır.

raft-konsensus-algoritmasi-13

Devamı...

Paxos Algoritmasını Anlamak: Dağıtık Sistemlerde Güvenilir Karar Sanatı

Dağıtık sistemlerde en zor soru çoğu zaman “veri nerede?” değil, “herkes aynı kararı verdi mi?” sorusudur. Ağ gecikebilir, makineler kapanabilir ve mesajlar kaybolabilir; buna rağmen banka bakiyesinin, lider seçiminin ya da sipariş durumunun tek bir doğru geçmişi olmalıdır. Paxos, düğümlerin çökebildiği bu kaotik ortamda ortak bir değerde uzlaşmayı sağlayan klasik consensus algoritmasıdır.

paxos-algoritmasini-anlamak-84

Devamı...

Mo Algoritması: Çevrimdışı Aralık Sorgularını Hızlandırma Sanatı

Bir dizideki çok sayıda aralık sorgusuna cevap vermek, ilk bakışta masum görünür: Her sorgu için ilgili aralığı dolaşır, sonucu hesaplar ve devam edersiniz. Ancak $N=Q=10^5$ olduğunda, her sorguyu tek tek taramak yaklaşık $O(NQ)$ maliyet üretir. İşte Mo Algoritması tam burada sahneye çıkar: Sorguları akıllıca yeniden sıralayarak, önceki sorgudan elde edilen bilgiyi mümkün olduğunca korur.

Devamı...

Merkle Ağaçları ile Büyük Veri Kümelerinde Bütünlük Doğrulama

merkle-agaclari-ile-41

Bir dosyanın, veritabanı yedeğinin ya da milyonlarca işlemden oluşan bir blok zinciri bloğunun değiştirilmediğini nasıl kanıtlarsınız? Tüm veriyi her seferinde baştan sona karşılaştırmak güvenlidir, fakat pahalıdır. Merkle ağacı, kriptografik özetleri hiyerarşik biçimde birleştirerek bu sorunu çözer: Küçük bir kanıt paketiyle devasa bir veri kümesindeki belirli bir kaydın bütünlüğü doğrulanabilir.

Devamı...

Manacher Algoritması ile Doğrusal Zamanda En Uzun Palindrom

Bir metindeki en uzun palindromik alt diziyi bulmak, ilk bakışta her karakteri merkez kabul edip iki yana açılma fikriyle kolay görünür. Ancak uzun metinlerde bu yaklaşım pahalılaşır. Manacher algoritması, daha önce hesaplanan palindromların simetrisini akıllıca yeniden kullanarak problemi $O(n)$ zamanda çözer. Adı biraz sihirbazlık çağrıştırsa da arkasındaki fikir oldukça sistematiktir.

manacher-algoritmasi-ile-33

Devamı...

Link-Cut Tree Nedir? Dinamik Ağaçların Gizli İsviçre Çakısı

Bir ağacın kenarlarını çalışma anında ekleyip silmek, ardından iki düğüm arasındaki yolun toplamını saniyeler içinde sormak ilk bakışta masum görünür. Ancak klasik DFS, BFS veya sabit köklenmiş ağır-hafif ayrıştırması bu dünyada zorlanır. Link-Cut Tree (LCT), dinamik ormanlar üzerinde bağlantı, yol sorgusu ve kök değiştirme işlemlerini amortize olarak $O(\log n)$ sürede gerçekleştiren gelişmiş bir veri yapısıdır.

link-cut-tree-44

Devamı...

HyperLogLog ile Yaklaşık Sayma: Milyonlarca Benzersiz Kaydı Cebinizde Taşımak

hyperloglog-ile-yaklasik-72

Bir e-ticaret sitesinde kaç farklı kullanıcının ürünü görüntülediğini, bir log kümesinde kaç benzersiz IP bulunduğunu ya da bir kampanyanın gerçek erişimini saymak istiyorsunuz. Tüm kimlikleri Set içinde tutmak kesin sonuç verir; ancak yüz milyonlarca kayıt geldiğinde bellek bütçeniz hızla tükenir. HyperLogLog (HLL), bu noktada küçük ve sabit sayılabilecek bellek karşılığında çok isabetli bir yaklaşık benzersiz eleman sayısı üretir.

Devamı...

Heavy-Light Decomposition ile Ağaç Sorgularını Hızlandırma

heavy-light-decomposition-12

Ağaçlar; organizasyon şemalarından dosya sistemlerine, oyun haritalarından ağ topolojilerine kadar pek çok yerde karşımıza çıkar. Ancak iki düğüm arasındaki yol üzerindeki toplamı, maksimumu veya güncellemeleri hızlı biçimde hesaplamak istediğimizde klasik DFS yaklaşımı yetersiz kalır. Heavy-Light Decomposition (HLD), ağacı parçalara ayırarak bu karmaşık yol sorgularını etkileyici biçimde hızlandıran güçlü bir tekniktir.

Devamı...

Fibonacci Heap: Öncelik Kuyruklarında Teorik Hızın Sırrı

fibonacci-heap-oncelik-88

Öncelik kuyruğu denince çoğumuzun aklına ikili yığın (binary heap) gelir: eleman ekle, en küçüğü al, işlem tamam. Ancak Dijkstra veya Prim gibi algoritmalarda bazı anahtarların değeri sürekli azaltılıyorsa, teorik olarak daha iddialı bir oyuncu sahneye çıkar: Fibonacci Heap. Bu veri yapısı, bazı pahalı işleri erteleyerek özellikle decrease-key operasyonunu amortismanlı olarak son derece ucuz hâle getirir.

Devamı...

Cuckoo Hashing: Çakışmaları Tekmeleyerek Çözen Hızlı Hash Tablosu

cuckoo-hashing-cakismalari-54

Hash tabloları, anahtarları ortalama $O(1)$ sürede bulma vaadiyle programlamanın görünmez kahramanlarıdır. Ancak iki anahtar aynı konuma düştüğünde ortaya çıkan çakışma, bu vaadi zorlayabilir. Cuckoo Hashing, çakışmayı zincirleme listelerle uzatmak yerine iki farklı olası yuva sunar ve gerekirse mevcut elemanı yerinden “tekmeleyerek” taşır. Adını da yumurtasını başka kuşların yuvasına bırakan guguk kuşundan alır.

Devamı...

CRDT Veri Yapıları: Çevrimdışı Uygulamalarda Çakışmaları Otomatik Çözmek

Bir not alma uygulamasını iki telefonda, internet bağlantısı olmadan kullandığınızı düşünün. Aynı notu bir cihazda silerken diğerinde yeni bir madde eklediniz. Bağlantı geri geldiğinde klasik bir sistem genellikle “hangi sürüm doğru?” diye panikler. CRDT’ler ise bu tartışmayı matematiksel kurallarla çözer: Her cihaz değişiklik yapabilir, ardından veriler sıradan bağımsız biçimde birleşerek aynı sonuca ulaşır.

crdt-veri-yapilari-29

Devamı...

Consistent Hashing Nedir? Sunucu Değişimlerinde Veriyi Yerinden Oynatmayan Yöntem

consistent-hashing-nedir-98

Dağıtık sistemlerde veriyi sunuculara paylaştırmak ilk bakışta kolay görünür: bir anahtarın hash değerini alır, sunucu sayısına göre modunu hesaplar ve hedefi buluruz. Fakat yeni bir sunucu eklediğinizde ya da arızalı bir makineyi kümeden çıkardığınızda bu sade yaklaşım, neredeyse bütün verilerin farklı yerlere taşınmasına yol açabilir. Consistent Hashing, tam bu taşınma fırtınasını küçültmek için tasarlanmış akıllı bir dağıtım tekniğidir.

Devamı...

Aho-Corasick Algoritması: Binlerce Kelimeyi Metinde Tek Geçişte Bulun

Bir metinde tek bir kelime aramak kolaydır; indexOf, regex veya KMP çoğu zaman yeterlidir. Peki bir log akışında binlerce zararlı imzayı, bir sözlükte binlerce anahtar sözcüğü ya da bir DNA dizisinde çok sayıda motifi aynı anda bulmak gerekirse? Her kelime için metni yeniden taramak, büyüyen veriyle birlikte pahalılaşır. Aho-Corasick, bu problemi bir trie ve akıllı geri dönüş bağlantılarıyla tek geçişte çözen klasik çoklu örüntü arama algoritmasıdır.

aho-corasick-algoritmasi-67

Devamı...

WireGuard ile Modern VPN Altyapısı: Hız, Sadelik ve Güçlü Kriptografi

Modern bir VPN kurmak, eskiden sertifika zincirleri, karmaşık şifre paketleri ve sayfalarca yapılandırma dosyası demekti. WireGuard bu yaklaşımı bilinçli biçimde tersine çevirir: küçük kod tabanı, az sayıda kriptografik tercih ve UDP üzerinde çalışan yalın bir tünel. Sonuç; yönetimi kolay, yüksek performanslı ve özellikle sunucu-istemci ya da site-to-site senaryolarında çok güçlü bir sanal özel ağ altyapısıdır.

Devamı...

SMT Çözücüleriyle Kısıt Programlama: Z3 ile Akıllı Arama ve Doğrulama

Karmaşık bir planı elle hazırlamak, binlerce olasılık içinden doğru kombinasyonu gözle seçmeye benzer: kısa süre sonra kahve biter, sabır biter, hata payı ise bitmez. SMT (Satisfiability Modulo Theories) çözücüleri bu noktada devreye girer. Z3 gibi araçlar, mantıksal kuralları ve matematiksel ilişkileri modele dönüştürerek bir problemin çözümü olup olmadığını otomatik biçimde araştırır; uygun olduğunda da somut bir çözüm üretir.

smt-cozuculeriyle-kisit-35

Devamı...

SIMD Programlama ile Veri Paralelliği: Tek Komutla Daha Fazla Hesap

Modern işlemciler yalnızca daha yüksek saat hızlarıyla değil, aynı anda birden fazla veriyi işleyebilme yetenekleriyle de hız kazanır. SIMD (Single Instruction, Multiple Data), yani Tek Komut Çoklu Veri yaklaşımı, özellikle dizi, matris, görüntü, ses ve bilimsel hesaplama gibi birbirinden bağımsız sayısal işlemlerde büyük performans artışı sağlar. Fikir basittir: Dört sayıyı tek tek toplamak yerine, dört sayıyı taşıyan bir vektör kaydı üzerinde tek toplama komutu çalıştırılır.

Devamı...

SDN ile Yazılım Tanımlı Ağ Yönetimi: Ağınızı Kodla Yönetin

Geleneksel ağlarda her yönlendirici ve anahtar kendi kararlarını verir; bu durum büyüyen altyapılarda yapılandırma karmaşası, tutarsız kurallar ve yavaş değişiklikler doğurur. Yazılım Tanımlı Ağlar (Software-Defined Networking, SDN), kontrol kararlarını merkezi bir yazılıma taşıyarak ağın davranışını programlanabilir hâle getirir. Böylece yönlendirme tabloları, güvenlik politikaları ve trafik öncelikleri tek tek cihazlara bağlanmadan dinamik biçimde yönetilebilir.

Devamı...

Pulumi ile TypeScript ve Python Kullanarak Altyapıyı Kodlamak

Bulut altyapısı artık yalnızca kontrol panelinde tıklanarak yönetilen kaynaklar bütünü değildir. Sunucular, depolama alanları, ağ kuralları ve veritabanları; yazılımın kendisi kadar tekrar üretilebilir, gözden geçirilebilir ve test edilebilir olmalıdır. Pulumi, bu yaklaşımı genel amaçlı dillerle birleştiren bir Infrastructure as Code (IaC) aracıdır. TypeScript veya Python ile AWS, Azure, Google Cloud ya da Kubernetes kaynaklarını bildirimsel biçimde tanımlayabilir; bu tanımları Git deposunda uygulama kodunuzla birlikte sürümlendirebilirsiniz.

pulumi-ile-typescript-53

Devamı...