Bölüm 4.1: Algoritmalar
Çoktan Seçmeli · Problem ve Algoritma
Soru 1: Problem Tanımında Kısıt
“n sayısının faktöriyelini 64 bitlik tam sayı (Java long) ile hesapla” probleminin tanımında aşağıdakilerden hangisi bir kısıttır?
D: Kısıt, değerlerin sınırı ve geçerlilik koşuludur. A girdiyi, B çıktıyı, C ise doğrulama için küçük bir örneği tanımlar. 20! = 2.432.902.008.176.640.000 long'a sığar, 21! sığmaz; bu yüzden kısıt 0 ≤ n ≤ 20'dir.
Çoktan Seçmeli · Problem ve Algoritma
Soru 2: Hangisi Algoritma Değil?
İyi bir algoritma açık, sıralı, uygulanabilir ve sonlu olmalıdır. Aşağıdaki adım dizilerinden hangisi bu özelliklerden birini sağlamadığı için algoritma sayılmaz?
B: i 1'den başlayıp hep artar; i > 0 koşulu hiçbir zaman yanlış olmaz, adımlar sonsuza dek sürer (sonluluk bozulur). A'da i her turda büyür ve n'i geçince döngü biter; C ve D zaten tek bir karardan oluşur.
Çıktı Sorusu · Örnek Algoritmalar
Soru 3: Geçicisiz Takas
İki sayıyı küçükten büyüğe yazmak isteyen bir öğrenci gecici değişkenini kullanmamış. a = 7, b = 3 girilirse çıktı nedir?
oku a, b eğer a > b ise a = b b = a yaz a, b
Cevabı göster
Çıktı: 3 3
- 7 > 3 doğru → bloğa girilir.
a = b: a = 3; a'nın eski değeri 7 kaybolur.b = a: b = 3 (a artık 3).
Doğrusu: önce gecici = a, sonra a = b, b = gecici → 3 7.
Çoktan Seçmeli · Örnek Algoritmalar
Soru 4: Çarpımın Başlangıç Değeri
Faktöriyel algoritmasında sonuc = 1 yerine yanlışlıkla sonuc = 0 yazılırsa n = 5 için ne yazılır?
oku n eğer n < 0 ise "hata" yaz ve dur sonuc = 0 // hata burada i = 2 i ≤ n iken sonuc = sonuc × i i = i + 1 yaz sonuc
A: 0 × i her zaman 0'dır; döngü 4 kez döner ama sonuc hiç değişmez. Biriktiricinin başlangıç değeri işleme uygun seçilir: toplam için 0, çarpım için 1.
Çıktı Sorusu · Örnek Algoritmalar
Soru 5: Sınır Hatası
Faktöriyel algoritmasında döngü koşulu i ≤ n yerine i < n yazılmış. n = 5 ve n = 1 için çıktılar nedir?
oku n sonuc = 1 i = 2 i < n iken sonuc = sonuc × i i = i + 1 yaz sonuc
Cevabı göster
n = 5 → 24, n = 1 → 1
| i (tur başı) | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| i < 5 ? | doğru | doğru | doğru | yanlış |
| sonuc | 2 | 6 | 24 | — |
- i = 5 iken döngü biter; ×5 hiç yapılmaz: 4! = 24 hesaplanır (sınır hatası, off-by-one).
- n = 1'de döngü zaten dönmez ve 1 doğrudur; hata yalnızca n ≥ 2'de görünür. Bu yüzden tek test yetmez.
Çıktı Sorusu · Örnek Algoritmalar
Soru 6: Fibonacci'de Atama Sırası
Fibonacci algoritmasında son iki atamanın yeri değiştirilmiş. n = 6 için çıktı nedir?
oku n a = 0, b = 1 0'dan n-1'e kadar tekrarla yaz a sonraki = a + b b = sonraki // yer değişti a = b
Cevabı göster
Çıktı: 0 1 2 4 8 16 (doğrusu 0 1 1 2 3 5)
- b = sonraki yapıldıktan sonra
a = beski b'yi değil yeni b'yi alır; ilk turdan sonra a ile b hep eşit olur. - 2. turdan itibaren sonraki = a + a = 2a → değer ikiye katlanır.
| tur | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| yazılan a | 0 | 1 | 2 | 4 | 8 | 16 |
| tur sonu a = b | 1 | 2 | 4 | 8 | 16 | 32 |
Doğru sıra: önce a = b, sonra b = sonraki.
Adım Adım Çalıştırma · Örnek Algoritmalar
Soru 7: Palindrom: "Kayık"
Palindrom algoritması "Kayık" metni için çalıştırılıyor. Kaç karşılaştırma yapılır, sonuç ne olur?
Küçük harfe çevrilir: "kayık" (5 harf).
İki uç: sol = 0, sag = 4.
0 < 4 doğru. metin[0] = 'k', metin[4] = 'k' → aynı.
İçe doğru: sol = 1, sag = 3.
1 < 3 doğru. metin[1] = 'a', metin[3] = 'ı' → farklı → yanlış döndürülür.
"Kayık" palindrom değildir. 2 karşılaştırma yetti; ilk farklı çiftte algoritma durur, ortadaki 'y' hiç incelenmez.
metni oku metni kurala göre temizle sol = 0, sag = uzunluk - 1 sol < sag iken karakterler farklıysa yanlış döndür sol = sol + 1, sag = sag - 1 doğru döndür
Çıktı Sorusu · Örnek Algoritmalar
Soru 8: Asal mı: n = 91
Asal sayı algoritması n = 91 için ne yazar? Kaç kez % işlemi yapılır?
oku n eğer n < 2 ise "asal değil" yaz ve dur i = 2 i × i ≤ n iken eğer n % i == 0 ise "asal değil" yaz ve dur i = i + 1 "asal" yaz
Cevabı göster
Çıktı: asal değil, 6 kez % yapılır.
| i | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|
| i×i ≤ 91 | 4 | 9 | 16 | 25 | 36 | 49 |
| 91 % i | 1 | 1 | 3 | 1 | 1 | 0 |
91 = 7 × 13: çift sayı olmadığı için ilk bakışta asal sanılabilir. Küçük bölen 7, √91 ≈ 9,5'ten küçük olduğu için sınırın içinde yakalanır.
Çoktan Seçmeli · Örnek Algoritmalar
Soru 9: Karekök Sınırında Hata
Asal sayı algoritmasında döngü koşulu i × i ≤ n yerine i × i < n yazılırsa aşağıdaki girdilerden hangisi için yanlış sonuç üretilir?
A: 49 = 7 × 7. i = 7 iken 49 < 49 yanlış olduğu için döngü 7'yi denemeden biter; 2…6 bölmediği için "asal" yazılır. Tam kareler (4, 9, 25, 49…) bu hatayı yakalayan sınır testleridir. 21 için 3 bölen olarak bulunur; 29 ve 2 zaten asaldır.
Adım Adım Çalıştırma · Örnek Algoritmalar
Soru 10: Basamak Toplamı: 472
Tamamlanmış basamak toplamı algoritmasını sayi = 472 için izleyin.
Toplam için başlangıç 0.
472 > 0 doğru. rakam = 472 % 10 = 2.
toplam = 2; sayi = 472 / 10 = 47 (tam sayı bölmesi, kesir atılır).
47 > 0 doğru. rakam = 7.
toplam = 2 + 7 = 9; sayi = 4.
4 > 0 doğru. rakam = 4.
toplam = 13; sayi = 4 / 10 = 0.
0 > 0 yanlış → döngü biter. Tur sayısı = basamak sayısı (3).
13 yazılır (4 + 7 + 2). Basamaklar sağdan sola işlendi.
oku sayi toplam = 0 sayi > 0 iken rakam = sayi % 10 toplam = toplam + rakam sayi = sayi / 10 yaz toplam
Çoktan Seçmeli · Örnek Algoritmalar
Soru 11: Basamak Sayısı ve 0
Basamak sayısı iki biçimde yazılabilir. sayi = 0 girilirse sırasıyla ne yazılır?
// I. önce koşul (while) basamak = 0 sayi > 0 iken basamak = basamak + 1 sayi = sayi / 10 yaz basamak // II. sonda koşul (do-while) basamak = 0 tekrarla basamak = basamak + 1 sayi = sayi / 10 sayi > 0 iken yaz basamak
B: I'de 0 > 0 yanlış olduğu için gövde hiç çalışmaz → 0 (ama 0 tek basamaklıdır). II'de gövde koşuldan önce en az bir kez çalışır → 1. Bu yüzden while'dan önce eğer sayi == 0 ise 1 döndür kontrolü eklenir.
Adım Adım Çalıştırma · Örnek Algoritmalar
Soru 12: Listedeki En Küçük Değer
En küçük öğe çözümü (sözde kod) [7, 3, 9, 1, 4] listesiyle çalışıyor. enKucuk nasıl değişir?
İlk öğeyle başlanır; listede olmayan bir değer (ör. 0) varsayılmaz.
3 < 7 → doğru: enKucuk = 3.
9 < 3 → yanlış: değişmez.
1 < 3 → doğru: enKucuk = 1.
4 < 1 → yanlış: değişmez.
Sonuç 1. 5 öğeli listede 4 karşılaştırma yapıldı; her öğe bir kez incelendi.
enKucuk = listenin ilk öğesi
her sonraki öğe için
eğer öğe < enKucuk ise
enKucuk = öğe
yaz(enKucuk)Çoktan Seçmeli · Örnek Algoritmalar
Soru 13: 0 ile Başlayan En Büyük
En büyük değeri bulan algoritma enBuyuk = 0 ile başlatılırsa [−3, −7, −1, −5] listesi için ne yazar?
A: Listedeki hiçbir öğe 0’dan büyük olmadığı için koşul hiç doğru olmaz ve listede bulunmayan 0 yazılır. Doğru cevap −1 olmalıydı. Bu yüzden başlangıç değeri listenin ilk öğesi seçilir.
Çıktı Sorusu · Örnek Algoritmalar
Soru 14: Dizinin Ortalaması
Ortalama çözümünün sözde kodu aşağıda. [7, 8, 10, 6] listesi için çıktı nedir?
toplam = 0 her öğe için toplam = toplam + öğe ortalama = toplam / öğe sayısı yaz(ortalama)
Cevabı göster
Çıktı: 7.75
- toplam: 7, 15, 25, 31 → 31 / 4 = 7.75.
- Java’da
toplamve dizi uzunluğuintolduğundantoplam / dizi.lengthtam sayı bölmesi yapıp 7 verir. Bu yüzden(double) toplam / dizi.lengthyazılır. - Boş listede öğe sayısı 0 olur: hata durumu ayrıca ele alınmalıdır.
Çoktan Seçmeli · Doğrulama
Soru 15: Test Durumları
Faktöriyel algoritması (kısıt 0 ≤ n ≤ 20) için hazırlanan test tablosundaki satırlardan hangisi yanlıştır?
C: 21! değeri doğrudur ama long en çok 9.223.372.036.854.775.807 tutar; 21! sığmaz (taşma). Bu test, algoritmanın kısıtı (n ≤ 20) denetlemesi gerektiğini gösterir. Tek bir başarılı test, algoritmanın her girdi için doğru olduğunu kanıtlamaz.
Çıktı Sorusu · Analiz
Soru 16: Döngü mü, Formül mü?
1 + 2 + … + n toplamı için iki algoritma var. n = 200 için ikisinin sonucu nedir? A’da toplam = toplam + i kaç kez yapılır, B’de kaç işlem yapılır?
A: toplam = 0
i = 1
while i <= n
toplam = toplam + i
i = i + 1
B: toplam = n * (n + 1) / 2Cevabı göster
İkisi de 20.100 verir.
- A: gövde 200 kez çalışır → 200 kez toplam = toplam + i (ve 200 sayaç artırma).
- B: 200 × 201 / 2 → n’den bağımsız 1 çarpma + 1 bölme (artı n + 1).
Doğruluk kadar verimlilik de önemlidir: n büyüdükçe A’nın işi artar, B’ninki sabit kalır.
Adım Adım Çalıştırma · Arama
Soru 17: İkili Arama: 27
{2, 5, 9, 14, 20, 27, 33} dizisinde 27 aranıyor. Her turda sol, sag ve orta değerlerini izleyin.
Aralık tüm dizi: 0…6.
0 ≤ 6 doğru, 1. tur. orta = 0 + 6/2 = 3, dizi[3] = 14.
14 ≠ 27; 14 < 27 → hedef sağ yarıda: sol = 4.
4 ≤ 6 doğru, 2. tur. orta = 4 + (6 − 4)/2 = 5, dizi[5] = 27.
27 == 27 → return 5. 2 turda bulundu; doğrusal arama 6 karşılaştırma yapardı.
int ikiliAra(int[] dizi, int hedef) { int sol = 0, sag = dizi.length - 1; while (sol <= sag) { int orta = sol + (sag - sol) / 2; if (dizi[orta] == hedef) return orta; if (dizi[orta] < hedef) sol = orta + 1; else sag = orta - 1; } return -1; }
Çıktı Sorusu · Arama
Soru 18: İkili Arama: Olmayan Değer
Sıralı {2, 5, 9, 14, 20, 27, 33} dizisinde ikili arama ile 4 aranırsa kaç tur yapılır, her turda sol / sag / orta nedir, ne döner?
Cevabı göster
| tur | sol | sag | orta | dizi[orta] | karar |
|---|---|---|---|---|---|
| 1 | 0 | 6 | 3 | 14 | 14 > 4 → sag = 2 |
| 2 | 0 | 2 | 1 | 5 | 5 > 4 → sag = 0 |
| 3 | 0 | 0 | 0 | 2 | 2 < 4 → sol = 1 |
| — | 1 | 0 | 1 ≤ 0 yanlış → döngü biter | ||
3 tur, sonuç −1. 4, 2 ile 5 arasında olurdu; sol sag'ı geçince aralık boşalır. 7 öğe için en çok ⌊log₂ 7⌋ + 1 = 3 tur.
Çoktan Seçmeli · Arama
Soru 19: Sırasız Dizide İkili Arama
İkili arama sıralı olmayan {7, 3, 9, 5, 1} dizisinde 5 için çalıştırılırsa ne olur?
C: Tur 1: orta = 2, 9 > 5 → sag = 1 (5'in bulunduğu sağ taraf yanlışlıkla elendi). Tur 2: orta = 0, 7 > 5 → sag = −1; 0 ≤ −1 yanlış → −1. Yarıyı elemek ancak dizi sıralıysa güvenlidir.
Çoktan Seçmeli · Arama
Soru 20: En Kötü Durumda Karşılaştırma
1000 öğeli sıralı bir dizide bulunmayan bir değer aranıyor. En kötü durumda doğrusal arama kaç karşılaştırma, ikili arama kaç tur yapar?
A: Doğrusal arama n = 1000 öğenin hepsine bakar: O(n). İkili arama her turda aralığı yarıya indirir: ⌊log₂ 1000⌋ + 1 = 9 + 1 = 10 tur, O(log n). n = 1.000.000'da fark 1.000.000'a karşı 20 olur.
Adım Adım Çalıştırma · Sıralama
Soru 21: Seçimli Sıralama
[6, 2, 8, 3] dizisi seçimli sıralama ile sıralanıyor. Her geçişte enK ve dizi nasıl değişir, toplam kaç karşılaştırma yapılır?
i = 0: aday en küçük dizi[0] = 6.
j = 1: 2 < 6 → enK = 1. j = 2: 8 < 2 hayır. j = 3: 3 < 2 hayır.
dizi[0] ile dizi[1] yer değiştirir → 2 yerine oturdu.
i = 1: enK = 1 (6). j = 2: 8 < 6 hayır. j = 3: 3 < 6 → enK = 3.
dizi[1] ile dizi[3] yer değiştirir → 3 yerine oturdu.
i = 2: enK = 2 (8). j = 3: 6 < 8 → enK = 3.
Yer değiştir → dizi sıralı. 3 + 2 + 1 = 6 = n(n−1)/2 karşılaştırma, 3 takas.
i = 0'dan n-2'ye kadar enK = i j = i+1'den n-1'e kadar eğer dizi[j] < dizi[enK] ise enK = j dizi[i] ile dizi[enK] yer değiştir
Çıktı Sorusu · Sıralama
Soru 22: Kabarcık Sıralaması
Erken durmalı kabarcık sıralaması [6, 2, 8, 3] dizisine uygulanıyor. Her geçişin sonunda dizi nedir; kaç geçiş ve kaç karşılaştırma yapılır?
tur = 0 tekrarla degisti = yanlış j = 0'dan n-2-tur'a kadar eğer dizi[j] > dizi[j+1] ise dizi[j] ile dizi[j+1] yer değiştir degisti = doğru tur = tur + 1 degisti yanlış olana kadar
Cevabı göster
| geçiş | karşılaştırılan çiftler | sonra |
|---|---|---|
| 1 | (6,2)↔ (6,8) (8,3)↔ | [2, 6, 3, 8] |
| 2 | (2,6) (6,3)↔ | [2, 3, 6, 8] |
| 3 | (2,3) | değişim yok → dur |
3 geçiş, 3 + 2 + 1 = 6 karşılaştırma, 3 takas. Dizi 2. geçişte sıralandı ama bunu anlamak için 3. geçiş gerekir: degisti = yanlış.
Çıktı Sorusu · Sıralama
Soru 23: Eklemeli Sıralama
Eklemeli sıralama [6, 2, 8, 3] dizisine uygulanıyor. Her i için dizi nedir ve toplam kaç dizi[j] > anahtar karşılaştırması yapılır?
i = 1'den n-1'e kadar anahtar = dizi[i] j = i - 1 j >= 0 ve dizi[j] > anahtar iken dizi[j+1] = dizi[j] j = j - 1 dizi[j+1] = anahtar
Cevabı göster
| i | anahtar | karşılaştırmalar | sonra |
|---|---|---|---|
| 1 | 2 | 6>2 ✓ (j = −1 durur) | [2, 6, 8, 3] |
| 2 | 8 | 6>8 ✗ | [2, 6, 8, 3] |
| 3 | 3 | 8>3 ✓ 6>3 ✓ 2>3 ✗ | [2, 3, 6, 8] |
Toplam 1 + 1 + 3 = 5 karşılaştırma. j = −1 olunca j >= 0 yanlış olduğu için dizi[j] hiç okunmaz.
[6, 2, 8, 3] dizisinde seçimli ve kabarcık sıralama 6'şar karşılaştırma yapar; eklemeli neredeyse sıralı verilerde en hızlısıdır.
Çoktan Seçmeli · Sıralama
Soru 24: Sıralı Diziyi Sıralamak
Zaten sıralı olan [1, 2, 3, 4, 5] dizisi için hangi eşleştirme doğrudur (yapılan karşılaştırma sayısı)?
B: Seçimli sıralama girdi ne olursa olsun n(n−1)/2 = 10 karşılaştırma yapar (en iyi durum da O(n²)). Kabarcık ilk geçişte 4 karşılaştırma yapar, hiç değişim olmadığı için durur. Eklemelide her anahtar için tek karşılaştırma: 4 → O(n).