Bilgisayarın Doğası, Problem Çözme Sanatı ve Algoritma Analizi

~25 dk 07 Mart 2026 121 görüntülenme Algoritma Problem Çözme Öklid PageRank Temel Programlama

Hayatımızdaki problemleri nasıl çözeriz? Karşılaştığımız engellerden Google'ın arama motoruna ve hayat kurtaran böbrek nakillerine kadar uzanan adım adım çözüm yollarını ve problem çözme mantığını keşfedin.

Dijital dünyanın görünmez kahramanlarına hoş geldiniz! Farkına varsak da varmasak da modern hayat tamamen çevremizde sessizce gelişen talimatlar etrafında şekilleniyor. İnternetten alışveriş yaparken, dünyayı dolaşırken, sevgi ararken, hatta hayat kurtarırken bile sahnenin arkasında adım adım çalışan matematiksel kurallar bütünü vardır. Dünyaca ünlü bilgisayar bilimcisi B. Chazelle'in de belirttiği gibi; "20. yüzyıl denklemlerin yüzyılıydı, ancak 21. yüzyıl algoritmaların yüzyılıdır!".

Bu derste sadece kod yazmayı değil; donanımın nasıl düşündüğünü, algoritmaların bilimsel olarak nasıl analiz edildiğini ve dünyayı analitik bir bakış açısıyla nasıl okuyacağınızı öğreneceksiniz. Bu yolculuğa, önce bilgisayarın doğasını anlayarak başlıyoruz.

BÖLÜM 1: BİLGİSAYAR NASIL DÜŞÜNÜR? DİLLERİN EVRİMİ

Bir algoritma tasarlamadan önce, o algoritmayı işleyecek makineyi (bilgisayarı) tanımak zorundayız. Bilgisayar, kullanıcının sunduğu verileri RAM (geçici hafıza) üzerinde tutan, gerektiğinde kalıcı bellekte saklayabilen ve verileri Merkezi İşlem Birimi (CPU) ile işleyen elektronik bir makinedir. Bilgisayarın çalışma mantığı 4 temel adımdan oluşur:

  1. Giriş: Kullanıcıdan alınan yazılı, sözlü veya görsel komutlardır.
  2. İşlem (CPU): Verilerin işlenmesi aşamasıdır.
  3. Bellek (RAM & Hard Disk): Bilgilerin anlık olarak veya kalıcı olarak saklanmasıdır.
  4. Çıkış: Üretilen sonucun görsel veya işitsel olarak sunulmasıdır.

İnsan beyni olayları duyu organlarıyla algılayıp mantık yürüterek çözerken, bilgisayarlar tamamen farklı bir dilde, Makine Dilinde konuşurlar.

Makine Dilinden Modern Dillerin Doğuşuna

En alt seviyedeki programlama dili olan makine dili, sadece "1" ve "0" (binary) rakamlarından oluşur. Aslında "1" rakamı işlemcideki transistörün açık (voltaj var) olmasını, "0" ise transistörün kapalı (voltaj yok) olmasını ifade eder. İnsanlar için bu sıfır ve birlerle program yazmak neredeyse imkansızdır. Bu nedenle zamanla programlama dilleri evrimleşmiştir:

  • 1. Nesil (Makine Dili): Derleyici gerektirmeyen, doğrudan donanımla konuşan ama yazması aşırı zor olan dillerdir (Örn: Intel 80x86).
  • 2. Nesil (Assembly Dili): Makine diline oranla daha anlaşılabilir komutlardan oluşan alçak seviyeli dillerdir. Yazılan kod, "Assembler" adı verilen çeviriciler ile makine diline dönüştürülür.
  • 3. Nesil (Yapısal/Yüksek Seviye Diller): İngilizce diline yakın, insan algısına en uygun dillerdir. Python, Java, C# gibi diller bu gruba girer. Bu dillerde yazılan kodlar, Derleyici (Compiler) adı verilen yazılımlar sayesinde makine diline çevrilir.

Altın Kural: Bir dilin seviyesi makine diline ne kadar yakınsa bilgisayar o kodu o kadar "hızlı" çalıştırır ancak insanın o kodu yazması o kadar "zordur". Dilin seviyesi yükseldikçe (Python gibi) insanın kodu yazması kolaylaşır, ancak kodun derlenip çalışması mikro saniyeler bazında nispeten daha yavaş olur.

