Bölüm 1: Giriş

Veri Yapıları
Dijital veriVeri tipleriJava bellek modeli JeneriklerSoyut veri tipleriVeri yapısı seçimiTemel veri yapıları
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Giriş

Öğrenme Çıktıları

Temel kavramlar

Veri tipi, soyut veri tipi ve veri yapısı arasındaki farkı açıklamak.

Yapı seçimi

Bir problem için uygun veri yapısını gereksinimlere göre seçmek.

Java ile ADT

Bir ADT'yi arayüz (interface), bir veri yapısını sınıf olarak yazmak; referans ve jenerikleri doğru kullanmak.

Temel yapılar

Temel veri yapılarını düzenleme biçimleri ve tipik kullanımlarıyla tanımak.

Dijital Veri

Dijital Veri (Digital Data)

  • Sayı, metin, görüntü ve ses gibi bilgilerin elektronik ortamda 0 ve 1'lerle temsil edilmiş biçimidir.
  • Örnekler: Metin belgeleri, resim dosyaları, veritabanı, ses kayıtları.
ADC01011010101101DAC

Analog ses → ADC → 0 ve 1'ler → bilgisayar → DAC → analog ses

Dijital Veri

Dijital Verinin Özellikleri

Sayısal Olması

Veriler 0 ve 1 (ikili) olarak temsil edilir.

1011 0010
Kolay Saklama

Elektronik ortamda saklanabilir ve kolayca paylaşılabilir.

disk · bulut · ağ
İşlemeye Uygun

Bilgisayarlar üzerinde hızlı bir şekilde işlenebilir.

~10⁹ işlem / saniye
Bilgisayar yalnızca 0 ve 1'leri tanır. Veri yapıları, bu bitleri anlamlı ve verimli bir düzende tutmanın yollarıdır.

Dijital Veri

Dijital Verinin Temsil Biçimleri

Metin

ASCII, Unicode gibi karakter kodlamaları.

'A' → 65 → 01000001
Sayısal

Tam sayılar, kayan nokta sayıları.

13 → 00001101 · 3,14 → IEEE 754
Görüntü

Piksellerin renk değerleri.

kırmızı piksel → (R, G, B) = (255, 0, 0)
Ses

Ses dalgalarının dijital örneklemi.

CD kalitesi → saniyede 44.100 örnek

Dijital Veri

Dijital Veri Tipleri

TürAçıklamaÖrnek
YapısalBelirli bir şemaya göre düzenlenmiş veriİlişkisel veritabanı tabloları, CSV
Yarı YapısalEtiketlerle kısmen düzenlenmiş veriXML, JSON
Metinİnsanlar tarafından okunabilen metinlerTXT, e-posta
Resim ve GrafikGörsel verilerJPG, PNG
Ses ve MüzikSes kayıtlarıMP3, WAV

Veri Yapılarına Giriş

Veri Yapıları ve Algoritmalar

Algoritma
  • Belirli bir görevi gerçekleştirmek için adım adım hazırlanan bir plan veya talimatlar bütünüdür.
  • Bilgisayar biliminde temel bir yapı taşıdır.
Veri Yapısı
  • Verilerin organize edilmesini sağlayan ve depolanma biçimlerini tanımlayan yapılardır.
  • Verilerin etkili yönetimi ve işlenmesi için temel altyapıyı sağlar.
  • Etkili algoritmalar ve veri yapıları, yazılımın verimli çalışmasını sağlar.
  • Problemlere sistemli ve etkili çözümler sunar.
Algoritmalar + Veri Yapıları = Programlar
Niklaus Wirth'in 1976 tarihli kitabının adı

Veri Yapılarına Giriş

Veri Yapıları

  • Verileri bilgisayarda düzenlemenin ve saklamanın bir yoludur.
  • Temel amacı, verilere hızlı ve etkili bir şekilde erişmeyi sağlamaktır.
  • Veri yapılarını anlamak, yazılım geliştirme sürecinde çok önemlidir.
  • Doğru veri yapısı seçimi, programın performans ve verimliliğini artırır.

Aynı eşyalar: solda dağınık, sağda düzenli.
Aradığını hangisinde daha hızlı bulursun?

Veri Yapılarına Giriş

Temel Yapı Taşları

  • Nesneler: Nitelikleri, isimlendirilmiş alanlara sahip tek bir birimde gruplar.
  • Diziler: Varlıkları, bellekte ardışık yuvalarda toplu olarak saklar.
  • Bağlantılar: Varlıklar arasında isteğe bağlı yönlü ilişkilere olanak tanır.
