TypeScript Tip Korumaları: typeof, instanceof ve in ile Güvenli Daraltma

TypeScript’te bir değişken bazen birden fazla olası tipe sahip olabilir. Böyle durumlarda derleyici, hangi tipe özgü işlemin güvenli olduğunu kendiliğinden bilemez. Tip korumaları (type guards), programın akışındaki kontrolleri kullanarak olası tip kümesini küçültür. Bu işleme tip daraltma (narrowing) denir. Böylece kod hem güvenli hem de gereksiz tür dönüşümlerinden uzak hâle gelir.

Devamı...

tsconfig.json Rehberi: TypeScript Derleyicisini Baştan Sona Yapılandırmak

TypeScript kodu yazmak işin yalnızca yarısıdır; diğer yarısı, bu kodun hangi JavaScript sürümüne, hangi modül sistemine ve ne kadar katı kurallarla dönüştürüleceğini belirlemektir. Projenin kontrol paneli sayılan tsconfig.json, derleyiciye adeta “Bu kodu nereye götürüyoruz ve yolda hangi kurallara uyuyoruz?” sorularının cevabını verir.

Devamı...

Topolojik Sıralama ile Görevleri Rayına Oturtmak

Bir projedeki görevleri gelişigüzel sıraya koymak, çatıyı temelden önce inşa etmeye benzeyebilir. Bazı işler ancak başka işler tamamlandıktan sonra başlayabilir. Topolojik sıralama, bu bağımlılıkları bozmadan geçerli bir çalışma sırası üretir; döngü tespiti ise planın kendi kuyruğunu kovalayan bir yılana dönüşüp dönüşmediğini gösterir.

Devamı...

Sıralama Algoritmalarının İç İşleyişi: Hangi Durumda Hangisi Daha Hızlı?

Bir veri kümesini sıralamak, programlamanın “çorapları renklerine göre ayırma” problemidir: sonuç basit görünür, fakat doğru yöntem seçilmezse işlem gereksiz yere uzar. Bubble Sort, Merge Sort, Quick Sort ve Heap Sort aynı çıktıyı üretse de bunu yaparken farklı miktarda zaman, bellek ve karşılaştırma harcar. Optimizasyon sorularını çözebilmek için algoritmaların yalnızca karmaşıklıklarını ezberlemek değil, içeride nasıl çalıştıklarını anlamak gerekir.

Devamı...

Saymanın Üç Silahşörü: Permütasyon, Kombinasyon ve Katalan Sayıları

Bir kart destesini karıştırırken, takım kurarken veya parantezleri hatasız biçimde dizerken aslında aynı matematiksel soruyla karşılaşırız: Kaç farklı sonuç mümkündür? Kombinatorik bu soruyu sistematik biçimde yanıtlar; olasılık ise mümkün sonuçların içinden ilgilendiğimiz olayların payını hesaplar. Permütasyon, kombinasyon ve Katalan sayıları bu dünyada farklı kapıları açan üç güçlü anahtardır.

Devamı...

Palindrom Avcıları: KMP ve Rabin-Karp ile Metin İşleme

Bir kelimeyi ters çevirdiğinizde aynı sonucu görüyorsanız karşınızda bir palindrom vardır: “kabak”, “level” ve “ada” gibi. Ancak metin milyonlarca karakterden oluştuğunda palindromları tek tek kontrol etmek pek eğlenceli değildir. Neyse ki KMP ve Rabin-Karp, örüntü arama yeteneklerini palindrom sorularına uyarlayarak bizi iç içe döngülerin karanlık dünyasından kurtarabilir.

Devamı...

Özyinelemeden Geri İzlemeye: Labirent ve Tahta Problemlerini Çözmek

Bir labirentin girişinde durduğunuzu düşünün: Her kavşakta bir yön seçiyor, çıkmaza girerseniz son karar noktasına dönüyorsunuz. Özyinelemeli düşünme ve geri izleme tam olarak böyle çalışır. Büyük bir problemi daha küçük benzer problemlere ayırır, olası seçimleri dener ve başarısız seçimlerden vazgeçerek çözümü sistematik biçimde arar.