BÖLÜM 2: PROBLEM NEDİR VE PROBLEM ÇÖZME TEKNİKLERİ

Karşılaşılabilecek soruna, olumsuzluğa veya çözülmesi gereken duruma "problem" denir. Bilgisayar dilinde bir problemi çözmek, pratik yaşantımızdaki çözümlere çok benzer. Ancak bilgisayarlar kendiliklerinden hiçbir şey bilemezler; onlara problemi nasıl çözeceklerini bizim öğretmemiz gerekir.

Başarılı Problem Çözmenin Altın Kuralları

Etkili bir problem çözme süreci, kod yazmaktan çok daha önce, kağıt üzerinde başlar ve şu aşamalardan geçer:

  1. Problemi Anlamak ve Hakimiyet Sağlamak: Bir algoritmayı oluşturan ilk etmen problemdir. Tıpkı temeli iyi atılmadan üstüne kat eklenen bir inşaatın ilk sarsıntıda çökeceği gibi, problem iyi analiz edilmezse yazılacak algoritmada büyük mantık hataları (bug) doğar. Yanlış anlaşılan bir problem, tüm çözümün boşa gitmesi anlamına gelir.
  2. Gereksinimleri ve Girdi/Çıktıları Belirlemek: Programın çalışması için gereken parametreler iyi belirlenmelidir. Örneğin bir yaş hesaplama problemi için kullanıcıdan "doğum tarihi" istenmeli (girdi) ve "yaş bilgisi" sunulmalıdır (çıktı). Bu aşamada tüm problemlerde çözüm için  sabitler (Örn: Pi sayısı) ve değişkenler de önceden tespit edilmelidir ki algoritmanın ortasında başa dönmek zorunda kalınmasın.
  3. Alternatif Algoritmalar (Çözümler) Geliştirmek: Bir problemin her zaman birden fazla çözümü olabilir. En hızlı çözüm her zaman en güvenli, maliyet açısından en ucuz veya en az bellek (RAM) harcayan çözüm olmayabilir. En uygun olanı seçilmelidir.
  4. Deneme ve Hata Tespiti (De-bugging): Sonucu bilinen örnek verilerle algoritma test edilir. Hatalar tespit edilip giderilir.
  5. Prototip Oluşturmak (Algoritma/Akış Şeması): Çözüm bilgisayara aktarılmadan önce herkesin anlayabileceği şemalar veya sözde kodlar halinde kağıda dökülür.
  6. Kodlama ve İyileştirme: Tüm bu planlamalardan sonra Java, Python veya C++ gibi bir dille kodlama yapılır. Gereksiz bellek harcayan satırlar silinerek kod iyileştirilir.

Günlük Hayattan Bir Örnek: Otobüsle Ankara Seyahati Ankara'ya gitmek bir problemse bilgisayar mantığıyla çözümü şöyledir: Web'den istenen güne bilet al -> Seyahat için bavul hazırla -> Yarım saat önce gara git -> Otobüse binip koltuğunu bul -> Ankara'ya ulaştığında in -> Bavulunu al ve bitir. Gördüğünüz gibi, hiçbir adım atlanamaz ve sıralama değiştirilemez.

BÖLÜM 3: ALGORİTMANIN FELSEFESİ VE İFADE EDİLİŞ BİÇİMLERİ

Algoritma, belirli bir mantığı olan, farklı düşünebilmeyi öğreten ve bir problemi çözmek için izlenmesi gereken kesin, sıralı ve düzenli adımlardır. "Algoritma" kelimesi, 780-850 yılları arasında yaşamış olan, cebirin temelini atan ve bugünkü bilgisayar biliminin yapıtaşı olan 0'ı (sıfırı) bulan ünlü İslam bilgini El-Harezmi'nin isminden gelmektedir.

Ancak algoritmalar bilgisayarlardan binlerce yıl daha eskidir! Bildiğimiz en eski algoritma, Antik Yunan matematikçisi Öklid (Euclid) tarafından sayıların en büyük ortak bölenini (EBOB) bulmak için yazılmıştır. Örneğin devasa bir zemini hiç boşluk kalmadan en büyük eş kare kiremitlerle kaplamak istiyorsanız, kiremit ustaları bugün bile Öklid'in bu adım adım işleyen eski algoritmasını kullanırlar.

