← Algoritmalar

Algoritmalar · Ünite 1

Algoritmalar: Temel Kavramlar

1. Algoritma nedir?

Algoritma, bir problemi çözmek ya da bir hesabı yapmak için yazılmış, sırası belli ve sonu olan adımlar listesi. Veriyi girdi olarak alır, adımları uygular, sonunda bir çıktı verir. Bilgisayar programı da aslında bu adımların bilgisayarın çalıştırabileceği hâlidir.

Girdi → kurallar → çıktı. Örnek: bir sayı listesini sıralamak.

Sayılarla ifade edilebilen problemlere hesaplamalı problem denir. «Bu listeyi küçükten büyüğe diz» tipik bir örnek; bu işi yapan algoritmalara sıralama algoritması denir.

Örnek: çıkararak bölme

Bölme aslında art arda çıkarmadır. 23'ü 4'e bölelim: 23'ten 4 çıkar (19), bir daha (15), bir daha (11), (7), (3). 5 kez çıkarabildik, geriye 3 kaldı → bölüm 5, kalan 3. Algoritma şöyle yazılır:

Üçüncü adımdaki gibi bir şart sağlandığı sürece tekrar eden kod parçasına döngü denir.

Kısa tarihçe

2. İyi bir algoritmanın altı özelliği

ÖzellikNe demek?
GirdiHangi veriyle çalışacağı net tanımlı olmalı (ör. «pozitif sayı listesi»).
ÇıktıNe üreteceği belli olmalı: türü, miktarı.
AçıklıkHer adım tek anlamlı olmalı. «a x b» çarpım mı, üç değişken mi? a·b gibi net yazılmalı.
SonlulukBir noktada durmalı: ya sonucu verir ya da «çözüm yok» der.
Başarım ve performansSonuca ulaşmalı (başarım) ve bunu gereksiz adım atmadan, kaynağı az harcayarak yapmalı (performans).
BağımsızlıkBelirli bir dile ya da cihaza bağlı olmamalı; her dilde yazılabilmeli.

Verimlilik: zaman ve alan

Bilgisayarın en değerli iki kaynağı işlemci zamanı ve bellek (RAM). Algoritmanın verimliliği bu ikisini ne kadar harcadığına göre ölçülür.

Birkaç bin çevrim küçük görünebilir, ama hava durumu tahmini, oyunlar ya da şifreleme milyarlarca veriyle çalışır. Orada küçük bir israf bile ciddi maliyet ya da hiç sonuç alamamak demek.

3. Algoritma türleri

Tür, aslında problemi çözerken izlenen strateji. Aynı problem farklı stratejilerle çözülebilir.

Arama motoru ve şifreleme

Açgözlü (greedy)

Her adımda o an en iyi görünen seçimi yapar, geriye dönüp bakmaz. Hızlıdır ama en iyi sonucu garanti etmez.

Özyinelemeli (recursive)

Fonksiyon problemi çözmek için kendi kendini çağırır. Klasik örnek faktöriyel: 4! = 4 · 3!, 3! = 3 · 2!… ta ki 1! = 1'e kadar. Sonra değerler geri dönerken çarpılır: 1 → 2 → 6 → 24.

Kaba güç (brute-force)

Strateji yok, bütün ihtimalleri tek tek dener. 4 haneli bir şifreyi 0000'dan 9999'a kadar denemek gibi: en fazla 10.000 deneme. Sitelerdeki CAPTCHA doğrulaması, bu tür otomatik denemeleri engellemek için var.

Sıralama

Veriyi belli bir kurala göre dizer; sıralı veri hem okunması hem aranması kolay veridir. Çok sık yapıldığı için birçok stratejisi var: kabarcık, seçmeli, hızlı sıralama, tümleştirerek ayıklama…

Kabarcık sıralaması (bubble sort) en kolay anlaşılanı: yan yana iki sayıya bakar, yanlış sıradaysa yerlerini değiştirir. Listeyi baştan sona tekrar tekrar tarar; hiç değişiklik yapmadığı turda durur.

1. tur: en büyük sayı kabarcık gibi sona çıkıyor.

2. turda 7 ile 4 yer değiştirir → 2 4 7 9. 3. turda hiç değişiklik olmaz, algoritma durur. 4 elemanlı listede her tur 3 karşılaştırma yapar (eleman sayısının bir eksiği).

Gerileme (backtracking)

Bir seçim yapar, ilerler; çıkmaza girerse son seçime geri dönüp başka bir değer dener. Sudoku buna çok uygun: bir kutuya 4 yazdın, ilerde bir satırda iki tane 6 çıktı mı? Geri dön, o 4'ü değiştir. Kaba gücün akıllandırılmış hâli sayılır.

Böl ve fethet (divide and conquer)

