← Veri Yapıları

Veri Yapıları · Ünite 1

Veri Yapılarına Giriş

1. Veri ve veri yapısı

Veri, bir nesne ya da olay hakkında kaydedilen ham değerler: metin, ses, resim, video, sayı. Tek başına pek bir şey anlatmaz; düzenlenip işlenince bilgiye dönüşür. İşlenmemiş hâline ham veri denir.

Veri yapısı, verileri bilgisayarda kolay erişilecek ve verimli işlenecek biçimde düzenlemenin yolu. Dizi, yığın, kuyruk, liste, ağaç bunun örnekleri. Amaç: işlerin zaman ve alan karmaşıklığını azaltmak, yani daha az sürede ve daha az bellekle iş görmek.

Veri türü nedir?

Veri türü, derleyiciye ya da yorumlayıcıya bir değişkende ne tür değer tutulacağını söyler. Bir öğrenci kaydını düşün: ad → metin (string), öğrenci no → tam sayı (int), not ortalaması → ondalıklı sayı (float/double), mezun mu → doğru/yanlış (bool).

C# türüBoyutNe tutar?
byte1 bayt0 ile 255 arası tam sayı (işaretsiz)
short2 bayt−32.768 ile 32.767 arası tam sayı
int4 baytYaklaşık ±2,1 milyar arası tam sayı
long8 baytÇok büyük tam sayılar
float / double4 / 8 baytOndalıklı sayı (double daha hassas)
decimal16 baytPara gibi yuvarlama hatası istenmeyen ondalıklılar
bool1 bayttrue ya da false
char2 baytTek bir Unicode karakter
stringDeğişkenKarakter dizisi (metin) — referans türü

Veri türü ≠ veri yapısı

Veri türüVeri yapısı
Nedir?Bir değişkenin alabileceği değerin biçimiBirçok verinin düzenli bir koleksiyonu
KapsamTek bir değerFarklı türden birçok veriyi bir arada tutabilir
UygulamaSoyut (abstract)Somut (concrete)
Zaman karmaşıklığıSöz konusu değilÖnemli rol oynar
Örnekint, float, doubleYığın, kuyruk, ağaç

Neden veri yapısına ihtiyaç var?

Avantajları: soyutlama (soyut veri türleri veri yapılarının üzerine kurulur), belleğin verimli kullanımı (boyut bilinmiyorsa dizi yerine bağlı liste) ve yeniden kullanılabilirlik (bir kez yazılan yapı kütüphaneye konup her yerde kullanılır).

Veri yapılarının sınıflandırılması

Kullanıldığı yerler: işletim sistemleri, grafik, blok zinciri, genetik algoritmalar, görüntü işleme, simülasyon…

2. Algoritma ve akış şeması

Algoritma, problemi çözmek için izlenen adımlar dizisi; adını 9. yüzyılda yaşamış el-Hârizmî'den alır. Bilgisayar bu adımları her seferinde aynı şekilde uygular. Problemi küçük adımlara bölmek, onu koda çevirmeyi kolaylaştırır.

ÖzellikAnlamı
KesinlikAdımlar net, yoruma açık değil.
BenzersizlikHer adımın sonucu tek; sadece önceki adımlara ve girdiye bağlı.
SonlulukSınırlı sayıda adımdan sonra durur.
Girdi / ÇıktıGirdi alır, çıktı üretir.
GenellikTek bir duruma değil, bir girdi kümesine uygulanabilir.

Faydaları: adım adım olduğu için anlaşılır, hata ayıklaması kolay, programlama dilinden bağımsız, ekip çalışmasını kolaylaştırır.

Algoritma tasarlamadan önce

Kendi örneğimiz: dikdörtgenin çevresi. Problem: kenarları alıp çevreyi yazdır. Kısıt: kenarlar pozitif sayı olmalı. Girdi: kısa ve uzun kenar. Çıktı: çevre. Çözüm: 2 × (a + b).

Console.WriteLine("Kısa kenar:");
double a = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Uzun kenar:");
double b = Convert.ToDouble(Console.ReadLine());
double cevre = 2 * (a + b);
Console.WriteLine("Çevre: " + cevre);

Akış şeması

Akış şeması (akış diyagramı), algoritmanın standart geometrik şekiller ve oklarla çizilmiş hâli. Her şeklin anlamı herkesçe bilindiği için ayrıca açıklama gerekmez. Şekillerin içine kısa ifadeler yazılır.

ŞekilGörünüşGörevi
Başla / BitirOvalProgramın başı ve sonu
İşlem / AtamaDikdörtgenHesaplama, değer atama
Girdi / ÇıktıParalelkenarVeri okuma ya da sonuç yazma
KararEşkenar dörtgen (elmas)Evet/hayır sorusu; iki yola ayrılır
DöngüAltıgenTekrar edecek işlemler
Alt süreçKenarları çift çizgili dikdörtgenBaşka yerde tanımlı işlem
Bağlantıİçinde harf olan küçük daireSayfaya sığmayan akışı birleştirir
Akış yönüOkAdımların sırası
Kendi örneğimiz: sayı tek mi, çift mi?