Algoritmalar Nasıl İfade Edilir?

Bir problemi bilgisayara anlatmadan önce onu ifade etmemiz gerekir. Algoritmalar temelde 3 farklı şekilde ifade edilebilirler:

  1. Doğal Dil ile İfade: Teknik terimlerden tamamen uzak, konuşma diline en yakın ifadedir. Anlaşılması kolaydır ancak güç ve zaman alan büyük matematiksel hesaplamaları bu şekilde ifade etmek zor olduğu için yazılım mühendisliğinde pek tercih edilmez.
  2. Sınırlı Doğal Dil (Sözde Kod / Pseudocode): Konuşma dili ile programlama dili arasındaki köprüdür. Tam olarak kod değildir ama Eğer (If), Döngü (Loop), Oku (Read), Yaz (Write) gibi programlamaya yakın anahtar kelimeler ve matematiksel operatörler kullanılarak yazılır. Algoritma tasarlamanın en yaygın yöntemidir.
  3. Akış Diyagramları (Flowcharts): Algoritma adımlarının uluslararası standart geometrik şekiller (kare, paralelkenar, eşkenar dörtgen vb.) ve oklar ile şematize edilerek anlatıldığı ifade şeklidir. Karmaşık algoritmaların haritasını çıkarmak için en iyi yöntemdir.

(Akış diyagramlarında kullanılan şekillerin anlamlarını, bir sonraki "Akış Şemaları" konumuzda detaylıca işleyeceğiz.)

🎬 Görsel Molası: Algoritmaları İş Başında Görelim Yukarıda okuduğunuz teorik adımların ve algoritma mantığının gerçek dünyada nasıl hızla aktığını daha iyi zihninizde canlandırmak için aşağıdaki kısa videoyu izlemenizi tavsiye ederim. 

BÖLÜM 4: ROBERT SEDGEWICK VE ALGORİTMALARIN BİLİMSEL ANALİZİ (ANALYSIS OF ALGORITHMS)

Algoritma kurmayı öğrendikten sonra karşımıza mühendislik alanının en kritik sorusu çıkar: "Yazdığım bu program ne kadar sürede çalışacak ve hafızada ne kadar yer kaplayacak?".

Dünyaca ünlü algoritma profesörü Robert Sedgewick'in de vurguladığı gibi, sadece çalışan bir kod yazmak yeterli değildir. Veri miktarımız 10 kişi olduğunda saniyeler içinde çalışan bir kod, veri miktarımız 1 milyon kişi olduğunda bilgisayarın aylar boyunca kilitlenmesine sebep olabilir. Bu durumu öngörebilmek için Princeton Üniversitesi'nin yaklaşımı olan Algoritma Analizi (Analysis of Algorithms) prensiplerini kullanırız.

Bilimsel Yaklaşım ve Maliyet Modeli (Cost Model)

Bir algoritmanın performansını ölçmek için doğa bilimcilerin kullandığı "Bilimsel Yöntem"i kullanırız:

  • Doğal dünyadaki (bilgisayardaki) çalışma süresini gözlemleriz.
  • Sistemin ne kadar süreceğine dair matematiksel bir model (hipotez) kurarız.
  • Devasa verilerle kodu test ederek (deneyerek) hipotezimizi doğrularız.

Bilgisayar biliminin kurucularından D.E. Knuth'un ortaya koyduğu teoriye göre, bir programın süresi iki şeye bağlıdır: Komutların çalışma maliyeti ve komutların ne kadar sık tekrarlandığı. Biz, algoritmanın kalbinde yatan ana döngüye ve en çok yapılan işleme Maliyet Modeli (Cost Model) deriz. Örneğin bir listedeki sayıları sıralıyorsak, bizim maliyet modelimiz sayıların "birbirleriyle kaç kere karşılaştırıldığı"dır.

Büyüme Dereceleri (Order of Growth) - Neden Önemli?