Nesneler
Diziler
Bağlantılar

Veri Yapılarına Giriş

İlkel (Primitive) Veri Tipleri

Java tipiBoyutDeğerler
byte8 bit−128 … 127
short16 bit−32.768 … 32.767
int32 bityaklaşık ±2,1 milyar
long64 bityaklaşık ±9,2·1018
float32 bitondalıklı (≈7 basamak)
double64 bitondalıklı (≈15 basamak)
boolean—true / false
char16 bitUTF-16 kod birimi
  • Tam sayılar, ondalıklı sayılar, mantıksal değerler ve karakterler.
  • Basit ve temel veri tipleridir.
  • Bellekte sabit bir boyuta sahiptirler.
  • İşlemci tarafından doğrudan işlenebilirler.

Veri Yapılarına Giriş

Veri Tipleri

  • Veri Tipi: Bir değer kümesini ve davranışlarını tanımlar.
  • Değer Kümesi: Bir veri tipinin alabileceği geçerli değerler.
  • Davranışlar: Değerler üzerinde gerçekleştirilebilecek işlemler.
  • Her işlem her türde geçerli değildir.
  • Tip Güvenliği: Veri tipleri, hataları en aza indirmek için kullanılır. Kısıtlamalar, programcılara neyin mümkün olup olmadığını söyler.
Tam Sayılar

Toplama, çıkarma, çarpma, bölme gibi işlemler.

7 / 2 → 3
Metin Dizileri

Karşılaştırma, birleştirme, alt dizgi alma gibi işlemler.

"veri" + "yapısı"
Geçersiz işlem

Derleyici hatayı çalıştırmadan yakalar.

"abc" * 2 → derleme hatası

Veri Yapılarına Giriş · Java bellek modeli

Java'da Bellek: Yığın ve Heap

  • İlkel değişken değeri doğrudan tutar.
  • Referans değişken, heap'teki nesnenin adresini tutar; new nesneyi heap'te oluşturur.
  • Her metot çağrısı yığında bir çerçeve açar; yerel değişkenler oradadır, dönüşte silinir.
  • Erişilemeyen nesneleri çöp toplayıcı temizler; p[0] → NullPointerException.
int x = 5;               // ilkel: değer
int[] a = {7, 2, 9};     // referans → dizi
String s = "veri";       // referans → nesne
int[] p = null;          // hiçbir şeyi göstermez
Çağrı yığını (stack)main()x5aspnullHeapint[3]729String"veri"değer / referansnesneler

Veri Yapılarına Giriş · Kodu adım adım çalıştır

Kod İzleme: Değer mi, Referans mı?

main() çerçevesiHeapx5y—a—b—

x = 5: ilkel değişken, değer doğrudan çerçevededir.

main() çerçevesiHeapx5y5a—b—

y = x: değerin kopyası alınır; x ile y birbirinden bağımsızdır.

main() çerçevesiHeapx5y7a—b—

y = 7: yalnız y değişti; x hâlâ 5.