Devamı...

Kruskal ve Prim ile Minimum Yayılım Ağacı ve Bağlantılılık Analizi

Şehirleri en düşük maliyetle birbirine bağlayan yolları, bilgisayarları buluşturan kabloları veya enerji hatlarını tasarladığımızı düşünelim. Gereksiz döngüler oluşturmadan bütün noktaları birbirine ulaştırmak istiyorsak karşımıza minimum yayılım ağacı problemi çıkar. Bu problemin iki meşhur kahramanı Kruskal ve Prim algoritmalarıdır; ancak işe başlamadan önce grafın gerçekten bağlantılı olup olmadığını da sorgulamamız gerekir.

Devamı...

Kesirli ve 0-1 Sırt Çantası: Açgözlü Algoritma mı, Dinamik Programlama mı?

Bir kamp çantanızın kapasitesi sınırlı, önünüzdeki eşyaların ise ağırlıkları ve değerleri farklı olsun. Amaç, çantanın taşıma sınırını aşmadan mümkün olan en yüksek toplam değeri elde etmektir. Bilgisayar bilimindeki sırt çantası problemi, bu basit senaryo üzerinden algoritma tasarımının önemli bir dersini gösterir: Aynı görünen problemlerde küçük bir kural değişikliği, doğru çözüm yaklaşımını tamamen değiştirebilir.

Devamı...

İkili Arama ve İki İşaretçi: Arama Tekniklerini Senaryoya Uyarlamak

Bir dizide değer bulmak kolay görünebilir; ancak veri büyüdükçe doğrusal arama, samanlıkta iğne aramaya dönüşür. İkili arama ve iki işaretçi tekniği, yalnızca ezberlenecek kod kalıpları değil, farklı problemlere uyarlanabilen düşünme biçimleridir. Biri arama uzayını sürekli yarıya indirirken diğeri iki konumu koordineli hareket ettirerek gereksiz denemeleri ortadan kaldırır.

Devamı...

Graflar ve Ağaçlarda DFS ve BFS: Derine mi, Genişe mi?

Bir labirentte çıkış aradığınızı düşünün: Bir yolu sonuna kadar takip edip çıkmazda geri mi dönersiniz, yoksa önce size bir adım uzaklıktaki bütün yolları mı incelersiniz? İlk yaklaşım derinlik öncelikli arama (DFS), ikincisi ise genişlik öncelikli arama (BFS) mantığıdır. Bu iki kapsamlı arama tekniği; ağaçların, grafların ve birçok yapay zekâ probleminin temel araçlarıdır.

Devamı...

En Kısa Yol Arenası: Dijkstra, Bellman-Ford ve Floyd-Warshall

Bir şehir haritasında en yakın kafeyi aramak, ağ paketlerini yönlendirmek veya bir oyundaki karaktere güvenli rota çizmek aynı temel soruya dayanır: Bir noktadan diğerine en düşük maliyetle nasıl gideriz? Dijkstra, Bellman-Ford ve Floyd-Warshall bu soruya farklı koşullarda cevap veren üç klasik algoritmadır. Ancak yanlış algoritmayı seçmek, navigasyon uygulamasını macera oyununa çevirebilir!

Devamı...

Diziden Kuyruğa: Veri Yapılarıyla Akıllı Problem Çözme

Bir algoritmanın başarısı yalnızca doğru sonucu üretmesine değil, bunu ne kadar hızlı ve az bellek kullanarak yaptığına da bağlıdır. Diziler, bağlı listeler, yığınlar ve kuyruklar bu noktada programcının alet çantasındaki temel araçlardır. Doğru veri yapısını seçmek bazen yüzlerce satır kod yazmaktan daha değerlidir; yanlış seçim ise hızlı görünen bir çözümü kaplumbağaya çevirebilir.

Devamı...

Dinamik Programlamanın Kalbi: Alt Problemler, Durumlar ve Memoization