Bir problemin girdisi (örneğin müşteri sayısı) "N" olarak ifade edilir. N sayısı büyüdükçe (girdi arttıkça) algoritmanın çalışma süresinin nasıl tepki vereceğine Büyüme Derecesi (Order of Growth) denir. Dünyadaki yazılımların kalitesini bu büyüme dereceleri belirler:

  • Sabit (Constant - 1): Girdi ister 10 kişi olsun ister 1 milyar kişi, çalışma süresi asla değişmez. İki sayıyı toplamak gibi temel işlemlerdir.
  • Logaritmik (Log N): Veri iki katına çıksa bile süre sadece 1 birim artar. Mükemmel bir hızdır. Telefon rehberinde bir ismi ortadan bölerek (Binary Search) aramak logaritmiktir.
  • Doğrusal (Linear - N): Veri ne kadar artarsa, süre de o kadar artar (Doğru orantı). N adet verinin tamamını tek tek gezmek bu sınıfa girer.
  • Doğrusal-Logaritmik (Linearithmic - N log N): Dünyanın en iyi sıralama algoritmalarının (Merge Sort vb.) sahip olduğu hızdır. Büyük verileri "Böl ve Fethet" (Divide and Conquer) yöntemiyle çok hızlı işler.
  • Karesel (Quadratic - ): İçi içe geçmiş iki döngü (for loop) kullandığınızda oluşan maliyettir. Veri 10 katına çıkarsa, çalışma süresi 100 katına çıkar! Kötü yazılmış basit sıralama algoritmaları böyledir ve büyük verilerde sistemin çökmesine yol açar.
  • Kübik (Cubic - ): Veri 10 katına çıktığında, süre 1000 kat artar. Pratik hayatta devasa veriler için asla kullanılamazlar.

Maslow'un Çekici (Maslow's Hammer): Sedgewick'in de dikkat çektiği çok ünlü bir kural vardır: "Eğer elinizdeki tek alet bir çekiçse, dünyadaki her problemi bir çivi olarak görmeye başlarsınız.". Sadece tek bir problem çözme modeli veya sadece zayıf bir algoritma (örneğin karesel çalışan bir yapı) biliyorsanız, devasa problemleri o yetersiz algoritmayla çözmeye çalışıp sistemin çökmesine neden olursunuz. Bu yüzden yazılım mühendisleri, donanımın sınırlarına takılmamak için logaritmik veya doğrusal algoritmalar tasarlamak zorundadırlar.

BÖLÜM 5: MODERN DÜNYAYA YÖN VEREN MUCİZEVİ ALGORİTMALAR

Bilgisayarlar sadece tekrar eden görevleri inanılmaz hızlarda tamamlayan aptal makinelerdir. Ancak sizin hazırladığınız bu matematiksel kurallar ve dahiyane algoritmalarla birleştiklerinde dünyayı değiştirirler. İşte bu "büyüme derecelerinin" mükemmelleştirildiği, dünya standartlarındaki zirve noktalarından birkaçı:

Google'ın Kalbi: PageRank

1998'de Stanford Üniversitesi'nde iki doktora öğrencisi (Larry Page ve Sergey Brin) bir garajda Google'ı kurduklarında, başarıları sadece donanıma değil, yarattıkları tek bir algoritmaya dayanıyordu: PageRank. İnternetteki milyarlarca sayfayı klasik yöntemlerle aramak aylar sürerdi. Onların yazdığı bu algoritma, web sayfalarını sadece içerdikleri kelimelere göre değil, "birbirlerine verdikleri referanslara (linklere)" göre puanlayarak sıraladı. Bugün günde 3,5 milyardan fazla arama, bu zarif matematiğin süzgecinden saniyeler içinde geçmektedir.

Sıralama (Sorting) Mucizesi ve John von Neumann

İnternetteki veriler data paketlerine bölünüp ağ üzerinde yollanırken, bu karmaşık paketleri doğru sıraya dizip size bir Netflix videosu veya e-posta olarak gösteren şey, arkada çalışan sıralama algoritmalarıdır. Eğer verileri yan yana ikişerli kıyaslayarak (Baloncuk Sıralaması / Bubble Sort) sıralamaya kalkarsanız, algoritmanızın maliyeti Karesel () olur ve milyonlarca veri yıllar sürer. Ancak John von Neumann gibi dahilerin geliştirdiği "Birleştirme Sıralaması (Merge Sort)", devasa verileri "Böl ve Fethet" mantığıyla küçük parçalara ayırarak birleştirir. Maliyeti Logaritmik-Doğrusal'dır () ve baloncuk sıralamasına açık ara fark atarak modern bilgisayarları mümkün kılar.