3. Büyük O (Big O) notasyonu

Büyük O, bir algoritmanın girdi büyüdükçe ne kadar yavaşlayacağını cebirsel olarak anlatır. Süre saniyeyle değil işlem sayısıyla ölçülür. n girdi boyutu demek.

Örnek: seçmeli sıralama → O(n²)

Seçmeli sıralama (selection sort): listenin kalanındaki en küçüğü bul, baştaki boş yere koy, bir sonraki yere geç. (4, 1, 3, 2) için: en küçük 1 → (1, 4, 3, 2); kalandaki en küçük 2 → (1, 2, 3, 4); 3 zaten yerinde.

Karşılaştırma sayısı (n−1) + (n−2) + … + 1 = n(n−1)/2 = n²/2 − n/2. Katsayıyı ve küçük terimi atınca O(n²).

Yaygın Büyük O türleri

Eğri ne kadar dikse, büyük girdide o kadar yavaş.
GösterimAdıÖrnek
O(1)SabitDizinin 5. elemanını okumak; girdi büyüse de süre aynı.
O(log n)LogaritmikHer adımda yarıya bölmek: ikili arama (binary search).
O(√n)KarekökAsallık testi: kareköke kadar bölen aramak.
O(n)DoğrusalListeyi baştan sona bir kez gezmek.
O(n log n)Doğrusal aritmikBirleştirme (merge), yığın (heap), ortalamada hızlı (quick) sıralama.
O(n²)Kuadratikİç içe iki döngü; kabarcık, seçmeli, araya ekleme sıralaması.
O(n³)Kübikİç içe üç döngü.
O(nᶜ)Polinomc > 1 için; n² ve n³ de polinomdur.
O(cⁿ)Üstelİkili ağacın derinliğine göre tüm düğümlerini gezmek: O(2ᵈ).
O(n!)FaktöriyelBir kelimenin bütün harf dizilişlerini (permütasyon) üretmek.
nlog nn log nn²2ⁿ
4281616
1646425665.536
3251601.024≈ 4,3 milyar
// O(n): tek döngü
for (int i = 0; i < n; i++)
    toplam += i;

// O(n²): iç içe iki döngü
for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
        sayac++;

// O(log n): her turda yarıya iner
while (n > 1)
    n = n / 2;

En iyi, ortalama, en kötü durum

DurumSembolAnlamı
En iyi (best case)Ω (Büyük Omega)Alt sınır: en şanslı girdide
Ortalama (average case)Θ (Teta)Tipik girdide beklenen
En kötü (worst case)O (Büyük O)Üst sınır: en kötü girdide bile bu kadar

Geliştiriciler genelde en kötü duruma (Big O) göre plan yapar; algoritmanın hep şanslı girdiyle karşılaşacağı garanti değil. «En kötü ihtimalle bu kadar sürer» diyebilmek güvenilir sistem kurmanın temeli. Girdi büyürken davranışı inceleyen bu yönteme asimptotik analiz denir.

Kendini test et!

Cevabı görmek için soruya dokun.

  1. 1.Bir oyunda karakterin can puanı 0–200 arasında tam sayı. Belleği en az kullanan C# türü hangisi?

    ✓ byte (0–255 arası tutar, 1 bayt).

  2. 2.Statik ve dinamik veri yapısı arasındaki fark nedir? Birer örnek ver.

    ✓ Statikte boyut baştan sabittir (dizi); dinamikte program çalışırken büyüyüp küçülebilir (yığın, kuyruk, bağlı liste).

  3. 3.Ağaç ve graf neden doğrusal olmayan yapılardır?

    ✓ Elemanları tek bir sıra üzerinde dizilmez; bir elemandan birden fazla elemana dallanma olur, hepsi tek döngüyle sırayla gezilemez.

  4. 4.Akış şemasında «Not 50'den büyük mü?» sorusu hangi şekille çizilir?

    ✓ Eşkenar dörtgen (karar/karşılaştırma) şekliyle; evet ve hayır olmak üzere iki yola ayrılır.

  5. 5.5n³ + 2n² + 100 ifadesinin Büyük O karşılığı nedir?

    ✓ O(n³). Baskın terim n³; katsayı ve küçük terimler atılır.

  6. 6.1.024 elemanlı sıralı listede ikili arama en fazla kaç adımda sonuca ulaşır?

    ✓ log₂ 1024 = 10 adım. Her adımda arama alanı yarıya iner: O(log n).

  7. 7.Yazılımcılar neden çoğunlukla en kötü duruma göre analiz yapar?

    ✓ Girdinin her zaman şanslı olacağı garanti olmadığından; en kötü durum, algoritmanın en fazla ne kadar süreceğine dair güvenilir bir üst sınır verir.

Kaynak: Anadolu Üniversitesi Açıköğretim Fakültesi, «Veri Yapıları» ders kitabı, Ünite 1. Bu not kitabın yerine geçmez; konuyu kendi cümlelerimle, yapay zekâ desteğiyle özetledim.