Bölüm 3: Diziler

Bölüm 3: Diziler · Çalışma Soruları
Dizi kavramıJava'da dizilerStack ve heapDizi algoritmalarıÇok boyutlu dizilerKarmaşıklıkSıralama
Sercan KÜLCÜ

Çoktan Seçmeli · Temel Kavramlar

Soru 1: Dizinin Özellikleri

Java dizileri için aşağıdakilerden hangisi doğrudur?

C doğru: ardışık bellek hem adres hesabını hem önbelleği kolaylaştırır. B çekici ama yanlış: erişim O(1) olsa da araya ekleme sonraki öğelerin kaydırılmasını gerektirir → O(n). Boyut sabittir (A); sıralama/arama java.util.Arrays ile yapılır (D).

Klasik Soru · Temel Kavramlar

Soru 2: Dizi Kovaryansı

Bu kod derlenir mi; çalıştırıldığında ne olur ve neden?

String[] isimler = {"Ali", "Ayşe"};
Object[] nesneler = isimler;
nesneler[0] = 42;
System.out.println(nesneler.length);
Cevabı göster

Derlenir. Diziler kovaryanttır: String, Object'in alt türü olduğu için String[] de Object[]'in alt türü sayılır; 42 de Integer olarak Object'e atanabilir.

Çalışırken 3. satırda ArrayStoreException: java.lang.Integer fırlatılır; println'e ulaşılmaz. Nesne gerçekte bir String[]'dir ve JVM her atamada türü denetler.

Bedel: tür hatası derleme yerine çalışma zamanında yakalanır. Jenerikler kovaryant değildir: List<Object> l = new ArrayList<String>(); zaten derlenmez.

Çoktan Seçmeli · Java'da Diziler

Soru 3: Varsayılan Değerler

Kodun çıktısı nedir?

double[] d = new double[2];
boolean[] b = new boolean[2];
String[] s = new String[2];
System.out.println(d[0] + " " + b[1]
                   + " " + s[0]);

new ile oluşturulan dizinin her öğesi türünün varsayılan değerini alır: double → 0.0, boolean → false, nesne (String) → null (char ise '\u0000'). Yerel değişkenlerin aksine dizi öğeleri ilk değersiz kalmaz, bu yüzden C yanlış; String'in varsayılanı "" değil null'dır.

Klasik Soru · Java'da Diziler

Soru 4: Tanımlama Hataları

Numaralı satırlardan hangileri derleme hatası verir? Her birini düzeltin.

int[] a = {1, 2, 3};          // 1
int[] b;  b = {4, 5};         // 2
int[] c = new int[] {6, 7};   // 3
int[] d = new int[2] {8, 9};  // 4
int n = a.length();           // 5
Cevabı göster

