Bölüm 5.2: İleri Dizgi Algoritmaları

Bölüm 5.2: İleri Dizgi Algoritmaları · Çalışma Soruları
Sözlüksel sıraBasamak sıralamasıDüzenli ifadelerSonlu durum makineleriLevenshtein uzaklığıSonek dizisi ve BWT
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Çı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?

acabbadacedabbedaddgec012345

d = 1 (2. karakter). Anahtarlar: a, a, c, a, e, d. Sayma: say[a] = 3, say[c] = say[d] = say[e] = 1.

acabbadacedabbedaddgec012345

Önek toplamı: say[c] artık c kovasının bittiği konum: a → 3, b → 3, c → 4, d → 5, e → 6.

acabbadacedabbedaddgecadd012345

i = 5: "add", anahtar 'd' → say[d] bir azalır, gec[4] = "add".

acabbadacedabbedaddgecaddbed012345

i = 4: "bed", anahtar 'e' → say[e] bir azalır, gec[5] = "bed".

acabbadacedabbedaddgecdabaddbed012345

i = 3: "dab", anahtar 'a' → say[a] bir azalır, gec[2] = "dab".

acabbadacedabbedaddgecdabaceaddbed012345

i = 2: "ace", anahtar 'c' → say[c] bir azalır, gec[3] = "ace".

acabbadacedabbedaddgecbaddabaceaddbed012345

i = 1: "bad", anahtar 'a' → say[a] bir azalır, gec[1] = "bad".

acabbadacedabbedaddgeccabbaddabaceaddbed012345

i = 0: "cab", anahtar 'a' → say[a] bir azalır, gec[0] = "cab".

acabbadacedabbedaddgeccabbaddabaceaddbed012345

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
  • matches dizginin tamamını eşleştirmeye çalışır (örtük ^…$): "abc123" baştan rakamla başlamaz → false.
  • find bir 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?

01→AEBBBCCBDD*DAEEFFFA1011010durum: Ayol: A

Başlangıç durumu A (0). Geçiş tablosu: her (durum, sembol) için tek hedef; yalnızca D kabul durumudur.

01→AEBBBCCBDD*DAEEFFFA1011010geçiş: A → Byol: A B

1. sembol 1: δ(A, 1) = B.

01→AEBBBCCBDD*DAEEFFFA1011010geçiş: B → Byol: A B B

2. sembol 0: δ(B, 0) = B.

01→AEBBBCCBDD*DAEEFFFA1011010geçiş: B → Cyol: A B B C

3. sembol 1: δ(B, 1) = C.

01→AEBBBCCBDD*DAEEFFFA1011010geçiş: C → Dyol: A B B C D

4. sembol 1: δ(C, 1) = D. D kabul durumu ama girdi bitmedi.

01→AEBBBCCBDD*DAEEFFFA1011010geçiş: D → Dyol: A B B C D D

5. sembol 0: δ(D, 0) = D. D kabul durumu ama girdi bitmedi.

01→AEBBBCCBDD*DAEEFFFA1011010geçiş: D → Ayol: A B B C D D A

6. sembol 1: δ(D, 1) = A.

01→AEBBBCCBDD*DAEEFFFA1011010geçiş: A → Eyol: A B B C D D A E

7. sembol 0: δ(A, 0) = E.

01→AEBBBCCBDD*DAEEFFFA1011010durum: Eyol: A

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?

εALEMε01234E1L2M3A4

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.

εALEMε01234E11223LMA

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).

εALEMε01234E11223L22123MA

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).

εALEMε01234E11223L22123M33222A

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).

εALEMε01234E11223L22123M33222A43333

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).

εALEMε01234E11223L22123M33222A43333

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ıraSAsonek
03ak
11azak
24k
30kazak
42zak

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 0AARAB1ABAAR2ARABA3BAARA4RABAA

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?

FLsıra0$k01ay02ak13ka04k$05ya1okunan: —ters: —

L = "kyka$a" (T = "kayak$"). sira[i]: L[i]'deki karakterin L'de kaçıncı kez geçtiği (0'dan).

FLsıra0$k01ay02ak13ka04k$05ya1okunan: —ters: —

F = sırala(L) = "$aakky". bas[c]: F'de c'nin ilk satırı: $ → 0, a → 1, k → 3, y → 5.

FLsıra0$k01ay02ak13ka04k$05ya1okunan: kters: k

k = 0: L[0] = 'k' okunur; LF(0) = bas['k'] + sira[0] = 3 + 0 = 3.

FLsıra0$k01ay02ak13ka04k$05ya1okunan: katers: ak

k = 1: L[3] = 'a' okunur; LF(3) = bas['a'] + sira[3] = 1 + 0 = 1.

FLsıra0$k01ay02ak13ka04k$05ya1okunan: kayters: yak

k = 2: L[1] = 'y' okunur; LF(1) = bas['y'] + sira[1] = 5 + 0 = 5.

FLsıra0$k01ay02ak13ka04k$05ya1okunan: kayaters: ayak

k = 3: L[5] = 'a' okunur; LF(5) = bas['a'] + sira[5] = 1 + 1 = 2.

FLsıra0$k01ay02ak13ka04k$05ya1okunan: kayakters: kayak

k = 4: L[2] = 'k' okunur; LF(2) = bas['k'] + sira[2] = 3 + 1 = 4.

FLsıra0$k01ay02ak13ka04k$05ya1okunan: kayakters: kayak

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.

Son

Bölüm 5.2: İleri Dizgi Algoritmaları: Çalışma Soruları
Konu anlatımı: İleri Dizgi Algoritmaları sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.