Bölüm 2: Diziler ve Yapılar
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Dizi ve Adres hesabı
Dizi öğelerinin ardışık yerleşimini ve adres hesabını açıklamak.
a[i] neden O(1)'dir?
Giriş
Öğrenme Çıktıları
Dizi öğelerinin ardışık yerleşimini ve adres hesabını açıklamak.
İlişkili alanları struct ile tek bir tür altında toplamak.
malloc, realloc ve free yaşam döngüsünü güvenle yönetmek.
Yoğun ve seyrek matris gösterimlerini karşılaştırmak.
Temel Kavramlar
Dizinin gücü: sabit zamanda erişim
Başlangıç adresi ve öğe boyutu bilindiğinde herhangi bir indis doğrudan hesaplanabilir.
Öğeler bellekte yan yanadır; önbellek yerelliği yüksektir.
Yer ayrıldıktan sonra kapasite kendiliğinden büyümez.
a[i] adresi başlangıç + i × sizeof(T) ile bulunur.
Araya ekleme ve silme, sonraki öğeleri taşımayı gerektirir.
Temel Kavramlar
Kavram Haritası
Gösterim
Bellekte bir int dizisi
&a[3] = başlangıç + 3 × sizeof(int)
C ile Gerçekleştirim
Dizi ile kayıtları birleştirmek
typedef struct {
int no;
char ad[32];
double ortalama;
} Ogrenci;
Ogrenci sinif[40];C ile Gerçekleştirim
C'de Bellek ve Sahiplik
Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.
Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.
Boyut, kapasite ve geçerli indisleri her işlemde koru.
NULL, boş yapı ve tek öğe durumlarını özellikle dizi sınırının dışına çıkmak riskiyle birlikte test et.
Temel İşlemler
Dinamik kapasite büyütme
int *gecici = realloc(dizi, yeni_kapasite * sizeof *dizi);
if (gecici == NULL) {
/* Eski dizi hâlâ geçerli. */
hata_isle();
}
dizi = gecici;
kapasite = yeni_kapasite;Temel İşlemler
Kodu Okurken
a[i] neden O(1)'dir?
Her adımda ardışıklık kuralı korunuyor mu?
İlişkili alanları struct ile tek bir tür altında toplamak.
realloc sonucunu doğrudan eski göstergeye yazmak
Adım Adım
Araya ekleme: 9 değerini indis 2'ye koy
[12, 7, 25, 4, 18], boyut = 5
18, 4 ve 25 birer hücre sağa kaydırılır.
a[2] = 9 yapılır.
[12, 7, 9, 25, 4, 18], boyut = 6; maliyet O(n).
Sınıf Notu
Dersten Sesler
“Eğer performansı artıracaksa, makul ölçüde olmak kaydıyla fazladan bellek kullanmakta sakınca yok.”
“Dizi aç, n. indis n. üssü tutsun. SAKIN HA! Önce verinin gerçekten yoğun olup olmadığına bak.”
Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.
Analiz
Karmaşıklık Özeti
| İşlem | Zaman | Ek bellek |
|---|---|---|
| a[i] erişimi | O(1) | O(1) |
| Sonda ekleme (boş yer) | O(1) | O(1) |
| Araya ekleme | O(n) | O(1) |
| Doğrusal arama | O(n) | O(1) |
| m×n matris tarama | O(mn) | O(1) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Boyut biliniyor ve indisle erişim baskınsa.
Okuma yoğun, sona ekleme sık ve kapasite büyüyebiliyorsa.
Aynı türden kayıtlar tablo gibi işlenecekse.
Matrisin büyük bölümü sıfırsa yalnız dolu hücreleri saklamak için.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- a[i] neden O(1)'dir?
- Kapasite dolu dinamik dizi nasıl büyütülür?
- struct ile paralel diziler arasında ne fark vardır?
- Satır-major bir matriste a[i][j] adresi hangi bilgilere bağlıdır?
- Seyrek matris ne zaman bellek kazandırır?
Cevapları göster
- Adres doğrudan aritmetik ile hesaplanır.
- Daha büyük blok ayrılır; öğeler kopyalanır; eski blok bırakılır.
- struct bir kayda ait alanları birlikte tutar ve tutarlılığı artırır.
- Başlangıç adresi, sütun sayısı, i, j ve öğe boyutu.
- Sıfır olmayan öğe sayısı toplam hücre sayısından çok küçükse.
Uygulama
Mini Laboratuvar
a[i] neden O(1)'dir?
struct ile paralel diziler arasında ne fark vardır?
Seyrek matris ne zaman bellek kazandırır?
Özet
Bölüm Özeti
İndisle erişim O(1).
Araya ekleme ve silme O(n).
Her ayırmanın bir sahibi ve bırakma noktası olmalı.
Özet
Kaynaklar ve Devam
- Veri Yapıları ve Algoritmalar 1, PDF s. 16-24
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.