Bir algoritmanın karar verirken yazı tura attığını düşünün. İlk bakışta bu yaklaşım, ciddi bir mühendislik yönteminden çok şans oyununa benzeyebilir. Oysa rastgele seçimler; kötü girdilerden kaçınmak, karmaşık kararları basitleştirmek ve yüksek performansa daha az kodla ulaşmak için güçlü bir araçtır. Randomized algorithms dünyasında rastgelelik, belirsizlik yaratan bir kusur değil, kontrollü biçimde kullanılan bir kaynaktır.
Devamı...

Bazı algoritma soruları bizden doğrudan “en iyi cevap nedir?” diye sorar; fakat cevabı tek hamlede hesaplamak neredeyse imkânsızdır. Parametrik arama bu soruyu daha kolay bir soruya dönüştürür: “Verilen bir cevap mümkün mü?” Böylece karanlıkta cevabı tahmin etmek yerine, mümkün ve imkânsız bölgeler arasındaki sınırı sistematik biçimde buluruz.
Devamı...
Tek başına kod yazarken zihnimizde küçük bir tiyatro döner: Kodu yazar, kontrol eder, hata yapar ve bazen aynı hataya on dakika boyunca şaşkınlıkla bakarız. Pair programming, yani eşli programlama, bu tiyatroya ikinci bir oyuncu ekler. İki geliştirici aynı problem üzerinde çalıştığında yalnızca iş bölümü yapılmaz; düşünme biçimleri görünür hâle gelir, geri bildirim hızlanır ve öğrenme sosyal bir sürece dönüşür.
Devamı...
Rastgelelik yalnızca zar atarken işimize yaramaz; bazen bir algoritmayı daha hızlı, daha basit veya pratik hâle getirir. Olasılıksal algoritmaların iki ünlü ailesi olan Monte Carlo ve Las Vegas, rastgeleliği farklı bedeller karşılığında kullanır: İlki çalışma süresini sınırlar fakat küçük bir yanlışlık riskini kabul eder; ikincisi ise doğru cevabı garanti eder ancak ne zaman biteceği konusunda biraz gizemli davranır.
Devamı...
Bazı algoritma soruları kendilerini “öğrencileri projelere ata”, “işçileri görevlere yerleştir” veya “sunucuları isteklere bağla” diye tanıtır. Kılıkları farklı olsa da ortak hedef şudur: Birbiriyle uyumlu çiftlerden, hiçbir öğeyi iki kez kullanmadan mümkün olduğunca çok seçmek. İşte bu cümleyi fark ettiğimiz anda problem, maksimum eşleştirme grafına dönüşmeye başlar.
Devamı...
Bir fabrikanın hangi üründen kaç tane üretmesi gerektiğini, bir kargo şirketinin araçlarını nasıl dağıtacağını veya sınırlı bütçenin projeler arasında nasıl paylaştırılacağını düşünün. Bütün bu soruların ortak noktası, belirli kısıtlar altında en iyi kararı aramalarıdır. Lineer programlama, matematiği adeta bir karar verme pusulasına dönüştürerek bu tür optimizasyon problemlerini sistematik biçimde çözmemizi sağlar.
Devamı...
Bir sosyal ağda herkes birbirini takip etmeyebilir; Ayşe, Berk’i takip ederken Berk Ayşe’yi takip etmiyor olabilir. Buna rağmen bazı kullanıcı gruplarında herkes diğerlerine dolaylı yollardan ulaşabilir. Yönlü grafların içindeki bu gizli ve sıkı topluluklara güçlü bağlı bileşenler denir. Kosaraju algoritması, grafı iki kez dolaşarak bu toplulukları şaşırtıcı derecede zarif biçimde ortaya çıkarır.
Devamı...

Bir şehrin yol ağını, bilgisayar ağını veya sosyal bağlantıları bir graf olarak düşündüğümüzde bazı bağlantılar diğerlerinden çok daha kritiktir. Tek bir yol kapandığında şehir ikiye ayrılıyorsa o yol bir köprü, tek bir istasyon devre dışı kaldığında ağ parçalanıyorsa o istasyon bir articulation point yani eklem noktasıdır. Gelin grafın nabzını tutup bu kritik damarları nasıl bulacağımızı inceleyelim.
Devamı...

Bir şehir turu planladığınızı düşünün: Her şehre tam bir kez uğrayacak, ancak başladığınız yere dönmek zorunda olmayacaksınız. Haritada bazı şehirler arasında doğrudan yol bulunmadığında işler hızla karışır. Graf teorisindeki Hamilton yolu problemi, tam olarak bu turun mümkün olup olmadığını sorar. Tanımı tek cümleye sığsa da çözümü bilgisayarları ciddi biçimde terletebilir.
Devamı...
Bir veri yapısında ilerlerken aynı noktaya tekrar uğruyorsanız, muhtemelen bir çevrimin içine düşmüşsünüzdür. Ziyaret edilen elemanları bir kümede saklamak işe yarar; ancak ek bellek tüketir. Floyd’un çevrim bulma algoritması ise yalnızca iki işaretçi kullanarak döngüyü yakalar. Üstelik bunu hem bağlı listelerde hem de her elemanın bir sonraki konumu gösterdiği dizilerde yapabilir.
Devamı...
Bir şehrin bütün köprülerinden yalnızca bir kez geçip yürüyüşü tamamlamak mümkün müdür? 18. yüzyılda Königsberg halkının merak ettiği bu soru, bugün graf teorisinin en meşhur problemlerinden biridir. Leonhard Euler’in çözümü yalnızca köprü bilmecesini açıklamakla kalmadı; ağlar, rotalar ve bağlantılar üzerine düşünme biçimimizi de değiştirdi.
Devamı...