Hatalı satırlar: 2, 4 ve 5.

  • 2: Yalın ilklendirici listesi yalnızca tanımlama satırında yazılabilir. Düzeltme: b = new int[] {4, 5};
  • 4: Boyut ile liste birlikte verilemez; boyutu öğe sayısı belirler. Düzeltme: new int[] {8, 9}
  • 5: length dizide metot değil alandır: a.length (String'de ise s.length()).

1 ve 3 doğrudur (3, sonradan atamada da kullanılabilen yazım).

Çoktan Seçmeli · Java'da Diziler

Soru 5: Referans mı, Kopya mı?

Kodun çıktısı nedir?

int[] dizi = {1, 2, 3};
int[] r = dizi;
int[] k = Arrays.copyOf(dizi, dizi.length);
r[0] = 99;
k[1] = 50;
System.out.println(dizi[0] + " " + dizi[1]);

r = dizi yalnızca adresi kopyalar: r ve dizi heap'teki aynı nesneyi gösterir, r[0] = 99 diziyi değiştirir. Arrays.copyOf yeni bir nesne oluşturup öğeleri tek tek kopyalar (O(n)); k'deki değişiklik diziye yansımaz, bu yüzden C yanlış.

Klasik Soru · Java'da Diziler

Soru 6: java.util.Arrays

Programın çıktısı nedir? Her satırı kısaca gerekçelendirin.

int[] a = {5, 3, 8};
int[] b = {5, 3, 8};
System.out.println(a == b);
System.out.println(Arrays.equals(a, b));
int[] c = Arrays.copyOf(a, 5);
Arrays.sort(a);
System.out.println(Arrays.toString(a)
        + " " + Arrays.toString(c));
Cevabı göster
false
true
[3, 5, 8] [5, 3, 8, 0, 0]
  • == referansları karşılaştırır: a ve b ayrı nesneler → false.
  • Arrays.equals uzunlukları ve öğeleri tek tek karşılaştırır → true (O(n)).
  • copyOf(a, 5) yeni dizi üretir; fazladan hücreler varsayılan 0 olur. Kopya sıralamadan önce alındığı için c sırasızdır.
  • sort yerinde sıralar (O(n log n)); println(a) deseydik [I@… yazardı.

Çoktan Seçmeli · Java'da Diziler

Soru 7: Sınır Hatası

Bu kod çalıştırıldığında ne olur?

int[] a = new int[5];
for (int i = 0; i <= a.length; i++)
    a[i] = i;

Geçerli indisler 0…length − 1 = 0…4'tür; <= son turda a[5]'e erişir (off-by-one). Java her erişimi çalışma zamanında denetler ve istisna fırlatır; yakalanmazsa program sonlanır. D, denetim yapmayan C dilinin davranışıdır. Doğrusu i < a.length.

Çoktan Seçmeli · Dizi Algoritmaları

Soru 8: Boş Dizide Ortalama

Kullanıcı diziOku'da boyut olarak 0 girerse çıktı ne olur?

double[] dizi = diziOku(sc);  // boyut 0
double toplam = 0;
for (int i = 0; i < dizi.length; i++)
    toplam += dizi[i];
System.out.println("Ortalama: "
        + toplam / dizi.length);

new double[0] geçerli, boş bir dizidir; döngü hiç dönmez. 0.0 / 0 kayan noktalı bölmedir ve NaN verir. B, toplam ve bölen int olsaydı doğru olurdu. Kullanıcıya uyarı vermek daha iyidir.

Adım Adım Çalıştırma · Dizi Algoritmaları

Soru 9: Mod Hesabını İzleme

mod({5, 2, 5, 2, 9}) ne döndürür? İki değer eşit sayıda tekrar ederse hangisi seçilir?

Kopya sıralanır: eşit değerler yan yana gelir. Çağıranın dizisi bozulmaz.

İlk değer (2) şimdilik rekor: 1 kez.

s[1] = 2 == s[0] → aynı değer sürüyor, mevcut = 2.

2 > 1 → yeni rekor: enCok = 2, 2 kez.

s[2] = 5 ≠ 2 → yeni değer, sayaç 1'e döner. 1 > 2 yanlış.

s[3] = 5 == s[2] → mevcut = 2.

2 > 2 yanlış: karşılaştırma > olduğu için eşitlikte rekor değişmez.

s[4] = 9 ≠ 5 → sayaç 1. Döngü biter.

return 2. 2 ve 5 ikişer kez geçer; önce görülen (en küçük) 2 kalır. O(n log n) + O(n).

static int mod(int[] dizi) {
  int[] s = dizi.clone();
  Arrays.sort(s);
  int enCok = s[0], enCokSayi = 1;
  int mevcut = 1;
  for (int i = 1; i < s.length; i++) {
    if (s[i] == s[i - 1]) mevcut++;
    else mevcut = 1;
    if (mevcut > enCokSayi) {
      enCokSayi = mevcut; enCok = s[i];
    }
  }
  return enCok;
}

Çoktan Seçmeli · Dizi Algoritmaları

Soru 10: Sıralamasız Mod

Mod metodundan Arrays.sort satırı silinirse aşağıdaki kod ne yazdırır?

int[] s = {1, 4, 2, 4, 3, 4}; // sırasız
int enCok = s[0], enCokSayi = 1, mevcut = 1;
for (int i = 1; i < s.length; i++) {
  if (s[i] == s[i - 1]) mevcut++;
  else mevcut = 1;
  if (mevcut > enCokSayi) {
    enCokSayi = mevcut; enCok = s[i];
  }
}
System.out.println(enCok);

Algoritma yalnızca komşu eşitlikleri sayar. Sırasız dizide hiçbir komşu eşit değildir; mevcut hep 1 kalır, rekor hiç değişmez ve ilk öğe 1 döner. Gerçek mod 4'tür (A), ama 4'ler yan yana olmadığı için bulunamaz; bu yüzden önce sıralama gerekir.

Klasik Soru · Dizi Algoritmaları

Soru 11: Sezar Şifresi

sifrele("YAZ", 4) ne döndürür ve şifreli metni çözmek için aynı metot hangi k ile çağrılmalıdır?

static String sifrele(String mesaj, int k) {
    char[] harf = mesaj.toCharArray();
    for (int i = 0; i < harf.length; i++) {
        int sira = harf[i] - 'A';
        harf[i] = (char) ('A' + (sira + k) % 26);
    }
    return new String(harf);
}
Cevabı göster
harfsıra(sıra + 4) % 26sonuç
Y2428 % 26 = 2C
A04E
Z2529 % 26 = 3D

Sonuç: "CED". % 26 sona taşan sırayı başa sarar.

Çözmek için k = 26 − 4 = 22: sifrele("CED", 22) → "YAZ".

String değiştirilemez; bu yüzden harfler toCharArray() ile bir char[]'e kopyalanıp yerinde değiştirilir. char değerleri tamsayıdır. Her harf bir kez işlenir: O(n).

Klasik Soru · Çok Boyutlu Diziler

Soru 12: Düzensiz Dizide null Satır

Kod çalıştırıldığında ekrana ne yazılır ve son satırda ne olur?

int[][] m = new int[3][];
m[1] = new int[4];
m[1][2] = 5;
System.out.println(m.length + " "
        + m[1].length + " " + m[0]);
System.out.println(m[0][0]);
Cevabı göster

İlk satır: 3 4 null. Son satırda NullPointerException.

  • Java'da matris, dizilerin dizisidir. new int[3][] yalnızca 3 referanslık dış diziyi oluşturur; satırlar henüz yoktur (null).
  • m.length satır sayısı (3), m[1].length o satırın kendi boyu (4). Satırların boyu farklı olabilir: düzensiz (jagged) dizi.
  • m[0] null olduğundan m[0][0] erişimi istisna fırlatır. Çözüm: önce m[0] = new int[k];

Klasik Soru · Çok Boyutlu Diziler

Soru 13: Sığ ve Derin Kopya

Programın çıktısı nedir? Her değeri sığ/derin kopya kavramıyla açıklayın.

int[][] m = { {1, 2}, {3, 4} };
int[][] s = m.clone();
int[][] d = { m[0].clone(), m[1].clone() };
s[1][0] = 8;
d[0][0] = 6;
s[0] = new int[] {0, 0};
System.out.println(m[0][0] + " " + m[1][0]
        + " " + s[0][0] + " " + d[1][0]);
Cevabı göster

Çıktı: 1 8 0 3

  • m.clone() yalnızca dış diziyi kopyalar: s'nin satır referansları m'ninkilerle aynıdır (sığ kopya). s[1][0] = 8 ortak satırı değiştirir → m[1][0] = 8.
  • s[0] = new int[]… yalnızca s'nin kendi dış dizisindeki referansı değiştirir; m[0] etkilenmez → m[0][0] = 1, s[0][0] = 0.
  • d'nin satırları ayrı ayrı klonlandı (derin kopya); d[1] klonlandığında m[1][0] henüz 3'tü → d[1][0] = 3. d'deki değişiklik m'yi etkilemez.

Çoktan Seçmeli · Çok Boyutlu Diziler

Soru 14: Üç Boyutlu Dizi

Döngüler bitince u[2][1][0] kaçtır ve en içteki atama kaç kez çalışmıştır?

int[][][] u = new int[3][3][3];
for (int x = 0; x < 3; x++)
  for (int y = 0; y < 3; y++)
    for (int z = 0; z < 3; z++)
      u[x][y][z] = x * 9 + y * 3 + z + 1;

2·9 + 1·3 + 0 + 1 = 22. Her boyut bir iç içe döngü demektir: 3 × 3 × 3 = 27 atama. B "+1"i unutur; C yalnızca iki döngü sayar; D ağırlıkları karıştırır (x·3 + y·9).

Klasik Soru · Karmaşıklık

Soru 15: Araya Ekleme

a = {3, 8, 2, 6, 0, 0} ve boyut = 4 iken ekle(a, 4, 1, 5) sonrası dizi ve dönüş değeri nedir? Kaydırma neden sağdan başlar?

static int ekle(int[] a, int boyut,
                int indis, int deger) {
  // ön koşul: boyut < a.length
  for (int k = boyut; k > indis; k--)
    a[k] = a[k - 1];   // sağa kaydır
  a[indis] = deger;
  return boyut + 1;
}
Cevabı göster
adıma
k = 4: a[4] = a[3]{3, 8, 2, 6, 6, 0}
k = 3: a[3] = a[2]{3, 8, 2, 2, 6, 0}
k = 2: a[2] = a[1]{3, 8, 8, 2, 6, 0}
a[1] = 5{3, 5, 8, 2, 6, 0}

Sonuç {3, 5, 8, 2, 6, 0}, dönüş 5; 3 kaydırma.

Soldan başlansaydı a[2] = a[1] ile 2'nin üzerine yazılır, ardından 8 sağa doğru çoğalırdı: veri kaybolur. Başa ekleme n kaydırma → O(n); yer varken sona ekleme O(1).

Çoktan Seçmeli · Karmaşıklık

Soru 16: Sıralı Girdide Sıralama

Zaten artan sırada olan n öğeli bir dizi veriliyor. Aşağıdaki algoritmalardan hangisi bu girdide O(n) sürede biter?

Eklemelide her anahtar solundakiyle bir kez karşılaştırılır, kaydırma olmaz: n − 1 karşılaştırma → O(n). Seçimli her durumda n(n−1)/2 karşılaştırma yapar (O(n²)); birleştirme her durumda O(n log n) ve O(n) ek bellek ister. D en çekici yanlış: sıralı girdi + ilk öğe pivot, hızlı sıralamanın en kötü durumudur, O(n²). (Arrays.sort ilkel dizilerde çift pivotlu hızlı sıralama, nesne dizilerinde kararlı TimSort kullanır.)

Klasik Soru · Karmaşıklık

Soru 17: Seçimli Sıralama

Seçimli sıralama {29, 10, 14, 37, 13} dizisine uygulanıyor. Her turdan sonra dizi nasıl görünür ve toplam kaç karşılaştırma yapılır?

Her tur, sıralanmamış kısmın en küçüğünü bulur ve o kısmın başındaki öğeyle takas eder.

Cevabı göster
turtakasdizi
129 ↔ 10{10, 29, 14, 37, 13}
229 ↔ 13{10, 13, 14, 37, 29}
314 yerinde{10, 13, 14, 37, 29}
437 ↔ 29{10, 13, 14, 29, 37}

Karşılaştırma: 4 + 3 + 2 + 1 = 10 = n(n − 1)/2. Bu sayı girdiden bağımsızdır: en iyi, ortalama ve en kötü durum O(n²); ek bellek O(1). Son öğe kendiliğinden yerine oturduğu için n − 1 tur yeter.

Adım Adım Çalıştırma · Karmaşıklık

Soru 18: Eklemeli Sıralamayı İzleme

eklemeliSirala({6, 3, 8, 2}) çalışırken toplam kaç kaydırma (a[j] = a[j - 1]) yapılır?

Sıralı kısım {6}. Anahtar 3 bir kenara alınır.

6 > 3 → 6 bir sağa kayar; j = 0.

j == 0: başa gelindi, a[0] = 3. İlk 2 öğe sıralı.

Anahtar 8.

6 > 8 yanlış → while hiç dönmez; 8 yerinde kalır.

Anahtar 2: sıralı kısmın hepsinden küçük.

8 > 2 → sağa kayar.

6 > 2 → sağa kayar.

3 > 2 → sağa kayar; j = 0.

a[0] = 2 → sıralı. 4 kaydırma = ters sıralı çift sayısı: (6,3), (6,2), (3,2), (8,2). En kötü O(n²), sıralı dizide O(n).

static void eklemeliSirala(int[] a) {
  for (int k = 1; k < a.length; k++) {
    int anahtar = a[k];
    int j = k;
    while (j > 0 && a[j - 1] > anahtar) {
      a[j] = a[j - 1];   // sağa kaydır
      j--;
    }
    a[j] = anahtar;      // yerleş
  }
}

Çoktan Seçmeli · Özet

Soru 19: Sık Yapılan Hatalar

a ve b birer int[] olmak üzere, hangi kod belirtilen amacı doğru gerçekleştirir?

clone() yeni bir dizi oluşturur; b'deki değişiklik a'ya yansımaz (A). B referansları karşılaştırır, içerik için Arrays.equals gerekir. C [I@… gibi tür@adres basar; Arrays.toString kullanılmalı. D en sinsi olanı: ikili arama sıralı dizi ister; örneğin {8, 3, 5, 1}'de 8'i aramak −5 (bulunamadı) döndürür.

Son

Bölüm 3: Diziler: Çalışma Soruları
Konu anlatımı: Diziler sunumu
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.