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.
- →Zaman karmaşıklığı: algoritmanın adımları yürütmek için harcadığı süre (işlem sayısıyla ölçülür).
- →Alan karmaşıklığı: harcadığı bellek. İki parçası var: girdi alanı (verinin kendisi) ve yardımcı alan (algoritmanın ek olarak kullandığı yer).
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ü | Boyut | Ne tutar? |
|---|---|---|
| byte | 1 bayt | 0 ile 255 arası tam sayı (işaretsiz) |
| short | 2 bayt | −32.768 ile 32.767 arası tam sayı |
| int | 4 bayt | Yaklaşık ±2,1 milyar arası tam sayı |
| long | 8 bayt | Çok büyük tam sayılar |
| float / double | 4 / 8 bayt | Ondalıklı sayı (double daha hassas) |
| decimal | 16 bayt | Para gibi yuvarlama hatası istenmeyen ondalıklılar |
| bool | 1 bayt | true ya da false |
| char | 2 bayt | Tek bir Unicode karakter |
| string | Değişken | Karakter 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çimi | Birçok verinin düzenli bir koleksiyonu |
| Kapsam | Tek bir değer | Farklı türden birçok veriyi bir arada tutabilir |
| Uygulama | Soyut (abstract) | Somut (concrete) |
| Zaman karmaşıklığı | Söz konusu değil | Önemli rol oynar |
| Örnek | int, float, double | Yığın, kuyruk, ağaç |
Neden veri yapısına ihtiyaç var?
- →Çok sayıda istek: aynı anda binlerce kullanıcının isteğini karşılamak.
- →İşlem hızı: büyük veride sadece hızlı işlemci yetmez, verinin düzeni de önemli.
- →Veri arama: aranan kaydı en kısa sürede bulmak.
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ı
- →Doğrusal: elemanlar sıra hâlinde dizilir, her elemanın bir öncesi ve bir sonrası vardır. Dizi, yığın, kuyruk, bağlı liste.
- →Statik: boyutu baştan sabit; elemana erişmek kolay. Örnek: dizi.
- →Dinamik: boyutu program çalışırken değişebilir. Örnek: kuyruk, yığın, bağlı liste.
- →Doğrusal olmayan: elemanlar tek bir sıra üzerinde değil; hepsini tek bir döngüyle gezemezsin. Örnek: ağaç ve graf.
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.
| Özellik | Anlamı |
|---|---|
| Kesinlik | Adımlar net, yoruma açık değil. |
| Benzersizlik | Her adımın sonucu tek; sadece önceki adımlara ve girdiye bağlı. |
| Sonluluk | Sınırlı sayıda adımdan sonra durur. |
| Girdi / Çıktı | Girdi alır, çıktı üretir. |
| Genellik | Tek 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
- →Problemi net tanımla.
- →Kısıtları belirle.
- →Girdiyi belirle.
- →Beklenen çıktıyı belirle.
- →Çözümün kısıtlar içinde kaldığından emin ol.
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).
- →1. BAŞLA
- →2. a ve b değişkenlerini tanımla, kullanıcıdan oku
- →3. cevre = 2 · (a + b) hesapla
- →4. cevre değerini yazdır
- →5. BİTİR
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.
| Şekil | Görünüş | Görevi |
|---|---|---|
| Başla / Bitir | Oval | Programın başı ve sonu |
| İşlem / Atama | Dikdörtgen | Hesaplama, değer atama |
| Girdi / Çıktı | Paralelkenar | Veri okuma ya da sonuç yazma |
| Karar | Eşkenar dörtgen (elmas) | Evet/hayır sorusu; iki yola ayrılır |
| Döngü | Altıgen | Tekrar edecek işlemler |
| Alt süreç | Kenarları çift çizgili dikdörtgen | Başka yerde tanımlı işlem |
| Bağlantı | İçinde harf olan küçük daire | Sayfaya sığmayan akışı birleştirir |
| Akış yönü | Ok | Adımların sırası |
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
| Gösterim | Adı | Örnek |
|---|---|---|
| O(1) | Sabit | Dizinin 5. elemanını okumak; girdi büyüse de süre aynı. |
| O(log n) | Logaritmik | Her adımda yarıya bölmek: ikili arama (binary search). |
| O(√n) | Karekök | Asallık testi: kareköke kadar bölen aramak. |
| O(n) | Doğrusal | Listeyi baştan sona bir kez gezmek. |
| O(n log n) | Doğrusal aritmik | Birleş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ᶜ) | Polinom | c > 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öriyel | Bir kelimenin bütün harf dizilişlerini (permütasyon) üretmek. |
| n | log n | n log n | n² | 2ⁿ |
|---|---|---|---|---|
| 4 | 2 | 8 | 16 | 16 |
| 16 | 4 | 64 | 256 | 65.536 |
| 32 | 5 | 160 | 1.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
| Durum | Sembol | Anlamı |
|---|---|---|
| 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.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.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.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.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.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.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.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.