Bölüm 1: Giriş
Giriş
Öğrenme Çıktıları
Veri tipi, soyut veri tipi ve veri yapısı arasındaki farkı açıklamak.
Bir problem için uygun veri yapısını gereksinimlere göre seçmek.
Bir ADT'yi arayüz (interface), bir veri yapısını sınıf olarak yazmak; referans ve jenerikleri doğru kullanmak.
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ı.
Analog ses → ADC → 0 ve 1'ler → bilgisayar → DAC → analog ses
Dijital Veri
Dijital Verinin Özellikleri
Veriler 0 ve 1 (ikili) olarak temsil edilir.
1011 0010Elektronik ortamda saklanabilir ve kolayca paylaşılabilir.
disk · bulut · ağBilgisayarlar üzerinde hızlı bir şekilde işlenebilir.
~10⁹ işlem / saniyeDijital Veri
Dijital Verinin Temsil Biçimleri
ASCII, Unicode gibi karakter kodlamaları.
'A' → 65 → 01000001Tam sayılar, kayan nokta sayıları.
13 → 00001101 · 3,14 → IEEE 754Piksellerin renk değerleri.
kırmızı piksel → (R, G, B) = (255, 0, 0)Ses dalgalarının dijital örneklemi.
CD kalitesi → saniyede 44.100 örnekDijital Veri
Dijital Veri Tipleri
| Tür | Açıklama | Örnek |
|---|---|---|
| Yapısal | Belirli bir şemaya göre düzenlenmiş veri | İlişkisel veritabanı tabloları, CSV |
| Yarı Yapısal | Etiketlerle kısmen düzenlenmiş veri | XML, JSON |
| Metin | İnsanlar tarafından okunabilen metinler | TXT, e-posta |
| Resim ve Grafik | Görsel veriler | JPG, PNG |
| Ses ve Müzik | Ses kayıtları | MP3, WAV |
Veri Yapılarına Giriş
Veri Yapıları ve Algoritmalar
- 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.
- 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.
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.
Veri Yapılarına Giriş
İlkel (Primitive) Veri Tipleri
| Java tipi | Boyut | Değerler |
|---|---|---|
byte | 8 bit | −128 … 127 |
short | 16 bit | −32.768 … 32.767 |
int | 32 bit | yaklaşık ±2,1 milyar |
long | 64 bit | yaklaşık ±9,2·1018 |
float | 32 bit | ondalıklı (≈7 basamak) |
double | 64 bit | ondalıklı (≈15 basamak) |
boolean | — | true / false |
char | 16 bit | UTF-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.
Toplama, çıkarma, çarpma, bölme gibi işlemler.
7 / 2 → 3Karşılaştırma, birleştirme, alt dizgi alma gibi işlemler.
"veri" + "yapısı"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;
newnesneyi 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
Veri Yapılarına Giriş · Kodu adım adım çalıştır
Kod İzleme: Değer mi, Referans mı?
x = 5: ilkel değişken, değer doğrudan çerçevededir.
y = x: değerin kopyası alınır; x ile y birbirinden bağımsızdır.
y = 7: yalnız y değişti; x hâlâ 5.
Dizi heap'te oluşturulur; a yalnızca ona bir referans (ok) tutar.
b = a: dizi kopyalanmaz, referans kopyalanır. İki ok aynı nesneyi gösterir.
b[0] = 9: nesnenin kendisi değişti → a[0] de 9 görünür (takma ad, aliasing).
b = new int[2]: b artık yeni nesneyi gösterir; a etkilenmez. Yeni dizi 0 ile dolar.
Çı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
- Tür denetimi derleme zamanında; yanlış tür çalışmadan yakalanır.
- T yalnız referans tipi olabilir:
Kutu<int>yok,Integerkullanı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:
- 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:
Veri Yapılarına Giriş
Soyut Veri Tipleri ve Veri Yapıları
- Listeler, yığınlar, kuyruklar, kümeler, eşlemeler, çizgeler…
- Hangi işlemlerin yapılabileceğini (davranışı) belirler.
- Gerçekleme ayrıntılarına odaklanmaz.
- Bağlı listeler, diziler, komşuluk matrisleri…
- Soyut veri tiplerini uygulayan somut yapılardır.
- Bellek ve performans detaylarına odaklanır.
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.
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 }
| İşlem | Süre |
|---|---|
| size, isEmpty, top | O(1) |
| push, pop | O(1) |
| Bellek | O(N) (kapasite) |
- Java'da jenerik dizi doğrudan oluşturulamaz:
(E[]) new Object[..]. - Kapasite sabit: dolunca
pushhata fırlatır.
Veri Yapılarına Giriş · Kodu adım adım çalıştır
Kod İzleme: push / pop
y, kapasitesi 4 olan boş bir DiziYigin (t = −1). push(5) çağrılır.
size() = 0 ≠ 4 → dolu değil.
++t → t = 0, sonra veri[0] = 5. Önce artır, sonra yaz.
push(8) çağrılır.
size() = 1 ≠ 4 → dolu değil.
++t → t = 1, sonra veri[1] = 8. Önce artır, sonra yaz.
pop() çağrılır; dönen değer yazdırılacak.
t = 1 → boş değil, devam.
e = veri[1] = 8: en son eklenen öğe (LIFO).
Hücre null yapılır (nesne serbest kalsın), t-- → t = 0.
return 8: çerçeve kapanır.
Ekrana 8 yazılır.
push(3): boşalan 1 numaralı hücre yeniden kullanılacak.
size() = 1 ≠ 4 → dolu değil.
++t → t = 1, sonra veri[1] = 3. Önce artır, sonra yaz.
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
| Düzen | İlişki | Günlük hayattan örnek |
|---|---|---|
| Konumsal olmayan | ilişkisiz | sınıftaki öğrenciler |
| Sıralı | bire-bir | sıra bekleyen öğrenciler |
| Ağaç | bire-birçok | aile ağacı |
| Çizge | birçoğa-birçok | yol 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?
Temel Veri Yapıları
Temel Veri Yapıları: Genel Bakış
| Yapı | Temel fikir | Tipik kullanım |
|---|---|---|
| Dizi | ardışık hücreler; indisle O(1) erişim, sabit boyut | tablo ve matris, diğer yapıların temeli |
| Bağlı liste | referanslarla bağlı düğümler; esnek boyut | sık ekleme ve silme |
| Yığın | LIFO: yalnız üstten ekle / çıkar | geri al (undo), çağrı yığını, parantez kontrolü |
| Kuyruk | FIFO: arkadan ekle, önden çıkar | yazdırma kuyruğu, görev sırası, BFS |
| Ağaç | hiyerarşi: kök, çocuk, yaprak | dosya sistemi, HTML belgesi (DOM), indisler |
| Öncelikli kuyruk | en öncelikli öğe hep önde (heap) | görev çizelgeleme, acil servis triyajı |
| Eşleme / hash tablosu | anahtar → değer; h(k) ile kovaya, ortalama O(1) | öğrenci no → kayıt, önbellek, kelime sayımı |
| Küme | tekil öğeler; hızlı üyelik testi | tekrarları ayıklama, birleşim ve kesişim |
| Çizge | düğüm + kenar; birçoğa-birçok ilişki | yol haritası, sosyal ağ, en kısa yol |
Özet
Özet
| Konu | Hatırlanacaklar |
|---|---|
| Dijital veri | metin, sayı, görüntü ve ses 0 ve 1'lerle, farklı kodlamalarla temsil edilir |
| Veri tipi | değer kümesi + işlemler; tip güvenliği hataları derleme zamanında yakalar |
| İlkel / referans | ilkel değişken değeri tutar; referans heap'teki nesneyi gösterir, atama yalnız referansı kopyalar |
| Jenerikler | Kutu<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çimi | erişim biçimi, ekleme / silme sıklığı, sıra ihtiyacı ve ilişki türü belirler |
Özet
Örnek Problemler
- Metin editöründe "geri al" için hangi veri yapısı uygundur? Neden?
- Yazıcıya gelen belgeleri geliş sırasıyla basmak için hangi yapı uygundur?
- Öğrenci numarasıyla öğrenci bilgisine hızlı erişim için hangi yapı uygundur?
- İki nokta arasındaki en kısa yolu bulmak için şehir haritasını nasıl modellersiniz?
- Listedeki tekrar eden öğeleri ayıklamak için hangi yapıyı kullanırsınız?
- Yığın ADT'si Java'da arayüz olarak mı, sınıf olarak mı yazılır?
DiziYiginhangisidir?
Cevapları göster
- Yığın (LIFO): son yapılan işlem ilk geri alınır.
- Kuyruk (FIFO).
- Eşleme / hash tablosu (anahtar: öğrenci no).
- Ağırlıklı çizge: düğümler kavşak, kenarlar yol, ağırlıklar mesafe.
- Küme (set).
- ADT, arayüzdür (
Yigin<E>): ne yapılacağını söyler.DiziYiginonu gerçekleyen sınıftır, yani veri yapısıdır.
Özet
Alıştırmalar
int[] a = {1, 2}; int[] b = a; b[1] = 7;sonrasıa[1]kaçtır? Neden?Kutu<int> k;neden derlenmez? Yerine ne yazılır?'B'karakteri ve 13 sayısı 8 bitle nasıl temsil edilir?String s = "veri"; String t = s; t = t + "!";sonrasısnedir? Neden?- Kapasitesi 3 olan boş
DiziYigin'e push(1), push(2), pop(), push(3), push(4) uygulanıyor. Son durumda t ve dizi nedir? - 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ı
- 7:
b = areferansı kopyalar; iki değişken aynı diziyi gösterir. - T yalnız referans tipi olabilir:
Kutu<Integer>yazılır (otomatik kutulama). - 'B' = 66 =
01000010; 13 =00001101. "veri": String değiştirilemez;t + "!"yeni bir nesne oluşturur ve yalnız t onu gösterir.- t = 2, dizi [1, 3, 4]: pop 2'yi döndürür, 3 onun yerine yazılır.
- 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.