Bir milyara kadar uzanan koordinatlarınız olduğunu düşünün. Elinizde yalnızca birkaç bin nokta bulunmasına rağmen int dizi[1000000001] oluşturmak, küçük bir kargo için uçak kiralamaya benzer. Coordinate Compression, yani koordinat sıkıştırma, büyük fakat seyrek değerleri sıralarını koruyarak küçük indislerle temsil etmemizi sağlar. Böylece dev koordinatlar, standart diziler ve verimli veri yapılarıyla işlenebilir hâle gelir.
Devamı...
Bir partide herkesin iki gruptan yalnızca karşı gruptakilerle iletişim kurduğunu düşünün. Aynı gruptaki hiç kimse birbiriyle konuşmuyor! Kulağa biraz tuhaf gelse de bu düzen, graf teorisindeki bipartite graph, yani iki parçalı graf kavramını mükemmel biçimde anlatır. Üstelik bu graflar; eşleştirme, görev dağıtımı ve sosyal ağ analizi gibi birçok gerçek problemde karşımıza çıkar.
Devamı...
Bir algoritmanın bazı işlemleri aniden pahalılaşabilir. Dinamik bir dizi büyürken bütün elemanların kopyalanması veya bir sayaç artırılırken art arda birçok bitin değişmesi buna örnektir. Ancak tek bir kötü ana bakıp algoritmayı yavaş ilan etmek, ayda bir gelen yüklü market fişine bakarak her gün aynı harcamayı yaptığımızı sanmaya benzer. Amortized analysis, işlemleri tek tek değil, uzun bir işlem dizisi boyunca değerlendirir.
Devamı...
Bir algoritma günlük verilerde ışık hızında çalışabilir; fakat karşısına onun zayıf noktalarını bilen kurnaz bir rakip çıktığında bütün karizma dağılabilir. Adversarial analysis, girdilerin tesadüfen değil, algoritmayı mümkün olduğunca zorlamak amacıyla seçildiğini varsayar. Böylece “Genellikle hızlı mı?” sorusu yerine daha güvenli bir soru sorarız: “Onu sabote etmeye çalışan biri varken ne kadar iyi?”
Devamı...
Python, C veya JavaScript ile bir değişkeni artırmak tek satırlık iştir. Fakat işlemci; değişkenleri, döngüleri ya da fonksiyonları bizim anladığımız biçimde tanımaz. Onun dünyasında yazmaçlar, bellek adresleri ve son derece küçük komutlar vardır. x86 assembly öğrenmek, bilgisayarla onun ana diline yakın bir seviyede konuşmak ve yüksek seviye kodun perde arkasını görmek demektir.
Devamı...

Bir dizideki milyonlarca sayıya aynı işlemi uyguladığınızı düşünün. Geleneksel yaklaşım, elemanları sırayla işlemekken SIMD komutları işlemciye “Bu işlemi tek sayı yerine bir grup sayı üzerinde gerçekleştir” der. Böylece hesaplamalar, süpermarket kasasında tek tek ürün geçirmek yerine bir sepeti aynı anda taramak gibi hızlanabilir.
Devamı...
Bir dil modeli cümleleri ustalıkla tamamlayabilir; ancak bu, verdiği yanıtların yararlı, güvenli veya insan beklentileriyle uyumlu olacağını garanti etmez. RLHF, yani Reinforcement Learning from Human Feedback, modelin yalnızca “sonraki kelime ne olmalı?” sorusuna değil, “insanlar hangi yanıtı tercih eder?” sorusuna da odaklanmasını sağlayan bir eğitim yaklaşımıdır.
Devamı...
Bir işlemcinin hangi komutları anlayacağını hiç merak ettiniz mi? Yazılım ile silikon arasındaki bu sözleşme, komut kümesi mimarisi yani ISA olarak adlandırılır. RISC-V, herkesin inceleyebildiği ve lisans ücreti ödemeden kullanabildiği açık bir ISA sunarak işlemci dünyasındaki yerleşik düzeni değiştiriyor. Üniversite laboratuvarından veri merkezlerine uzanan bu yükseliş, yalnızca teknik değil, ekonomik bir dönüşümü de temsil ediyor.

Devamı...
Bir sahneyi gerçekçi göstermek istiyorsanız yalnızca nesneleri çizmek yetmez; ışığın dünyada nasıl davrandığını da düşünmeniz gerekir. Ray tracing, yani ışın izleme, tam olarak bunu yapar: Kameradan hayali ışınlar gönderir, bu ışınların nesnelerle karşılaşmasını hesaplar ve her pikselin rengini belirler. Kısacası yöntem, dijital bir sahnede ışığa dedektif şapkası takar.
Devamı...