Bir cümlelik özet
Aynı problemi çözmenin birden fazla yolu vardır ve bu yolları doğruluk, basitlik, hız ve güvenlik gibi ölçütlerle karşılaştırarak duruma en uygun olanı seçeriz.
Neden önemli?
Bir problemi çözecek ilk fikir aklımıza geldiğinde çoğu zaman "tamam, oldu" deyip durmak isteriz. Ama bir çözümün çalışması, onun en iyi çözüm olduğu anlamına gelmez. Aynı sonuca ulaşan iki farklı yol düşünelim: biri kısa ve anlaşılır, diğeri uzun ve karışık olabilir. İkisi de doğru cevabı verir; fakat birini okumak ve düzeltmek çok daha kolaydır.
Gerçek projelerde çözümler yalnız çalıştıkları için değil, aynı zamanda hızlı, güvenli ve anlaşılır oldukları için tercih edilir. Bu yüzden "çalışıyor mu?" sorusunun yanına "başka nasıl çözülebilirdi ve hangisi daha iyi?" sorusunu da eklemeyi öğreniyoruz.
Aynı probleme farklı algoritmalar
Bir problemin tek bir doğru çözümü olmak zorunda değildir. Genellikle aynı hedefe götüren birkaç farklı yol vardır. Bu yollara algoritma dediğimizi önceki derslerden hatırlıyoruz: bir amacı gerçekleştirmek için izlenen açık adımlar bütünü.
Bir örnek düşünelim: 1'den 100'e kadar olan tüm sayıları toplamak istiyoruz. Bunu en az iki şekilde yapabiliriz.
Yol 1: Döngüyle tek tek toplamak
Sayıları birer birer alıp bir toplam değişkeninde biriktiririz.
Başla
toplam = 0
1'den 100'e kadar her sayı için
toplam = toplam + sayı
toplam'ı yaz
Bitir
Bu yol 100 kez toplama işlemi yapar. Adım adım ilerlediği için aklımızda canlandırması kolaydır.
Yol 2: Formülle bir kerede hesaplamak
Matematikte 1'den n'ye kadar sayıların toplamı için hazır bir formül vardır: n × (n + 1) / 2.
Başla
n = 100
toplam = n * (n + 1) / 2
toplam'ı yaz
Bitir
Bu yol yalnız bir çarpma, bir toplama ve bir bölme yapar. Yani üç işlemle biter.
İki yol da aynı sonucu verir: 5050. Ama biri 100 adım, diğeri 3 adım kullanır. Sonuç aynıyken adım sayısı çok farklı olabilir.
Karşılaştırma ölçütleri
Peki iki çözümden hangisinin daha iyi olduğuna nasıl karar veririz? Birkaç ölçüte birlikte bakarız.
Doğruluk
En temel ölçüt budur: Çözüm gerçekten doğru sonucu veriyor mu? Doğru olmayan bir çözüm, ne kadar hızlı olursa olsun işe yaramaz. Bu yüzden önce doğruluğu kontrol ederiz.
Basitlik ve okunabilirlik
Bir çözümü sonradan başka biri (ya da birkaç hafta sonra sen) okuyup anlayabilir mi? Kısa ve düzenli bir çözüm, uzun ve karışık bir çözüme göre daha kolay düzeltilir ve geliştirilir.
Hız ve adım sayısı
Çözüm sonuca kaç adımda ulaşıyor? Yukarıdaki toplama örneğinde formül yolu üç işlemle biterken döngü yolu yüz işlem yapar. Küçük sayılarda fark önemsizdir; ama sayı milyonlara çıktığında bu fark çok büyür.
Kaynak ve güvenlik
Çözüm ne kadar bellek, pil ya da zaman harcıyor? Bir robotta çalışan bir algoritma güvenli mi, yoksa robotu bir engele mi çarptırıyor? Kaynak sınırlı olduğunda ve fiziksel bir sistem söz konusu olduğunda bu ölçüt öne çıkar.
Günlük hayattan örnek: Robot engeli nereden geçmeli?
Bir robotun önünde bir engel var ve karşıya geçmesi gerekiyor. Engeli sağdan da soldan da dolaşabilir. İki çözüm de robotu hedefe ulaştırır, yani ikisi de doğrudur.
Sağdan geçen çözüm
Eğer engel önümde ise
sağa dön
iki kare ilerle
sola dön
iki kare ilerle
sola dön
Soldan geçen çözüm
Eğer engel önümde ise
sola dön
iki kare ilerle
sağa dön
iki kare ilerle
sağa dön
Bu iki çözüm neredeyse aynı sayıda adım kullanır. O zaman seçimi başka ölçütler belirler: Sağ tarafta bir duvar mı var? Sol taraftaki zemin daha mı güvenli? Robotun sensörü hangi tarafı daha iyi görüyor? Adım sayısı eşit olduğunda güvenlik ve ortam koşulları karar verdirir.
Bu yüzden "hangisi daha iyi?" sorusunun cevabı her zaman ölçütlere ve duruma bağlıdır.
Python'da iki yolu görelim
Toplama örneğinin iki yolunu gerçek kodda karşılaştıralım.
# Yol 1: Döngüyle toplama
toplam = 0
for sayi in range(1, 101):
toplam = toplam + sayi
print("Döngü sonucu:", toplam)
# Yol 2: Formülle toplama
n = 100
toplam = n * (n + 1) // 2
print("Formül sonucu:", toplam)
Her iki print de aynı değeri yazar: 5050. Kodun mantığı farklı olsa da sonuç aynıdır. Burada // işareti, bölme sonucunun tam sayı kısmını verir.
"Yeterince iyi" çözüm
Her problem için en hızlı, en kısa ve en zarif çözümü bulmak zorunda değiliz. Çoğu zaman yeterince iyi bir çözüm işi görür.
Örneğin okul ödevi için 1'den 100'e kadar toplamı bulacaksan döngü yolu da tamamen kabul edilebilir; üç adımlık formülü bilmesen de olur. Ama bir program milyonlarca sayıyı saniyede binlerce kez topluyorsa, o zaman formül yolu gerçekten önemli hale gelir.
"Yeterince iyi" demek, ölçütleri göz ardı etmek değildir. Duruma bakıp hangi ölçütün gerçekten önemli olduğuna karar vermektir. Bazen okunabilirlik hızdan daha değerlidir; bazen tam tersi.
Mini uygulama
Bir kağıda "1'den 20'ye kadar sayıların toplamını bulma" problemi için iki farklı çözüm yaz:
- Döngüyle tek tek toplayan bir sözde kod yaz.
- Formülle (
n * (n + 1) / 2) hesaplayan bir sözde kod yaz.
Sonra şu tabloyu doldur:
| Ölçüt | Döngü yolu | Formül yolu |
|---|---|---|
| Doğru sonucu veriyor mu? | ||
| Kaç işlem yapıyor? | ||
| Okuması kolay mı? |
En sonda kendine şunu sor: Bu problem için hangisi "yeterince iyi"? Neden?
Uygulama laboratuvarı: Birden Fazla Çözümü Karşılaştırmak
Birden Fazla Çözümü Karşılaştırmak konusunu kalıcı hâle getirmenin en iyi yolu, kavramı küçük ve ölçülebilir bir göreve dönüştürmektir. Bu çalışmada Aynı probleme farklı algoritmalar ile Yol 2: Formülle bir kerede hesaplamak arasındaki ilişkiyi kullanarak açık bir algoritma, sözde kod ve test tablosu hazırlayacaksın. Amaç yalnız sonucun çalışması değil; hangi kararı neden verdiğini, neyi test ettiğini ve hangi durumda tasarımı değiştireceğini açıklayabilmektir.
Görev senaryosu
Şu senaryoyu ele al: günlük görevleri öncelik sırasına koyan küçük bir planlayıcı. Dersin ana hedefi “Aynı probleme birden fazla çözümü doğruluk, basitlik, hız ve güvenlik açısından karşılaştırmayı öğren” olduğuna göre önce problemi tek cümleyle tanımla. Ardından sistemin alacağı girdiyi, uygulayacağı işlemi ve üreteceği çıktıyı ayrı ayrı yaz. Bilmediğin bir ayrıntı varsa onu varsayım olarak işaretle; varsayımı gerçek bilgi gibi kullanma.
- Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
- En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
- Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
- Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
- Tek değişiklik yap: Aynı anda birçok şeyi değiştirmek yerine bir kararı düzeltip testi yeniden çalıştır.
Başarı ölçütleri
- Adımlar açık ve tek anlamlı mı?
- Başlangıç ve bitiş koşulu belli mi?
- Normal, sınır ve hatalı durumlar denendi mi?
- Gereksiz tekrar veya adım var mı?
- Başka biri algoritmayı aynı sonuçla uygulayabiliyor mu?
“Birden Fazla Çözümü Karşılaştırmak” çalışmasını bitirdiğinde ürünü bir arkadaşına yalnız bölüm başlıklarıyla anlat. Arkadaşın günlük görevleri öncelik sırasına koyan küçük bir planlayıcı senaryosundaki adımları ve karar nedenlerini takip edebiliyorsa anlatım yeterince açıktır. Anlaşılmayan noktayı daha fazla terim ekleyerek değil, Aynı probleme farklı algoritmalar ve Yol 2: Formülle bir kerede hesaplamak ilişkisini daha küçük adımlara bölerek düzelt.
Sık yapılan hatalar
Yalnız çalışmasına bakmak
En sık yapılan hata, "çalışıyor, o hâlde bitti" demektir. Bir çözüm çalışabilir ama okunması çok zor, güvensiz ya da gereksiz yavaş olabilir. Çalışmak gerekli bir ölçüttür, ama tek ölçüt değildir.
Okunabilirliği ve güvenliği yok saymak
Bir robotu hedefe götüren iki yoldan biri onu tehlikeli bir kenardan geçiriyorsa, adım sayısı az diye o yolu seçmek doğru olmaz. Aynı şekilde, kimsenin anlamadığı bir kodu ilerde düzeltmek çok zorlaşır.
Erken iyimserlik
İlk aklımıza gelen çözüme aşırı güvenip başka yolları hiç düşünmemek de bir hatadır. "Kesinlikle en iyisi bu" demeden önce en az bir alternatif düşünmek genellikle daha iyi bir seçim yaptırır.
Ders özeti
- Aynı problemin çoğu zaman birden fazla doğru çözümü vardır.
- Çözümleri doğruluk, basitlik/okunabilirlik, hız/adım sayısı ve kaynak/güvenlik ölçütleriyle karşılaştırırız.
- 1'den 100'e toplamı döngüyle 100 adımda, formülle 3 adımda bulunabilir; sonuç aynıdır.
- Adım sayısı eşit olduğunda güvenlik ve ortam koşulları seçimi belirleyebilir.
- "Yeterince iyi" çözüm, ölçütleri göz ardı etmek değil, duruma göre önceliği doğru seçmektir.
Kontrol soruları
- Bir çözümün çalışıyor olması, onun en iyi çözüm olduğu anlamına gelir mi?
- Çözümleri karşılaştırırken kullandığımız dört ölçütü say.
- 1'den 100'e kadar toplamı döngü ve formül yollarıyla bulduğumuzda sonuçlar aynı mı olur? Adım sayıları için ne söyleyebilirsin?
- Bir robot engeli sağdan ve soldan aynı sayıda adımda geçebiliyorsa, seçimi ne belirler?
- "Yeterince iyi çözüm" ne demektir?
Cevaplar
- Hayır. Çalışmak sadece doğruluk ölçütünü karşılar. Bir çözüm okunabilirlik, hız ya da güvenlik açısından zayıf olabilir; bu yüzden çalışması tek başına en iyi olduğunu göstermez.
- Doğruluk, basitlik/okunabilirlik, hız/adım sayısı ve kaynak/güvenlik.
- Sonuçlar aynıdır (5050). Ama döngü yolu yaklaşık 100 işlem yaparken formül yolu yalnız 3 işlem yapar; yani adım sayıları çok farklıdır.
- Adım sayısı eşit olduğunda güvenlik ve ortam koşulları belirler: Hangi tarafta engel/duvar var, hangi zemin daha güvenli, sensör hangi tarafı daha iyi görüyor gibi.
- Duruma göre gerekli ölçütleri karşılayan, işi gören çözümdür. En hızlı veya en kısa olması şart değildir; hangi ölçütün önemli olduğuna bakılarak seçilir.
Kaynak ve doğrulama notu
“Birden Fazla Çözümü Karşılaştırmak” dersi için doğrulama odağı Aynı probleme farklı algoritmalar ile Yol 2: Formülle bir kerede hesaplamak arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Bu dersteki algoritmalar, örnek girdiler elle izlenerek ve beklenen çıktılarla karşılaştırılarak doğrulanmıştır. Sözde kod, belirli bir programlama diline bağlı kalmadan düşünme sırasını görünür kılmak için kullanılır.
Sonraki ders
Algoritma Mini Projesi: Akıllı Çanta Kontrolü