Klasik örnek tümleştirerek ayıklama (merge sort): liste tek elemanlı parçalar kalana kadar ikiye bölünür, sonra parçalar sıralı biçimde birleştirilerek sıralı tam liste kurulur.

Dinamik programlama

Bu da problemi alt problemlere böler, ama farkı şu: çözdüğü alt problemlerin sonucunu saklar ve aynısı tekrar lazım olunca baştan hesaplamaz. Özünde özyinelemenin hızlandırılmış hâlidir.

Örnek Fibonacci dizisi: her terim önceki iki terimin toplamı → 0, 1, 1, 2, 3, 5, 8, 13… Düz özyinelemeyle fib(4)'ü hesaplarken aynı işler tekrar tekrar yapılır:

Kırmızı kollar aynı hesabın tekrarı.

Çözüm: sonuçları bir diziye yazmak. Fonksiyon önce diziye bakar; değer varsa hemen döndürür, yoksa hesaplar ve diziye yazar. Bu tekniğe memoization (sonucu not alıp tekrar kullanma) denir.

Karıştırma (hashing)

Her uzunluktaki girdiyi sabit uzunlukta bir çıktıya (hash değeri) dönüştürür. MD5 32, SHA256 64 karakterlik çıktı verir. Girdideki tek bir harfin büyük-küçük olması bile çıktıyı tamamen değiştirir.

Asıl özelliği: geri çevrilemez. Bu yüzden siteler şifreni değil, şifrenin hash değerini saklar; girişte de hash'leri karşılaştırır.

Rastgele (randomized)

Zaman ve bellek kısıtlıysa her ihtimali denemek yerine rastgele örnekler seçer. Kesin sonuç garanti etmez ama kabul edilebilir bir sonucu hızlıca verir. Bir şehirdeki herkesle konuşmak yerine rastgele seçilmiş birkaç yüz kişiyle anket yapmak gibi.

Ünlü örneği Monte Carlo yöntemi: bir karenin içine rastgele noktalar at, çeyrek çemberin içine düşenleri say. π ≈ 4 × (içeridekiler / toplam). Nokta sayısı arttıkça sonuç 3,14'e yaklaşır.

Hepsi bir arada

TürTek cümlede
Arama motoruKelimeye göre veri tabanında arar.
ŞifrelemeAnahtarla kilitler, anahtarla açar.
AçgözlüHer adımda o anın en iyisini seçer.
ÖzyinelemeliKendini daha küçük girdiyle çağırır.
Kaba güçBütün ihtimalleri dener.
SıralamaVeriyi kurala göre dizer.
GerilemeÇıkmazda geri dönüp başka yol dener.
Böl ve fethetBöler, çözer, birleştirir.
Dinamik programlamaAra sonuçları saklar, tekrar hesaplamaz.
KarıştırmaSabit uzunlukta, geri çevrilemez özet üretir.
RastgeleRastgele örneklerle yaklaşık sonuç bulur.

Kendini test et!

Cevabı görmek için soruya dokun.

  1. 1.17'yi 5'e çıkarma yoluyla bölen algoritma kaç kez döner, bölüm ve kalan kaç olur?

    ✓ 17 → 12 → 7 → 2: üç kez döner. Bölüm 3, kalan 2.

  2. 2.Bir algoritma bazı girdilerde hiç durmuyorsa hangi özelliği ihlal eder?

    ✓ Sonluluk.

  3. 3.Zaman karmaşıklığı neden saniyeyle değil işlemci çevrimiyle ölçülür?

    ✓ İşlemcilerin hızı farklı olduğu için aynı algoritma farklı bilgisayarlarda farklı sürede biter. Çevrim sayısı ise cihazdan bağımsızdır.

  4. 4.(5, 1, 4) listesine kabarcık sıralamasının 1. turu uygulanınca liste ne olur?

    ✓ 5 ile 1 yer değiştirir → (1, 5, 4); 5 ile 4 yer değiştirir → (1, 4, 5).

  5. 5.Dinamik programlamayı düz özyinelemeden ayıran fark nedir?

    ✓ Alt problemlerin sonuçlarını saklayıp yeniden kullanır; aynı hesabı tekrar yapmaz.

  6. 6.Sitelerin şifreni değil hash değerini saklaması neden güvenlidir?

    ✓ Hash geri çevrilemez; veri tabanı ele geçse bile orijinal şifreye ulaşılamaz.

  7. 7.AES ile RSA arasındaki anahtar farkı nedir?

    ✓ AES şifreleme ve çözmede aynı anahtarı kullanır (simetrik). RSA genel ve özel olmak üzere iki ayrı anahtar kullanır.

Kaynak: Anadolu Üniversitesi Açıköğretim Fakültesi, «Algoritmalar» ders kitabı, Ünite 1. Bu not kitabın yerine geçmez; konuyu kendi cümlelerimle, yapay zekâ desteğiyle özetledim.