main() çerçevesiHeapx5y7ab—int[3] (nesne #1)123

Dizi heap'te oluşturulur; a yalnızca ona bir referans (ok) tutar.

main() çerçevesiHeapx5y7abint[3] (nesne #1)123

b = a: dizi kopyalanmaz, referans kopyalanır. İki ok aynı nesneyi gösterir.

main() çerçevesiHeapx5y7abint[3] (nesne #1)923

b[0] = 9: nesnenin kendisi değişti → a[0] de 9 görünür (takma ad, aliasing).

main() çerçevesiHeapx5y7abint[3] (nesne #1)923int[2] (nesne #2)00

b = new int[2]: b artık yeni nesneyi gösterir; a etkilenmez. Yeni dizi 0 ile dolar.

main() çerçevesiHeapx5y7abint[3] (nesne #1)923int[2] (nesne #2)00

Çıktı 5 9. Kural: = ilkel tipte değeri, referans tipte adresi kopyalar.

int x = 5;
int y = x;
y = 7;
int[] a = {1, 2, 3};
int[] b = a;
b[0] = 9;
b = new int[2];
System.out.println(x + " " + a[0]);

Veri Yapılarına Giriş · Java

Jenerikler: Her Tür İçin Tek Yapı

public class Kutu<T> {
  private T icerik;
  public void koy(T x) { icerik = x; }
  public T al() { return icerik; }
}

Kutu<String> k = new Kutu<>();
k.koy("veri");
String s = k.al();      // dönüşüm gerekmez
Kutu<Integer> m = new Kutu<>();
m.koy(42);              // int → Integer
// m.koy("x");          // DERLEME HATASI
Kutu<T>tek şablon, T = tür parametresiKutu<String>Kutu<Integer>"veri"42yalnızca T türünde öğe kabul eder
  • Tür denetimi derleme zamanında; yanlış tür çalışmadan yakalanır.
  • T yalnız referans tipi olabilir: Kutu<int> yok, Integer kullanılır.
  • Java koleksiyonları jeneriktir: ArrayList<E>, Map<K,V>.

Veri Yapılarına Giriş

İlkel Olmayan (Non-Primitive) Veri Yapıları

Daha karmaşık veri yapılarıdır. Örneğin:

SıralıDiziler, listeler
BağlantılıBağlı listeler
HiyerarşikAğaçlar
Ağ (Network)Çizgeler
İndislenmişHash tabloları
…Kümeler, eşlemeler
  • Karmaşıktır ve birden fazla ilkel veri tipini içerebilir.
  • Çoğu dinamik boyutludur (diziler hariç); saklanan veri miktarı değişebilir.
  • Özelleştirilmiş işlemleri gerçekleştirmek için kullanılırlar.

Veri Yapılarına Giriş

Farklı Veri Yapıları: Bir Bakışta

Aynı dört değer (7, 2, 9, 5), sekiz farklı düzende. Her birinin güçlü ve zayıf yönü farklıdır:

07122935a[2] → 9 (tek adım)
Diziardışık hücreler, indisle O(1) erişim, sabit boyut
7295başi. öğeye gitmek: O(n)
Bağlı listereferanslarla bağlı düğümler, esnek boyut
7295üst →pushpop
YığınLIFO: yalnız üstten ekle/çıkar
7295önarkaönden çık · arkadan gir
KuyrukFIFO: ilk giren ilk çıkar
7295kök
Ağaçhiyerarşi: kök, çocuk, yaprak
7295
Çizgedüğüm + kenar, birçoğa-birçok ilişki
051272349k mod 5
Hash tablosuh(k) ile kovaya; ortalama O(1)
7295{7, 2, 9, 5} ∪ {7} = aynı
Küme / Eşlemetekil öğe / anahtar → değer

Veri Yapılarına Giriş

Soyut Veri Tipleri ve Veri Yapıları

Soyut Veri Tipi (ADT)
  • Listeler, yığınlar, kuyruklar, kümeler, eşlemeler, çizgeler…
  • Hangi işlemlerin yapılabileceğini (davranışı) belirler.
  • Gerçekleme ayrıntılarına odaklanmaz.
Veri Yapısı (Data Structure)
  • Bağlı listeler, diziler, komşuluk matrisleri…
  • Soyut veri tiplerini uygulayan somut yapılardır.
  • Bellek ve performans detaylarına odaklanır.
Liste ADT ekle · sil · al(i) · boyut Dizi Bağlı liste

Veri Yapılarına Giriş

ADT'den Java'ya: Arayüz (interface)

public interface Yigin<E> {
  int size();         // öğe sayısı
  boolean isEmpty();  // boş mu?
  void push(E e);     // üste ekle
  E top();            // üsttekini döndür
  E pop();            // üsttekini çıkar
}
  • interface = ADT'nin sözleşmesi: ne yapılır.
  • class = veri yapısı: nasıl yapılır.
  • Aynı ADT'nin birden çok gerçeklemesi olabilir.
İstemci (client) koduy.push(5); y.pop();yalnız işlemleri bilir«interface» Yigin<E>size · isEmpty · pushtop · popimplementsDiziYigin<E>dizi + t indisiBagliYigin<E>bağlı düğümler
Yigin<Integer> y = new DiziYigin<>(10); — gerçeklemeyi değiştirmek için yalnız bu satır değişir; istemci kodu aynı kalır.

Veri Yapılarına Giriş · ADT → veri yapısı

Bir Gerçekleme: DiziYigin

public class DiziYigin<E> implements Yigin<E> {
  private E[] veri;         // öğeler
  private int t = -1;       // üst öğenin indisi
  public DiziYigin(int kapasite) {
    veri = (E[]) new Object[kapasite];
  }
  public int size() { return t + 1; }
  public boolean isEmpty() { return t == -1; }
  public E top() {
    if (isEmpty()) return null;
    return veri[t];
  }
  // push ve pop
}
05182null3null▲ t = 1size() = t + 1 = 2
İşlemSüre
size, isEmpty, topO(1)
push, popO(1)
BellekO(N) (kapasite)
  • Java'da jenerik dizi doğrudan oluşturulamaz: (E[]) new Object[..].
  • Kapasite sabit: dolunca push hata fırlatır.

Veri Yapılarına Giriş · Kodu adım adım çalıştır

Kod İzleme: push / pop

0null1null2null3nullt = −1 (boş)

y, kapasitesi 4 olan boş bir DiziYigin (t = −1). push(5) çağrılır.

0null1null2null3nullt = −1 (boş)

size() = 0 ≠ 4 → dolu değil.

051null2null3null▲ t

++t → t = 0, sonra veri[0] = 5. Önce artır, sonra yaz.

051null2null3null▲ t

push(8) çağrılır.

051null2null3null▲ t

size() = 1 ≠ 4 → dolu değil.

05182null3null▲ t

++t → t = 1, sonra veri[1] = 8. Önce artır, sonra yaz.

05182null3null▲ t

pop() çağrılır; dönen değer yazdırılacak.

05182null3null▲ t

t = 1 → boş değil, devam.

05182null3null▲ te8

e = veri[1] = 8: en son eklenen öğe (LIFO).

051null2null3null▲ te8

Hücre null yapılır (nesne serbest kalsın), t-- → t = 0.

051null2null3null▲ te8

return 8: çerçeve kapanır.

051null2null3null▲ t

Ekrana 8 yazılır.

051null2null3null▲ t

push(3): boşalan 1 numaralı hücre yeniden kullanılacak.

051null2null3null▲ t

size() = 1 ≠ 4 → dolu değil.

05132null3null▲ t

++t → t = 1, sonra veri[1] = 3. Önce artır, sonra yaz.

05132null3null▲ t

Son durum: [5, 3], t = 1. Her işlem n'den bağımsız, sabit sayıda adım → O(1).

public void push(E e) {
  if (size() == veri.length)
    throw new IllegalStateException("dolu");
  veri[++t] = e;
}
public E pop() {
  if (isEmpty()) return null;
  E e = veri[t];
  veri[t--] = null;     // GC için boşalt
  return e;
}
y.push(5); y.push(8);
System.out.println(y.pop());
y.push(3);

Veri Yapılarına Giriş

Verilerin Düzenlenmesi

Konumsal olmayan
Sıralı
Ağaç
Çizge
DüzenİlişkiGünlük hayattan örnek
Konumsal olmayanilişkisizsınıftaki öğrenciler
Sıralıbire-birsıra bekleyen öğrenciler
Ağaçbire-birçokaile ağacı
Çizgebirçoğa-birçokyol haritası

Veri Yapılarına Giriş

Veri Yapısı Seçimi

Aşağıdaki sorular kritik rol oynar:

  • Veri yapısı başlangıçta tamamen doldurulabilir mi?
  • Veri yapısından öğeler silinebilir mi?
  • Ekleme sırasının önemi var mı?
  • Veri yapısındaki öğeler sıralanabilir mi?
  • Öğeler belirli bir sırayla mı işlenir, yoksa rastgele erişim de gerekli mi?
Durum değişmeyecekse statik (static) yapılar; sık ekleme / silme varsa dinamik yapılar.
İndisle (konuma göre) hızlı erişim?evetDizihayırSık başa / araya ekleme-silme?evetBağlı listehayırSon eklenen ilk mi çıkmalı?evetYığınhayırİlk eklenen ilk mi çıkmalı?evetKuyrukhayırAnahtarla arama veya tekillik?evetEşleme / KümehayırHiyerarşi ya da ağ ilişkisi?evetAğaç / Çizge

Temel Veri Yapıları

Temel Veri Yapıları: Genel Bakış

YapıTemel fikirTipik kullanım
Diziardışık hücreler; indisle O(1) erişim, sabit boyuttablo ve matris, diğer yapıların temeli
Bağlı listereferanslarla bağlı düğümler; esnek boyutsık ekleme ve silme
YığınLIFO: yalnız üstten ekle / çıkargeri al (undo), çağrı yığını, parantez kontrolü
KuyrukFIFO: arkadan ekle, önden çıkaryazdırma kuyruğu, görev sırası, BFS
Ağaçhiyerarşi: kök, çocuk, yaprakdosya sistemi, HTML belgesi (DOM), indisler
Öncelikli kuyruken öncelikli öğe hep önde (heap)görev çizelgeleme, acil servis triyajı
Eşleme / hash tablosuanahtar → değer; h(k) ile kovaya, ortalama O(1)öğrenci no → kayıt, önbellek, kelime sayımı
Kümetekil öğeler; hızlı üyelik testitekrarları ayıklama, birleşim ve kesişim
Çizgedüğüm + kenar; birçoğa-birçok ilişkiyol haritası, sosyal ağ, en kısa yol

Özet

Özet

KonuHatırlanacaklar
Dijital verimetin, sayı, görüntü ve ses 0 ve 1'lerle, farklı kodlamalarla temsil edilir
Veri tipideğer kümesi + işlemler; tip güvenliği hataları derleme zamanında yakalar
İlkel / referansilkel değişken değeri tutar; referans heap'teki nesneyi gösterir, atama yalnız referansı kopyalar
JeneriklerKutu<T>: her referans tipi için tek sınıf; int yerine Integer
ADT / veri yapısıADT ne yapılacağını (arayüz), veri yapısı nasıl yapılacağını (sınıf) belirler
Yapı seçimierişim biçimi, ekleme / silme sıklığı, sıra ihtiyacı ve ilişki türü belirler

Özet

Örnek Problemler

  1. Metin editöründe "geri al" için hangi veri yapısı uygundur? Neden?
  2. Yazıcıya gelen belgeleri geliş sırasıyla basmak için hangi yapı uygundur?
  3. Öğrenci numarasıyla öğrenci bilgisine hızlı erişim için hangi yapı uygundur?
  4. İki nokta arasındaki en kısa yolu bulmak için şehir haritasını nasıl modellersiniz?
  5. Listedeki tekrar eden öğeleri ayıklamak için hangi yapıyı kullanırsınız?
  6. Yığın ADT'si Java'da arayüz olarak mı, sınıf olarak mı yazılır? DiziYigin hangisidir?
Cevapları göster
  1. Yığın (LIFO): son yapılan işlem ilk geri alınır.
  2. Kuyruk (FIFO).
  3. Eşleme / hash tablosu (anahtar: öğrenci no).
  4. Ağırlıklı çizge: düğümler kavşak, kenarlar yol, ağırlıklar mesafe.
  5. Küme (set).
  6. ADT, arayüzdür (Yigin<E>): ne yapılacağını söyler. DiziYigin onu gerçekleyen sınıftır, yani veri yapısıdır.

Özet

Alıştırmalar

  1. int[] a = {1, 2}; int[] b = a; b[1] = 7; sonrası a[1] kaçtır? Neden?
  2. Kutu<int> k; neden derlenmez? Yerine ne yazılır?
  3. 'B' karakteri ve 13 sayısı 8 bitle nasıl temsil edilir?
  4. String s = "veri"; String t = s; t = t + "!"; sonrası s nedir? Neden?
  5. Kapasitesi 3 olan boş DiziYigin'e push(1), push(2), pop(), push(3), push(4) uygulanıyor. Son durumda t ve dizi nedir?
  6. Müzik çalar: sıralı çalma listesi, "son çalınanlar" ve şarkı adına göre hızlı arama için hangi yapılar uygundur?
Cevaplar / ipuçları
  1. 7: b = a referansı kopyalar; iki değişken aynı diziyi gösterir.
  2. T yalnız referans tipi olabilir: Kutu<Integer> yazılır (otomatik kutulama).
  3. 'B' = 66 = 01000010; 13 = 00001101.
  4. "veri": String değiştirilemez; t + "!" yeni bir nesne oluşturur ve yalnız t onu gösterir.
  5. t = 2, dizi [1, 3, 4]: pop 2'yi döndürür, 3 onun yerine yazılır.
  6. Liste (çalma sırası), yığın (son çalınan en üstte), eşleme (ad → şarkı).

Özet

Kaynaklar

  • Goodrich, Tamassia ve Goldwasser, Data Structures and Algorithms in Java, 6. baskı, 2014.
  • Wirth, Algorithms + Data Structures = Programs, 1976.
  • Oracle, Java SE 17 API belgeleri.

Son

Bölüm 1: Giriş
Sonraki sunum: Bölüm 2: Algoritma Analizi · Çalışma soruları · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.