Bölüm 5.2: İleri Dizgi Algoritmaları
Çıktı Sorusu · Sözlüksel Sıra
Soru 1: karsilastir Çıktısı
Dersteki karsilastir metoduyla şu üç çağrı ne döndürür? karsilastir("car", "cart"), karsilastir("Zebra", "apple"), karsilastir("kale", "kaba")
int karsilastir(String a, String b) { int n = Math.min(a.length(), b.length()); for (int k = 0; k < n; k++) { char x = a.charAt(k), y = b.charAt(k); if (x != y) return x - y; // ilk farklı karakter } return a.length() - b.length(); }
Cevabı göster
-1 -7 10
- "car" · "cart": ilk 3 karakter eşit, kısa olan tükendi → 3 − 4 = −1 (önek önce gelir).
- "Zebra" · "apple": 'Z' (90) − 'a' (97) = −7: büyük harfler küçüklerden önce gelir.
- "kale" · "kaba": 3. karakter 'l' (108) − 'b' (98) = 10 > 0 → "kaba" önce gelir.
Çoktan Seçmeli · Sözlüksel Sıra
Soru 2: Karakter Kodu Sırası
{"b2", "B10", "ab", "Ab", "a"} dizisi Arrays.sort (yani compareTo) ile sıralanınca sonuç hangisidir?
D: compareTo karakter kodlarını karşılaştırır: tüm büyük harfler (A = 65, B = 66) küçük harflerden (a = 97) önce gelir. "a", "ab"nin öneki olduğu için önce gelir. A ve C insan alfabesi gibi büyük/küçük harfi eşit sayar; bunun için Collator ya da compareToIgnoreCase gerekir.
Adım Adım Çalıştırma · Basamak Sıralaması
Soru 3: sayarakSirala İzleme
a = {"cab", "bad", "ace", "dab", "bed", "add"} için sayarakSirala(a, 1) çağrısından sonra a ne olur?
d = 1 (2. karakter). Anahtarlar: a, a, c, a, e, d. Sayma: say[a] = 3, say[c] = say[d] = say[e] = 1.
Önek toplamı: say[c] artık c kovasının bittiği konum: a → 3, b → 3, c → 4, d → 5, e → 6.
i = 5: "add", anahtar 'd' → say[d] bir azalır, gec[4] = "add".
i = 4: "bed", anahtar 'e' → say[e] bir azalır, gec[5] = "bed".
i = 3: "dab", anahtar 'a' → say[a] bir azalır, gec[2] = "dab".
i = 2: "ace", anahtar 'c' → say[c] bir azalır, gec[3] = "ace".
i = 1: "bad", anahtar 'a' → say[a] bir azalır, gec[1] = "bad".
i = 0: "cab", anahtar 'a' → say[a] bir azalır, gec[0] = "cab".
Sonuç: cab, bad, dab, ace, add, bed. Anahtarı a olan cab, bad, dab giriş sırasını korudu (kararlı); sondan başa yerleştirme bunu sağlar.
void sayarakSirala(String[] a, int d) { int[] say = new int[256]; // ASCII for (String s : a) say[kar(s, d)]++; for (int r = 1; r < 256; r++) say[r] += say[r - 1]; String[] gec = new String[a.length]; for (int i = a.length - 1; i >= 0; i--) gec[--say[kar(a[i], d)]] = a[i]; // kararlı System.arraycopy(gec, 0, a, 0, a.length); } int kar(String s, int d) { // kısa dizgi → 0 return d < s.length() ? s.charAt(d) : 0; }
Çoktan Seçmeli · Basamak Sıralaması
Soru 4: Ters Yönlü Yerleştirme
sayarakSirala metodunda yerleştirme döngüsü sondan başa yerine baştan sona (for (int i = 0; i < a.length; i++)) yazılırsa LSD basamak sıralaması ne olur?
A: say[c] kovanın sonunu gösterir; baştan gelen ilk öğe kovanın en sonuna yazılır, yani eşitler ters sıralanır (kararsız). LSD'nin doğruluğu, son geçişte eşit olan öğelerin önceki geçişlerin kurduğu sırayı korumasına dayanır; bu yüzden ilk geçişlerin işi bozulur.
Çoktan Seçmeli · Düzenli İfadeler
Soru 5: ab*c Örüntüsü
Pattern.compile("ab*c").matcher(s).find() aşağıdaki dizgilerden hangisi için false döner?
D: * yalnızca önündeki b'ye uygulanır: a, sıfır ya da daha çok b, sonra c. "ac" (sıfır b), "abbc" ve "xabcx" içinde böyle bir parça vardır (find dizginin bir parçasını arar). "adc"de a ile c arasında d olduğu için eşleşme yoktur.
Çıktı Sorusu · Düzenli İfadeler
Soru 6: matches ve find
Aşağıdaki kod ne yazdırır?
Pattern d = Pattern.compile("\\d+");
System.out.println("abc123".matches("\\d+"));
System.out.println(d.matcher("abc123").find());
System.out.println("2024".matches("\\d{4}"));
System.out.println("20245".matches("\\d{4}"));
String r = "[A-Z]{2}\\d{3}";
System.out.println("AB123".matches(r));
System.out.println("ab123".matches(r));Cevabı göster
false true true false true false
matchesdizginin tamamını eşleştirmeye çalışır (örtük ^…$): "abc123" baştan rakamla başlamaz → false.findbir parçayı arar: "123" bulunur → true.- \d{4} tam dört rakam: "2024" true, "20245" false (beşinci rakam artar).
- [A-Z] yalnızca büyük harf: "ab123" false.
Çoktan Seçmeli · Düzenli İfadeler
Soru 7: İleri Bakış
a(?=b) örüntüsü "abacab" dizgisinde find() ile kaç kez eşleşir ve her eşleşme hangi metindir?
C: ileri bakış bir konumu sınar, karakter tüketmez: ardından b gelen a'lar 0 ve 4 konumlarındadır; 2. konumdaki a'dan sonra c gelir. Eşleşme yalnızca "a"dır, b eşleşmeye katılmaz (A bu yüzden yanlıştır).
Çoktan Seçmeli · Düzenli İfadeler
Soru 8: Açgözlü ve Tembel
"<b>x</b>" metninde <.+> ve <.+?> örüntülerinin ilk find() sonucu (group()) sırasıyla nedir?
A: .+ açgözlüdür, mümkün olan en uzun parçayı alıp son >'ye kadar gider. +? tembeldir, ilk >'de durur. Eşleşme her zaman en soldaki uygun konumdan (0) başlar; bu yüzden C'deki </b> ilk sonuç olamaz.
Adım Adım Çalıştırma · Sonlu Durum Makineleri
Soru 9: DFA Çalıştırma
Derste verilen DFA (A başlangıç, D kabul) kabulEder(gecis, kabul, "1011010") çağrısında hangi durumlardan geçer, sonuç nedir?
Başlangıç durumu A (0). Geçiş tablosu: her (durum, sembol) için tek hedef; yalnızca D kabul durumudur.
1. sembol 1: δ(A, 1) = B.
2. sembol 0: δ(B, 0) = B.
3. sembol 1: δ(B, 1) = C.
4. sembol 1: δ(C, 1) = D. D kabul durumu ama girdi bitmedi.
5. sembol 0: δ(D, 0) = D. D kabul durumu ama girdi bitmedi.
6. sembol 1: δ(D, 1) = A.
7. sembol 0: δ(A, 0) = E.
Girdi bitti; son durum E kabul durumu değil → false (ret). Ara durumda D'den geçmek yetmez; yalnızca son durum önemlidir.
boolean kabulEder(int[][] gecis, boolean[] kabul, String s) { int durum = 0; // başlangıç for (char c : s.toCharArray()) durum = gecis[durum][c - '0']; return kabul[durum]; // kabul mü? }
Çıktı Sorusu · Sonlu Durum Makineleri
Soru 10: Sayı Ayrıştıran FSM
Dersteki sayilariBul metodu sayilariBul("v1.2.3 ve 7") çağrısında ne yazdırır?
void sayilariBul(String s) { Durum d = Durum.BASLA; StringBuilder tampon = new StringBuilder(); for (char c : s.toCharArray()) { boolean rakam = Character.isDigit(c); if (rakam) { if (d == Durum.BASLA) d = Durum.RAKAM; tampon.append(c); } else if (c == '.' && d != Durum.ONDALIK) { d = Durum.ONDALIK; tampon.append(c); } else if (d != Durum.BASLA) { System.out.println(tampon); tampon.setLength(0); d = Durum.BASLA; } } if (d != Durum.BASLA) System.out.println(tampon); }
Cevabı göster
1.2 3 7
- "1" → RAKAM, "." → ONDALIK, "2" → tampon "1.2".
- İkinci "." geldiğinde d zaten ONDALIK: ikinci koşul tutmaz, üçüncü dal çalışır → "1.2" yazılır, BASLA'ya dönülür; nokta atılır.
- "3" yeni sayı; boşlukta yazılır. "7" girdi sonunda son satırdaki if ile yazılır.
Makine "1.2.3" gibi bir sürüm numarasını iki sayıya böler; bu, durum tasarımının sonucudur.
Çoktan Seçmeli · Sonlu Durum Makineleri
Soru 11: Örüntü Otomatı
"abab" örüntüsünü arayan otomatta durum q = metnin sonunda örüntüyle uyuşan en uzun önekin uzunluğudur. Otomat 0 durumundan başlayıp "abaa" metnini okuyunca hangi durumdadır?
B: Durumlar: a → 1, b → 2, a → 3; dördüncü karakter a, beklenen b değil. "abaa"nın "abab" öneki olan en uzun soneki "a"dır → q = 1 (0'a düşmez). Bu geri dönüş KMP'deki önek fonksiyonunun otomat biçimidir.
Adım Adım Çalıştırma · Düzenleme Uzaklığı
Soru 12: levenshtein İzleme
levenshtein("ELMA", "ALEM") tablosu satır satır nasıl dolar, sonuç nedir?
5 × 5 tablo. İlk sütun D[i][0] = i (i silme), ilk satır D[0][j] = j (j ekleme). Diğer hücreler henüz 0.
1. satır (E): 1, 2, 2, 3. E = E olan hücrede (j = 3) maliyet eklenmez: D[1][3] = D[0][2] = 2 (yeşil).
2. satır (L): 2, 1, 2, 3. L = L olan hücrede (j = 2) maliyet eklenmez: D[2][2] = D[1][1] = 1 (yeşil).
3. satır (M): 3, 2, 2, 2. M = M olan hücrede (j = 4) maliyet eklenmez: D[3][4] = D[2][3] = 2 (yeşil).
4. satır (A): 3, 3, 3, 3. A = A olan hücrede (j = 1) maliyet eklenmez: D[4][1] = D[3][0] = 3 (yeşil).
D[4][4] = 3. Bir çözüm: üç değiştirme E→A, M→E, A→M (ELMA → ALMA → ALEA → ALEM). Zaman O(m · n).
int levenshtein(String a, String b) { int m = a.length(), n = b.length(); int[][] D = new int[m + 1][n + 1]; for (int i = 0; i <= m; i++) D[i][0] = i; for (int j = 0; j <= n; j++) D[0][j] = j; for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) if (a.charAt(i - 1) == b.charAt(j - 1)) D[i][j] = D[i - 1][j - 1]; // eşit else D[i][j] = 1 + Math.min(D[i - 1][j - 1], Math.min(D[i][j - 1], D[i - 1][j])); return D[m][n]; }
Çıktı Sorusu · Düzenleme Uzaklığı
Soru 13: Uzaklık Değerleri
Dersteki levenshtein metoduyla aşağıdaki kod ne yazdırır? Her biri için bir düzenleme dizisi verin.
String[][] c = {{"algoritma", "logaritma"},
{"pazar", "bazaar"}, {"abc", ""},
{"kitap", "kitap"}};
for (String[] p : c) {
int d = levenshtein(p[0], p[1]);
System.out.println(d);
}Cevabı göster
3 2 3 0
- algoritma → logaritma: baştaki a silinir (lgoritma), l'den sonra o eklenir (logoritma), ikinci o, a ile değiştirilir (logaritma) → 3.
- pazar → bazaar: p, b ile değiştirilir, bir a eklenir → 2.
- abc → "": 3 silme (ilk sütun D[3][0] = 3).
- Aynı dizgiler: 0 (metrik özelliği d(a, a) = 0).
Çoktan Seçmeli · Düzenleme Uzaklığı
Soru 14: Yer Değiştirme Bir İşlem mi?
levenshtein("saat", "asat") kaçtır?
B: İki komşu harfin yer değiştirmesi Levenshtein'da tek işlem değildir: s→a ve a→s iki değiştirme ya da bir silme ve bir ekleme gerekir → 2. Komşu takası tek işlem sayan ölçü Damerau-Levenshtein uzaklığıdır.
Çıktı Sorusu · Sonek Dizisi ve BWT
Soru 15: Sonek Dizisi
"kazak" dizgisinin sonek dizisini (SA) bulun. Sonra "ak" örüntüsünün metinde geçtiği konumları SA üzerinde ikili aramayla nasıl bulacağınızı açıklayın.
Cevabı göster
| sıra | SA | sonek |
|---|---|---|
| 0 | 3 | ak |
| 1 | 1 | azak |
| 2 | 4 | k |
| 3 | 0 | kazak |
| 4 | 2 | zak |
SA = [3, 1, 4, 0, 2]. "ak" ile başlayan sonekler sıralı listede bitişik bir aralık oluşturur: yalnızca sıra 0 ("ak") → konum 3. "a" ile başlayanlar sıra 0–1 (konum 3 ve 1). Aralığın iki ucu ikili aramayla O(m log n)'de bulunur.
Çıktı Sorusu · Sonek Dizisi ve BWT
Soru 16: BWT Hesabı
"ARABA" dizgisinin Burrows–Wheeler dönüşümünü (L sütunu) ve orijinal dizginin sıralı listedeki satır indisini bulun.
Cevabı göster
Döndürmeler: ARABA, RABAA, ABAAR, BAARA, AARAB → sıralı: AARAB, ABAAR, ARABA, BAARA, RABAA.
L = son sütun = BRAAA, satır indisi 2 (0'dan). Üç A yan yana toplandı; bu tekrarlar sonra Move-to-Front ve RLE ile iyi sıkışır. F sütunu (AAABR) L'nin sıralanmış hâlidir.
Adım Adım Çalıştırma · Sonek Dizisi ve BWT
Soru 17: Ters BWT İzleme
tersBWT("kyka$a") LF eşlemesiyle hangi metni geri üretir?
L = "kyka$a" (T = "kayak$"). sira[i]: L[i]'deki karakterin L'de kaçıncı kez geçtiği (0'dan).
F = sırala(L) = "$aakky". bas[c]: F'de c'nin ilk satırı: $ → 0, a → 1, k → 3, y → 5.
k = 0: L[0] = 'k' okunur; LF(0) = bas['k'] + sira[0] = 3 + 0 = 3.
k = 1: L[3] = 'a' okunur; LF(3) = bas['a'] + sira[3] = 1 + 0 = 1.
k = 2: L[1] = 'y' okunur; LF(1) = bas['y'] + sira[1] = 5 + 0 = 5.
k = 3: L[5] = 'a' okunur; LF(5) = bas['a'] + sira[5] = 1 + 1 = 2.
k = 4: L[2] = 'k' okunur; LF(2) = bas['k'] + sira[2] = 3 + 1 = 4.
Okunanlar metni sondan başa verir: "kayak" ters çevrilir → "kayak". Sıra sayılarıyla O(n).
String tersBWT(String L) { // $ en küçük
int n = L.length();
int[] say = new int[256], sira = new int[n];
for (int i = 0; i < n; i++)
sira[i] = say[L.charAt(i)]++;
int[] bas = new int[256]; // F'de ilk satır
for (int c = 1; c < 256; c++)
bas[c] = bas[c - 1] + say[c - 1];
StringBuilder s = new StringBuilder();
int i = 0; // $ satırı
for (int k = 0; k < n - 1; k++) {
char c = L.charAt(i);
s.append(c);
i = bas[c] + sira[i]; // LF(i)
}
return s.reverse().toString();
}Klasik Soru · Basamak Sıralaması
Soru 18: LSD Neden Sağdan Başlar?
LSD basamak sıralaması neden en sağdaki karakterden başlar ve neden her geçişin kararlı olması gerekir? 3 karakterlik dizgilerde k geçişten sonra dizinin hangi özelliği vardır?
Cevabı göster
- Değişmez: k geçişten sonra dizi, son k karaktere göre sıralıdır (ör. "dab", "cab" 1. geçişten sonra son harfe göre bir aradadır).
- Son geçiş en anlamlı karaktere göre yapılır; bu karakterde eşit olan öğelerin sırasına önceki geçişler karar vermiştir. Kararlılık bu kararı korur.
- Kararsız alt sıralama (ör. hızlı sıralama) eşitleri karıştırır; "bed" ile "bee" son geçişte yer değiştirebilir.
- W geçiş · O(N + R) → O(W · (N + R)); karşılaştırma yapılmaz.
MSD ise soldan başlar ve her kovayı ayrı ayrı özyinelemeli sıralar; ayırt edici önek bitince durabildiği için uzunlukları farklı dizgilere uygundur.