Bazı algoritmalar aynı hesabı tekrar tekrar yaparak işlemciyi küçük bir hamster çarkına sokar. Dinamik programlama, bu gereksiz tekrarları fark edip sonuçları saklayan güçlü bir problem çözme yaklaşımıdır. Temel fikir; büyük bir problemi daha küçük alt problemlere ayırmak, her alt problemi doğru biçimde temsil eden durumları tanımlamak ve hesaplanan sonuçları yeniden kullanmaktır.

Devamı...

Bit Maskeleme: Küçücük Bitlerle Kümeler, Durumlar ve Altkümeler

Bir grup anahtarı, özelliği veya seçimi tek bir tamsayı içinde saklamak kulağa sihir gibi gelebilir. Bit maskeleme tam olarak bunu yapar: Her biti bir elemanın varlığına ya da bir durumun açık olup olmadığına ayırır. Böylece klasik veri yapılarına göre daha az bellek kullanabilir, küme işlemlerini birkaç işlemci komutuyla gerçekleştirebilir ve özellikle kombinasyon problemlerini zarif biçimde çözebiliriz.

Devamı...

Big O ile Doğru Algoritmayı Seçmek: Hız ve Bellek Dengesi

Bir problemi çözen ilk algoritmayı bulmak güzeldir; ancak milyonlarca veri geldiğinde hâlâ çalışan algoritmayı bulmak çok daha güzeldir. Big O notasyonu, farklı algoritmaların veri büyüdükçe nasıl davranacağını karşılaştırmamızı sağlar. Böylece yalnızca çalışan değil, zaman ve bellek açısından sürdürülebilir çözümler seçebiliriz.

Devamı...

Asal Sayılardan Hızlı Üs Almaya: Matematiğin Programlama Motoru

Bilgisayarlar matematik konusunda hızlıdır; ancak sonsuz sabırlı değillerdir. Sayılar büyüdükçe sıradan yöntemler yavaşlar, bellek tüketimi artar ve taşma sorunları ortaya çıkar. Asal sayılar, modüler aritmetik ve hızlı üs alma teknikleri; kriptografiden algoritma yarışmalarına kadar bu sorunları çözmemizi sağlayan güçlü araçlardır.

Devamı...

Aralık Sorgularının İki Ustası: Segment Ağacı ve Fenwick Ağacı

Bir dizideki elemanlar sürekli değişirken belirli bir aralığın toplamını hızlıca bulmak istediğimizi düşünelim. Her sorguda aralığı baştan dolaşmak kolaydır; ancak veri büyüdüğünde işlemciniz küçük bir maraton koşmaya başlar. Segment ağacı ve Fenwick ağacı, aralık sorguları ile nokta güncellemelerini verimli biçimde birleştirerek bu sorunu çözer.

Devamı...

Alt Dizilerin Dedektifliği: LIS, LCS ve Metin Benzerliği

Bir sayı dizisindeki yükselişleri bulmakla iki metnin ne kadar benzediğini ölçmek ilk bakışta ayrı dünyaların işi gibi görünebilir. Oysa En Uzun Artan Alt Dizi (LIS) ve En Uzun Ortak Alt Dizi (LCS), aynı temel sorunun akrabalarıdır: Sırayı bozmadan hangi elemanları seçebiliriz? Bu yaklaşım; sürüm karşılaştırma, intihal tespiti, DNA analizi ve yazım düzeltme gibi birçok alanda karşımıza çıkar.

Devamı...

Açgözlü Algoritmalar: Ne Zaman En İyiyi Bulurlar?

Açgözlü algoritmalar, her adımda o an için en cazip seçeneği tercih eder. Geleceği ayrıntılı biçimde hesaplamaz, geçmiş kararlarını da değiştirmezler. Bu yaklaşım biraz “önce en güzel kurabiyeyi kap, gerisini sonra düşünürüz” tavrına benzer. Şaşırtıcı biçimde bazı problemlerde bu basit strateji gerçekten optimal sonucu verirken, bazılarında bizi kurabiye kırıntılarıyla baş başa bırakır.

Devamı...