Nobel Ödülü Kazanan "Hayat Kurtaran" Eşleştirme (Gale-Shapley)

1960'larda David Gale ve Lloyd Shapley, insanları en mutlu olacakları şekilde eşleştiren (örneğin öğrencileri kolejlere yerleştirmek için) "İstikrarlı Evlilik Problemi" algoritmasını tasarladılar. Herkesin bir tercih listesi yaptığı ve adım adım (iteratif) eşleşmelerin gerçekleştirildiği bu harika tasarım, yaratıcılarına 2012 yılında Nobel Ödülü kazandırdı. Neden mi? Çünkü bugün dünyanın dört bir yanındaki hastanelerde, böbrek nakli bekleyen binlerce hasta ile bağışçıları (uyumsuzluk problemleri çaprazlamayla aşılarak) bu algoritma sayesinde sadece 30 dakika içinde eşleştirilmekte ve kelimenin tam anlamıyla hayat kurtarılmaktadır.

Doğanın Gücü (Heuristics) ve Gezgin Satıcı Problemi

Her problemin mükemmel bir algoritmayla çözülebileceği en büyük yanılgıdır. Gezgin Satıcı Problemi (Traveling Salesman Problem) buna örnektir: Bir kargocunun aynı şehre bir daha uğramadan tüm şehirleri gezeceği en kısa rota hangisidir? Şehir sayısı sadece 10 olduğunda bile 1.8 milyon olasılık, şehir sayısı biraz arttığında ise trilyonlarca olasılık çıkar. Dünyadaki tüm bilgisayarları birleştirseniz bile bu olasılıkları denemek yüzyıllar sürer.

Çözüm: Doğadan İlham Almak (Sezgisel / Heuristic Yaklaşım) Bu tarz imkansız yerlerde, tıpkı nektar arayan arılar gibi davranan sezgisel (heuristic) algoritmalar devreye girer. Arılar her zaman %100 kusursuz ve en kısa yolu bulamasalar da, çok kısa bir sürede yaşamaları için "yeterince kısa ve pratik" olan rotayı bulurlar. Bugün Londra'daki dünyanın en yoğun havalimanı Heathrow Hava Trafik Kontrolü, kargo uçağı filolarının rotaları ve online market zincirlerindeki otonom robotların yörüngeleri tamamen bu "arılardan ilham alınan" sezgisel algoritmalar sayesinde saniyeler içinde hesaplanmakta, böylece yılda milyonlarca litre yakıt tasarrufu sağlanmaktadır.

Gelecek: Makine Öğrenmesi (Machine Learning)

Şimdiye kadar tüm bu kuralları (algoritmaları) insanlar bilgisayarlar için yazdı. Ancak artık bir devrim yaşanıyor: Makine Öğrenmesi (Machine Learning). Microsoft Kinect'te insan vücudunu anında tanıyan iskelet sistemlerinden, hastaların MR taramalarından dakikalar içinde 3 boyutlu beyin tümörü haritası çıkaran sistemlere kadar, artık bilgisayarlar doğrudan verileri okuyor ve kendi algoritmalarını kendileri yazarak evrimleşiyorlar.

Sonuç

Programlama dünyasına attığınız bu devasa adımda, bir bilgisayarın nasıl 1 ve 0'larla çalıştığından (Makine Dili), yazdığınız kodların arka planda nasıl derlendiğine; "Maliyet Modeli" ve "Büyüme Dereceleri"ni (N log N) dikkate alarak nasıl bilimsel algoritma analizi yapacağınızdan, hayatımızı kurtaran Gale-Shapley'e kadar muazzam bir mühendislik vizyonu kazandınız.

Unutmayın; kod yazmak işin sadece amelesidir, asıl mühendislik, o kodu yazmadan önce kağıt üzerinde kurduğunuz zekice, ölçeklenebilir ve matematiksel olarak ispatlanmış algoritmada yatar!

Şimdi, zihninize kazıdığınız bu mühendislik ve problem çözme altyapısını görsel bir haritaya dökmek için bir sonraki dersimizde Akış Diyagramlarına (Flowcharts) ve Sözde Kodlama Kurallarına geçiş yapacağız!

 

Kaynaklar ve Dosyalar

9 - Programlama Temelleri
Document · 9,8 MB
İndir