Dijital Dünyanın Görünmez Çarkları: Algoritmalar, Verimlilik ve Modern Algoritma Türleri
1. Giriş: Yaşamımızın Merkezindeki Görünmez Güç
Günlük yaşantımızın büyük bir bölümü bilgi ve bilgi işlemeye dayalı süreçlerle şekillenmektedir. İnternet üzerinden alışveriş yaptığımız e-ticaret platformları, ders katılımı sağladığımız e-öğrenme sistemleri, finansal işlemlerimizi yürüttüğümüz e-bankacılık uygulamaları ve dijital eğlence sistemleri gibi pek çok bilişim altyapısı hayatımızın tam merkezinde yer almaktadır. Tüm bu sistemlerin verileri nasıl işleyeceğini, arkada dönen süreçlerin hangi adımlarla yürütüleceğini belirleyen temel yapı taşı ise algoritmalardır. Oyunlardan bankacılık yazılımlarına kadar her dijital çözümün özünde, bilgisayarlara verilen görevleri hangi sırayla ve nasıl yapması gerektiğini söyleyen kurallar bütünü bulunur. Bilgisayar yazılımları, en yalın tanımıyla bu algoritmaların bilgisayarlar tarafından işletilebilen biçimleridir.
En temel tanımıyla bir algoritma; verileri girdi olarak alan, bu veriler üzerinde iyi tanımlanmış prosedürleri işleten ve işlemlerin sonucunda anlamlı bir çıktı üretebilen hesaplama fonksiyonlarıdır.
"Algoritma kavramı, bir problemin çözümü için sonlu sırada iyi tanımlanmış kurallar kümesi şeklinde tanımlanmaktadır."
(Arifoğlu ve diğerleri, 2006)
"Algoritmalar verileri girdi olarak alan, bu veriler üzerinde iyi tanımlanmış prosedürleri işleten ve bu işlemlerin sonucunda çıktı üreten hesaplama prosedürleridir."
(Cormen ve diğerleri, 2011)
Algoritmalar aynı zamanda hesaplamalı problemleri (computational problems) çözen araçlardır. Hesaplamalı problem, problem durumunun matematiksel olarak ifade edilmesi ve girdiler üzerinde çalışabilecek işlem adımlarının net şekilde tanımlanması anlamına gelir.
- Sıralama Problemi Örneği: Verilen bir sayı listesinin küçükten büyüğe sıralanması klasik bir hesaplamalı problemdir.
- Girdi: a1, a2, ..., an şeklinde bir sayı listesi (Örn: 14, 3, 22, 90, 6)
- Çıktı: Girdi listesinin a′1 ≤ a′2 ≤ ... ≤ a′n kuralına göre yeniden düzenlenmiş hali (Örn: 3, 6, 14, 22, 90)
- Çıkarma Yoluyla Bölme Örneği: Bölme işlemi, özünde ardışık çıkarma işleminden ibarettir. Bir bölünen sayıdan bölen sayının tekrarlanarak çıkarılması prensibine dayanır. Süreç şu adımlarla işler:
- Bölünen, bölen ve bölüm (başlangıçta 0) değerleri tanımlanır.
- Bölen sayının sıfıra eşit olup olmadığı kontrol edilir; eğer sıfırsa "sıfıra bölme hatası" verilerek program durdurulur (çünkü sıfıra bölme matematiksel olarak tanımsızdır).
- Bölünen sayı bölenden büyük olduğu sürece çalışacak bir döngü başlatılır: Her adımda bölen sayı bölünenden çıkarılır ve bölüm değeri 1 artırılır.
- Örneğin, 32 bölünen ve 5 bölen için döngü ilk adımda bölüneni 27, bölümü 1 yapar; ikinci adımda bölüneni 22, bölümü 2 yapar. Altıncı adımın sonunda bölünen 2, bölüm 6 kalır. Bölünen (2) artık bölen değerinden (5) büyük olmadığından döngü sona erer ve ekrana bölüm: 6, kalan: 2 yazdırılır.
2. Antik Çağlardan Modern Bilgisayarlara: Algoritmaların Tarihsel Yolculuğu
Algoritma kavramı modern bilgisayarların icadından çok önce, insanlığın karmaşık hesaplama ihtiyaçlarıyla birlikte doğmuştur:
- Babilliler (MÖ 2500) ve Mısırlılar (MÖ 1550): Bölme işlemleri için belirli sıralı işlem adımlarına dayanan algoritmalar kullanmışlardır.
- Antik Yunan (MÖ 240): Asal sayıları tespit etmek amacıyla Eratosten Kalburu, iki sayının en büyük ortak bölenini (EBOB) bulmak için ise Öklid Algoritması geliştirilmiştir.
- 9. Yüzyıl Arap Matematikçileri: Kindî, kriptoloji alanında şifre kırma işlemleri için frekans analizine dayalı algoritmalar geliştirmiştir.
- 18. ve 19. Yüzyıllar: Araplar ve Ruslar tarafından dört işlem verimliliğini artıran iki temel çarpma algoritması kullanıma sunulmuştur.
Harezmi ve İsim Kökeni
"Algoritma" kelimesinin kökeni, 9. yüzyılda bugün Özbekistan sınırlarında yer alan Harezm bölgesinde yaşamış olan büyük matematikçi, coğrafyacı ve astronom Muhammed İbn Musa el-Harezmi'nin adından gelmektedir. Harezmi'nin kaleme aldığı Hisab el-Cebir ve el-Mukabala (Cebir ve Kıyaslama) adlı eser, tarihteki ilk cebir kitabı ve ilk algoritma koleksiyonu kabul edilir.
Harezmi bu eseri akademisyenler veya alimler için değil; halkın ticaret, miras dağıtımı, vasiyet, üleştirme, hukuk davaları, arazi ölçümü, kanal açılması ve geometrik hesaplamalar gibi günlük işlerini kolayca yapabilmesi için kaleme almıştır. Kitabın en dikkat çekici yanı, içinde tek bir denklem veya rakam bulunmaması; tüm adımların herkes tarafından uygulanabilecek kadar sade ve açık bir dille anlatılmış olmasıdır. Harezmi, Orta Çağ'ın sonlarına kadar Avrupa'da en çok okunan matematikçi olmuştur.
Modern Dönem ve Kuramsal Çalışmalar
Batı dillerinde algoritma kavramı ilk kez 13. yüzyılda (Chaucer ve Alexandre de Villedieu) ondalıklı sayılarla hesap yapmayı ifade etmek için kullanılmıştır. Modern anlamını ise 19. yüzyılda kazanmıştır.
Algoritmaların insan eliyle yürütülen kağıt üzerindeki aritmetik adımlardan, bilgisayarlarca yürütülebilen soyut makine modellerine dönüşmesi 20. yüzyılın başındaki kuramsal çalışmalarla gerçekleşmiştir. David Hilbert'in 1928'de ortaya attığı karar verme problemi (Entscheidungsproblem) ile ivme kazanan bu süreç, "etkili hesaplanabilirlik" (effective calculability) modellerinin doğmasını sağlamıştır:
- Gödel, Herbrand ve Kleene'nin özyineleme fonksiyonları (1930-1935)
- Alonzo Church'ün Lambda Cebiri (1936)
- Emil Post'un Formülasyon 1 modeli (1936)
- Alan Turing'in Turing Makinesi (1936-1939)
3. Bir Algoritmanın "Algoritma" Olabilmesi İçin Gereken 6 Temel Özellik
Bir işlem dizisinin geçerli bir algoritma sayılabilmesi için taşıması gereken 6 temel yapı taşı bulunmaktadır:
- Girdi (Input): Algoritmanın üzerinde çalışacağı veri kümesidir. Girdinin karakteristikleri (örneğin "pozitif tam sayılar listesi") çok net tanımlanmalıdır. Aksi halde algoritma beklenmeyen veri tipleriyle karşılaştığında hata verir veya yanlış çıktılar üretir.
- Çıktı (Output): Verilerin işlenmesi sonucunda elde edilen sonuç kümesidir. Her algoritma en az bir veya daha fazla iyi tanımlanmış çıktı üretmek zorundadır.
- Açıklık (Clarity): Algoritmadaki her adım açık, net ve tek bir anlama gelecek şekilde tanımlanmalıdır. Günlük dildeki belirsizliklerden kaçınılmalıdır. Örneğin iki sayının çarpımı gösterilirken a × b ifadesi hem a ile b'nin çarpımı hem de a, x, b değişkenlerinin çarpımı şeklinde algılanabilir. Benzer şekilde a · b kullanımı metin içinde ondalık noktalarıyla karıştırılabilir. Bu tür karmaşalardan kaçınmak için algoritmalarda ve kodlarda
a*bgibi tamamen net ifadeler tercih edilmelidir. Ayrıca sıfıra bölme gibi olası hata durumlarında ne yapılacağı baştan tanımlanmalıdır. - Sonluluk (Finiteness): Bir algoritma sonsuza kadar çalışamaz. Belirli sayıda adımdan sonra bir çıktı üreterek veya çözümsüzlük bildirerek mutlaka durmalıdır.
- Başarım ve Performans (Effectiveness & Performance): Bilgisayar kaynaklarının (işlemci süresi ve bellek) en verimli şekilde kullanılmasıdır. Sonuca katkısı olmayan adımlardan kaçınılmalıdır. Örneğin, bir sayının asal olup olmadığını anlama algoritmasında, sayının karekökünden büyük bölenleri aramak gereksiz bir işlem yüküdür.
- Bağımsızlık (Independence): Algoritmalar herhangi bir programlama diline (C#, Python vb.) ya da donanım mimarisine bağımlı değildir. Tasarlanan mantık her türlü platformda (mobil, masaüstü, sunucu) uygulanabilir olmalıdır.
İstisnai Durum (Sonsuz Döngüler): Sonluluk kuralının istisnaları mevcuttur. Bazı sistemler sürekli çalışarak istek dinlemek üzere tasarlanır. Örneğin; dışarıdan gelen mesaj isteklerini dinleyen ağ/port programları, kullanıcı buton basışlarını bekleyen gömülü sistemler (çamaşır makineleri, DVD oynatıcılar) ve işletim sisteminde arka planda sürekli çalışan servisler (daemon) cihaz açık kaldığı sürece sonsuz döngüde kalacak şekilde yapılandırılır.
4. Algoritmaların Verimlilik Ölçütleri: Zaman ve Alan Karmaşıklığı
Bilgisayar sistemlerinde aynı anda onlarca program yürütülür. Sistemdeki en kıymetli ve sınırlı iki kaynak İşlemci Zamanı (CPU Time) ve Ana Bellek (RAM) alanıdır. Bir algoritmanın verimliliği, bu iki kaynağı ne kadar az tükettiği ile ölçülür.
Zaman Karmaşıklığı
Bir algoritmanın çalışma süresini kronometre tutarak saniye cinsinden ölçmek yanıltıcıdır; çünkü arka planda çalışan işletim sistemi süreçleri, işlemci yükü ve donanım mimarileri süreyi doğrudan etkiler. Farklı işlemcilerin bir saniyede yaptığı işlem sayısı (çevrim) tamamen farklıdır. Örneğin 1 GHz hızındaki bir işlemci saniyede 1 milyar çevrim yaparken, 3 MHz bir işlemci 3 milyon çevrim yapabilir. Bu nedenle zaman karmaşıklığı, algoritmanın tamamlanması için harcadığı işlemci çevrim sayısı (clock cycle) üzerinden hesaplanır. Aynı girdiyi işleyen iki algoritmadan biri 600 çevrim, diğeri 900 çevrim harcıyorsa, 600 çevrimlik algoritma zaman karmaşıklığı açısından daha verimlidir.
Alan Karmaşıklığı
Algoritmanın çalışması esnasında ihtiyaç duyduğu bellek miktarını ifade eder. Tanımlanan her değişken ve çağrılan her fonksiyon bellekte yer kaplar. Örneğin, her çağrısında 4 Bayt (B) bellek harcayan özyinelemeli bir faktöriyel fonksiyonu 1000! hesabını yaparken kendini 1000 kez çağırır ve yaklaşık 4 KB bellek tüketir. Bellekte saklama (dinamik programlama) yöntemleri kullanılarak bu bellek maliyeti düşürülebilir.
Milyarlarca veri biriminin işlendiği hava durumu simülasyonları, nükleer reaksiyon modellemeleri veya kriptografik işlemlerde zaman ve alan karmaşıklığındaki en küçük iyileştirmeler devasa maliyet tasarrufları sağlar ve sistemlerin kilitlenmesini engeller.
5. Modern Yazılım Dünyasını Şekillendiren 11 Temel Algoritma Türü
Problemlerin yapısına ve karşı karşıya olunan kısıtlara göre geliştirilmiş 11 temel algoritma yaklaşımı bulunmaktadır:
5.1. Arama Motoru Algoritmaları
Kullanıcıdan alınan metinleri ve mantıksal işleçleri (örneğin "izmir VE konser") girdi kabul ederek veri tabanları üzerinde sorgulama yapan ve en uygun sonuçları (web siteleri, restoranlar, kitaplar, kişiler) sıralayarak sunan algoritmalardır.
5.2. Şifreleme Algoritmaları
Veri güvenliğini ve gizliliğini sağlamak amacıyla girdileri karmaşık dönüşümlere tabi tutar. İki temel türü bulunur:
- Simetrik Anahtarlı Algoritmalar (AES): Şifreleme ve deşifre (çözümleme) işlemleri için birebir aynı anahtarı kullanır.
- Asimetrik Anahtarlı Algoritmalar (RSA): Şifreleme için genel anahtar (public key), deşifre için ise kişiye özel anahtar (private key) kullanır.
5.3. Açgözlü (Greedy) Algoritmalar
Her adımda, o an için mevcut veriler doğrultusunda "en iyi" görünen seçimi yapan optimizasyon yaklaşımıdır. Anlık yerel kararlara odaklandığı için her zaman küresel en iyi sonucu (global optimum) garanti etmez.
Örnek: Şehirler arası bir yolculuk çizgesinde (graph) toplam maliyeti en düşük yolu arayan açgözlü algoritma, her adımda sadece bir sonraki en kısa mesafeyi seçtiği için toplam maliyeti 11 olan kırmızı yolu seçebilir; oysa tüm harita incelendiğinde maliyeti 9 olan yeşil yolun varlığı görülecektir.
5.4. Özyinelemeli (Recursive) Algoritmalar
Bir problemi çözerken kendi kendisini daha küçük parametrelerle tekrar çağıran yapılardır.
- Faktöriyel Örneği:
faktöriyel(3)çağrıldığında, sistem3 × faktöriyel(2)işlemini yürütür.faktöriyel(2)ise2 × faktöriyel(1)sonucunu bekler. Taban koşula (1) ulaşıldığında değerler yukarı doğru çarpılarak sonuç (6) elde edilir.
5.5. Kaba Güç (Brute-Force) Algoritmalar
Hiçbir karmaşık strateji geliştirmeden tüm olası çözümleri sırayla deneyen yöntemdir. 4 haneli bir PIN kodunu bulmak için 0000'dan başlayıp 9999'a kadar tüm kombinasyonları denemek kaba güç yöntemidir. Sistemleri bu tür otomatiğe bağlanmış yazılımsal saldırılardan korumak için CAPTCHA doğrulama sistemleri kullanılır.
5.6. Sıralama Algoritmaları
Veri kümelerini belirli kurallara göre (küçükten büyüğe / büyükten küçüğe) dizeleyen algoritmalardır.
- Kabarcık Sıralaması (Bubble Sort): Yan yana duran iki elemanı karşılaştırır; yerleri yanlışsa değiştirir. Dizide hiçbir değişiklik yapılmayana kadar tüm liste taranır. Örneğin 5 elemanlı bir dizide iç döngü 4 karşılaştırma yapar; yer değiştirme yapıldığı sürece dış döngü tekrarlanır.
- Diğer Sıralama Stratejileri: Hızlı Sıralama (Quick Sort), Seçmeli Sıralama (Selection Sort) ve detaylarına Bölüm 5.8'de değineceğimiz Tümleştirerek Ayıklama (Merge Sort) en sık kullanılan diğer sıralama algoritmalarıdır.
5.7. Gerileme (Backtracking) Algoritmaları
Çözüm ağaçları oluşturarak ilerleyen ve çıkmaz sokağa girdiğinde geri adım atarak farklı dalları deneyen yaklaşımdır. Kaba güç algoritmalarının akıllıca iyileştirilmiş hali sayılır.
- 6×6 Sudoku Örneği: Algoritma sarı hücreye 4, yeşil hücrelere 2 ve 3 yerleştirir. Mavi hücreye 6 koymaya çalıştığında aynı bölgede başka bir 6 olduğunu görür ve kısıt ihlal edilir. Yerleştirdiği 2, 3 ve 6 sayılarını dener, çözüm oluşmayınca gerileme (backtrack) yaparak sarı hücredeki 4 sayısının yanlış olduğuna karar verir. Sarı hücreye 3 koyarak aramaya baştan devam eder.
5.8. Böl ve Fethet (Divide and Conquer) Algoritmaları
Problemi üç aşamada çözer:
- Böl: Ana problemi küçük alt problemlere ayır.
- Fethet: Alt problemleri bağımsız olarak çöz.
- Birleştir: Elde edilen alt çözümleri birleştirerek ana çözüme ulaş.
Klasik örneği Tümleştirerek Ayıklama (Merge Sort) algoritmasıdır. Dizi tekil elemanlar kalana kadar sürekli ikiye bölünür, ardından tekil elemanlar sıralı alt listeler halinde birleştirilerek tam sıralı dizi oluşturulur.
5.9. Dinamik Programlama Algoritmaları
Özyinelemeli algoritmaların bellek kullanımı ile optimize edilmiş halidir. Daha önce hesaplanan ara sonuçlar bellekte saklanır (Memoization: bellekte saklayıp optimize etme) ve tekrar ihtiyaç duyulduğunda yeniden hesaplanmak yerine bellekten okunur.
Fibonacci Dizisi Örneği:
| Fn = | { | 0, | n = 0 |
| 1, | n = 1 | ||
| Fn−1 + Fn−2, | n > 1 |
Standart özyineleme ile 5. Fibonacci sayısını bulmak için fib(3) işlemi defalarca tekrarlanır ve işlem yükü artar. Dinamik programlamada bir kontrolDizisi tanımlanır. fib(3) bir kez hesaplandığında sonuç diziye yazılır. Sonraki çağrılarda hesaplama yapılmadan doğrudan dizideki değer döndürülür; böylece işlemci yükü dramatik şekilde azalır.
5.10. Karıştırma (Hashing) Algoritmaları
Girdi olarak verilen verinin boyutu ne olursa olsun, sabit uzunlukta ve geri döndürülemez tek yönlü bir çıktı (hash value) üreten matematiksel fonksiyonlardır (one-way cryptographic function).
Karıştırma fonksiyonlarında girdideki tek bir harfin dahi değişmesi (örneğin 'a' yerine 'A' yazılması) tüm çıktı değerini radikal bir şekilde değiştirir; bu duruma literatürde Çığ Etkisi (Avalanche Effect) adı verilir.
| Fonksiyon | Girdi | Çıktı (Hash) |
|---|---|---|
| SHA256 | algoritma | 7b3adb94d765147b6247241b86e28f75839d0c13ae9edcf2abd807651db136e1 |
| SHA256 | Algoritma | bf086c4b2cb7afd88cfd4c8a31714d3bb79b85f14306c33a08beab49d252c232 |
| MD5 | algoritma | c3263cd6ce58a67fa4062b3538db8d1e |
| MD5 | Algoritma | b606baac4b57dddf58a5355c3a220d23 |
Karıştırma algoritmaları deşifre edilemez. Şifrelerin sunucularda açık metin olarak değil karıştırılmış haliyle saklanmasını sağlar. Ayrıca indirilen dosyaların orijinal olup olmadığını doğrulamak için kullanılır. Örneğin Windows komut satırında certutil -hashfile <dosya adı> MD5 komutu çalıştırılarak dosyanın bütünlüğü doğrulanabilir.
5.11. Rastgele (Randomized) Algoritmalar
Zaman ve bellek kısıtlarının çok dar olduğu durumlarda, tüm olasılıkları denemek yerine rastgele örneklemler seçerek kabul edilebilir ve gerçeğe yakınsayan sonuçlar üreten algoritmalardır.
- Müfettiş Analojisi: 20 okulu olan bir ilçede her okulda 500 öğrenci ve 50 öğretmen bulunmaktadır. Bir müfettişin okulları puanlamak için 11.000 görüşme yapması (kaba güç) 1 aylık sürede imkansızdır. Müfettiş bunun yerine her okuldan rastgele 10 öğrenci ve 3 öğretmen seçerek görüşürse (rastgele algoritma), kısıtlı zamanda kabul edilebilir bir değerlendirme puanı üretebilir.
- Monte Carlo Tekniği ile Pi Sayısı Tahmini: x ∈ [0, 1] ve y ∈ [0, 1] aralığında rastgele noktalar üretilerek 1 × 1 boyutlarında bir birim kare oluşturulur. Bu kare, Kartezyen düzlemde merkezi (0, 0) ve yarıçapı 1 birim olan bir çeyrek çemberi (quarter-circle) kapsar. Atılan noktaların orijine uzaklığı Pisagor teoremi (x2 + y2 ≤ 1) ile kontrol edilir; uzaklığı 1'den küçük eşit olanlar çeyrek çemberin içinde kalır. Çeyrek çemberin alanının birim kareye oranı π/4 olduğundan, Pi sayısı aşağıdaki formülle yakınsak olarak hesaplanır:
| π ≈ 4 × | Çemberin içindeki noktaların sayısı |
| Toplam nokta sayısı |
Rastgele üretilen nokta sayısı arttıkça elde edilen değer Pi sayısının gerçek değeri olan 3,14'e yakınsar.
6. Sonuç ve Günlük Hayatla İlişkilendirme
Yazılım mimarisinde bir algoritma tasarlamak; zaman karmaşıklığı, alan maliyeti ve elde edilen sonucun doğruluğu arasında kusursuz bir denge kurma sanatıdır. Doç. Dr. Alper Aytekin, Öğr. Gör. Dr. Fatma Sönmez Çakır, Yakup Bahadır Yücel ve İlknur Kulaözü tarafından kaleme alınan "Algoritmaların Hayatımızdaki Yeri ve Önemi" başlıklı bilimsel çalışmada da vurgulandığı üzere; algoritma nihai bir amaç değil, insanı doğru amaca en verimli şekilde ulaştıran yoldur.
Evimizde basit bir çay demlerken uyguladığımız işlem adımlarından, akıllı telefon kameralarının yüzümüzü algılamasına veya arama motorlarının milisaniyeler içinde milyonlarca sayfayı önümüze getirmesine kadar her dijital ve fiziksel eylem bir algoritma mantığıyla çalışır.
Başarılı ve nitelikli bir algoritmanın yalnızca doğru sonuca ulaşması yeterli değildir; sunduğu çözümün sade, hızlı, verimli, sonlu ve kanıtlanabilir olması gerekir. Günümüz dijital çağında karşılaştığımız karmaşık sorunları en kısa yoldan ve en düşük kaynak tüketimiyle çözebilmek, algoritmik düşünce yapısını benimsemekten ve bu görünmez çarkların çalışma ilkelerini hayatın her alanına entegre edebilmekten geçmektedir.

Yorumlar
Yorum Gönder