CEN207 Veri Yapıları · Hafta 1

Giriş, Big-O ve İşaretçiler

CEN207 Veri Yapıları — Hafta 1

Dr. Öğr. Üyesi Uğur CORUH · 2026-2027 Güz

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Bugünün planı (3 saat)

Saat Konu
1 Ders planı · veri yapısı nedir · doğrusal / doğrusal olmayan
2 Big-O: arama, büyüme, döngüler, alan Animasyon 1–5
3 İşaretçiler, yığın/öbek, TLV/PER Animasyon 6–13 · C atölyesi Animasyon 14

Öğrenme çıktıları: LO.1 (doğrusal/doğrusal olmayan yapılar) · LO.2 (zaman ve alan karmaşıklığı) · LO.7 (doğru yapıyı seçmek)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Bu haftanın kavramları — nerede

Kavram Nerede
Veri yapısı, doğrusal / doğrusal olmayan Bölüm 1–2
Big-O, büyüme, en iyi/en kötü/ortalama, alan Bölüm 3
İşaretçiler, struct'lar Bölüm 4
Yığın, öbek, TLV/PER, C atölyesi Bölüm 5–7
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod örnekleri nasıl çalışıyor

  • Her fikrin eksiksiz bir C ve Java programı var
  • C: gcc -std=c11 -Wall -Wextra -o /tmp/x file.c && /tmp/x
  • Java: javac -d /tmp/j File.java && java -cp /tmp/j File
  • Kaynaklar: code/week-01/c/ ve code/week-01/java/
  • Her programın beklenen çıktısı hafta notlarında
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Ders düzeni: nasıl değerlendirileceksiniz

  • Tek bir proje, tüm dönem boyunca: önce C, sonra Java
  • İki ara kontrol: C'de bir vize, Java'da bir final
  • İki quiz — ayrı bir ödev yok
  • Bunun gibi haftalık notlar, İngilizce ve Türkçe
  • Tam not dağılımı: ders izlencesi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Ders düzeni: takımlar ve kaynaklar

  • Takım büyüklüğü: proje takımı başına en çok 3 öğrenci
  • 3. haftadan sonra takım değişikliği yok
  • Proje kılavuzu: docs/project-guide/
  • Ön koşullar: docs/prerequisites/ (C araç zinciri, alt yapı)
  • Eski bir izlence PDF'i dersle çelişiyorsa: sorun, tahmin etmeyin
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Bu haftanın — ve dersin — haritası

Bu hafta ne kuruyor Sonraki her hafta ne ekliyor
Maliyeti ölçmenin yolu (Big-O) Veriyi düzenlemenin bir yolu daha
Belleğin bir resmi (işaretçiler) Aynı Big-O aracıyla değerlendiriliyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

1. Veri Yapısı Nedir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Başlangıç sorusu

Telefonunuzun rehberi on binlerce isim
arasında "Ayşe"yi anında bulur. Sırasız
olsaydı, aynı telefon her ismi taramak zorunda kalırdı.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kısa bir tarihçe

  • 1960'lar — "veri yapısı" terimi bilgisayar bilimlerinde yaygınlaşır
  • 1968 — Knuth'un TAOCP Cilt 1'i liste, yığın, ağaçları inceler
  • 1974 — Liskov & Zilles: soyut veri tipi (ADT)
  • ADT = yapının ne yaptığı, nasıl kurulduğu değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sezgi: veri için mobilya

  • Dosya dolabı, kitaplık, masadaki tepsi yığını
  • Her biri aynı türde içeriği tutar
  • Her biri farklı şeylerde iyidir
  • Tek bir "en iyi" düzen yok — yalnızca ödünleşimler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Veri yapısı, tam olarak

Verileri öyle düzenlemenin bir yolu ki belirli
işlemler — erişim, arama, ekleme, silme —
bilinen, çözümlenebilir bir maliyetle yapılabilsin.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Neden tek bir tane yok

İşlem Neden bedava değil
Erişim Bazı düzenler konumu hesaplar; bazıları baştan yürür
Arama Sırasız: tek tek kontrol. Sıralı: yarıya indirilebilir
Ekleme / Silme Bazıları her şeyi kaydırır; bazıları iki işaretçiyi bağlar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Her şeyde diğer her yapıyı geride bırakan
tek bir "en iyi" veri yapısı neden yok?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

Her düzen bir ödünleşim yapar: erişimi
hızlandıran (örn. sıralı dizi), genelde
eklemeyi yavaşlatır — ve tersi. İstisnasız.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

2. Doğrusal ve Doğrusal Olmayan: Dersin Haritası

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Başlangıç sorusu

Son beş şarkınız tek bir çizgi oluşturur.
Bir şirketin org şeması dallanır. Bu yalnızca
çizimle mi ilgili, yoksa gerçek bir yapısal fark mı?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Tanımlar

  • Doğrusal: her elemanın tam olarak bir "sonraki"si var
  • Her zaman "sırada ne var?" diye sorabilir, tek yanıt alırsınız
  • Doğrusal olmayan: bir elemanın birden çok "sonraki"si olabilir
  • Gezmek, hangi dalı izleyeceğinizi seçmek demektir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Ders, sıralandı: doğrusal yapılar

Yapı Ne zaman Belirleyici ödünleşim
Dizi (array) Hafta 2 O(1) erişim; ortada O(n) ekleme/silme
Bağlı liste Hafta 2 O(n) erişim; oraya varınca O(1) ekleme/silme
Yığın (stack, LIFO) Hafta 3 Yalnızca bir uca dokunun; her işlem O(1)
Kuyruk (queue, FIFO) Hafta 3 Bir uçtan ekle, diğerinden çıkar; her işlem O(1)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Ders, sıralandı: doğrusal olmayan ve anahtarla

Yapı Ne zaman Belirleyici ödünleşim
İkili ağaç, heap Hafta 4 Dengeliyken O(log n), en çok 2 çocuk
Çizge (graph) Hafta 5–6 Herhangi sayıda bağlantı; ağlar, haritalar
Hash tablosu (anahtarla) Hafta 7 Ortalama O(1), konumla değil anahtarla
Dosyalar (diskte) Hafta 13–15 Aynı ödünleşimler, disk G/Ç ile ödenir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sık yapılan hatalar

  • "Doğrusal olmayan" "düzensiz" anlamına gelmez
  • "Sıralı" ile "doğrusal" aynı şey değil — farklı eksenler
  • Bir hash tablosunun yuvaları doğrusaldır; anahtarla erişim yeni olan
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Bir tabak yığını doğrusal mı, doğrusal
olmayan mı? Neden?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

Doğrusal. Her tabağın (en üsttekiler
hariç) tam olarak bir üstü, (en alttaki
hariç) tam olarak bir altı var — tek "sonraki".

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Bir soy ağacı doğrusal mı, doğrusal
olmayan mı?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

Doğrusal olmayan. Bir ebeveynin birden
çok çocuğu olabilir, yani belirli bir kişiden
birden çok "sonraki" çıkabilir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

3. Algoritma Analizi: Saniyeyi Değil, Adımı Saymak

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Başlangıç sorusu

Bir diziyi arayan bir fonksiyon yazdınız.
Çalışıyor. Hızlı mı? Kronometre size
bugün, laptopınız hakkında bir şey söyler.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kısa bir tarihçe

  • 1894 — Bachmann büyük-O gösterimini tanıtır
  • 1900'lerin başı — Landau yaygınlaştırır ("Landau sembolü")
  • 1960'lar — bilgisayar bilimi algoritma maliyeti için benimser
  • 1976 — Knuth'un makalesi CS için O/Ω/Θ'yı standartlaştırır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sezgi: adımları say

Algoritmanın temel iş birimini — bir
karşılaştırma, bir dizi erişimi — girdi
büyüklüğü n'nin bir fonksiyonu olarak sayın.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Doğrusal arama: her kutuyu dene

Baştan başlar, hedefi bulana ya da kutular
bitene kadar elemanları tek tek dener.
Veride belirli bir sıra gerektirmez.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Doğrusal arama, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — hedef dizide yok

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — linear_search (döngü)

for (int i = 0; i < n; i++) {
    (*comparisons)++;
    if (arr[i] == target)
        return i;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Doğrusal aramanın sonucu

  • En kötü durum (son eleman ya da yok): n karşılaştırma
  • En iyi durum (ilk eleman): 1 karşılaştırma
  • Maliyet doğrudan n ile büyür — bu O(n)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

İkili arama (binary search): her seferinde yarısını ele

Dizi sıralıysa: ortaya bak. Küçükse
sol yarıyı, büyükse sağ yarıyı at.
Kalan yarıda tekrarla.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

İkili arama, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — bulunamadı: lo, hi'yi geçiyor

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — binary_search (temel adım)

int mid = lo + (hi - lo) / 2;
(*comparisons)++;
if (arr[mid] == target)
    return mid;
if (arr[mid] < target)
    lo = mid + 1;
else
    hi = mid - 1;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

İkili aramanın sonucu

  • Aynı 42, 9 değil, yalnızca 3 karşılaştırmada bulundu
  • Her karşılaştırma, kalanın yarısını çöpe atar
  • 1'e inene kadar yarılama sayısı: log₂ n — O(log n)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Büyüme yarışı: hız değil, şekil kazanır

n ikiye katlanırken üç fonksiyonu
yarıştıralım: düz n, n·log₂n (en iyi
sıralamalar), n² (basit sıralamalar, iç içe döngüler).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Büyüme yarışı, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — 2^n neredeyse anında taşıyor

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Gerçekçi büyüklüklerde büyüme

n n·log₂n n²
100 664 10.000
10.000 132.877 100.000.000
100.000 1.660.964 10.000.000.000
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — büyüme tablosu

for (int i = 0; i < count; i++) {
    long n = ns[i];
    double nlogn = (double) n * log2((double) n);
    double nsq = (double) n * (double) n;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Big-O, tam olarak

f(n), belirli bir noktadan sonra f,
g'nin sabit bir katından hiç hızlı
büyümüyorsa O(g(n))'dir. Sabitleri at,
en büyük terimi tut.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

En büyük terimi okumak

Sayılan adımlar En büyük terim Big-O
3n + 7 n O(n)
n² + 2n + 1 n² O(n²)
2·log₂n + 5 log n O(log n)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sıralama, hızlıdan yavaşa

O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ)

İlk üçüyle bugün tanıştınız —
O(n log n) ve O(2ⁿ) bu dönem ilerde geliyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

T(n)'yi elle kurmak: iç içe bir döngü

Bir döngünün içinde başka bir döngü: n
dış yinelemenin her biri için, iç döngü
kendi n yinelemesinin tamamını çalıştırır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

İç içe döngüyü saymak, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — farklı bir döngü şekli

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — iç içe döngü

long count = 0;
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        count++;
        (*operations)++;
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

En iyi, en kötü ve ortalama durum

  • En iyi: hedef ilk kontrol edilen — 1 karşılaştırma
  • En kötü: hedef son ya da yok — n karşılaştırma
  • Ortalama: (1 + 2 + ... + n) / n = (n + 1) / 2
  • Niteliksiz "algoritmanın Big-O'su" genelde en kötüyü anlatır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Alan karmaşıklığı: aynı fikir, bellek için

Big-O adımları sayarak zamanı ölçer;
alan karmaşıklığı, girdinin ötesindeki ek
depolamayı — belleği — ölçer.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Özyinelemeli ve döngülü toplam, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — derin özyineleme, 22 çerçeve

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — özyinelemeli ve döngülü toplam

int sum_recursive(const int arr[], int n) {
    if (n == 0)
        return 0;
    return arr[n - 1] + sum_recursive(arr, n - 1);
}

int sum_iterative(const int arr[], int n) {
    int total = 0;
    for (int i = 0; i < n; i++)
        total += arr[i];
    return total;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sık yapılan hatalar

  • Big-O'yu koddan değil adımlardan okumak
  • İkili aramanın sıralı girdi istediğini unutmak
  • O(1)'i "anlık" sanmak — yalnızca "büyümüyor" demek
  • Ortalama önemliyken yalnızca en kötüyü söylemek
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Bir algoritma tam olarak 5n + 20 temel
işlem yapıyor. Big-O'su nedir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

O(n). Sabit çarpanı (5) ve toplamsal
sabiti (20) atın; yalnızca en hızlı
büyüyen terim, n, kalır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

İkili arama neden bağlı bir listede,
dizide olduğu gibi doğrudan kullanılamaz?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

İkili arama ortaya indeksle O(1) erişim
ister. Bağlı liste düğüm düğüm gezilmeli —
zaten O(n), kazancı siliyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Niteliksiz olarak, "algoritmanın Big-O'su"
genelde hangi durumu anlatır?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

En kötü durum: garantili üst sınır —
size verilen girdi ne olursa olsun geçerli
olduğu için değerli.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

4. İşaretçiler (Pointer) ve Nesneler

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Başlangıç sorusu

Çağıranda iki değişkeni takas eden
swap(a, b) yazın. Birçok dilde bu
imkânsız — fonksiyon yalnızca kopyaları görür.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kısa bir tarihçe

  • 1966/1969 — BCPL, sonra B: adres-al, dereferans
  • 1972 — Dennis Ritchie'nin C'si işaretçiyi merkeze koyar
  • 1995 — Java, ham işaretçileri kaldırır, referansları tutar
  • Referans: paylaşılan veri, aritmetik yok, kötü adres yok
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sezgi: bellek, numaralı posta kutuları

  • Bir değişken bir posta kutusu: adres + içerik
  • &x, "x'in posta kutusu numarası ne?" diye sorar
  • Bir işaretçi, başka bir kutunun numarasını tutar
  • Dereferans (*p): o kutuya git, oku
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

İşaretçi işlemleri

İşlem Sözdizimi Karmaşıklık
Adres-al &x O(1)
Bildirim int *p; O(1)
Adres ata p = &x; O(1)
Dereferans (oku/yaz) *p / *p = v; O(1)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Bir değişken, adresi, bir işaretçi

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — bir NULL işaretçi dereferansı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — işaretçiler: adres, takma ad, NULL

int *p = NULL, *q = NULL;
p = &v[i];
*p = val;
q = p;
*q += k;
if (r != NULL)
    *r = val;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Java: referans ile değer, yan yana

int[] box = {3};
int[] alias = box;
alias[0] = 5;
int y = x;
y = 99;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

İşaretçi aritmetiği: p + k, k bayt değil

p + k asla k bayt ilerlemez —
k × sizeof(*p) bayt ilerler. int 4
bayt, yani p + 1, 1 değil 4 bayt atlar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

İşaretçi aritmetiği, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — aralık dışı offsetler

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — işaretçi aritmetiği

int a[N];
int *p = a;
if (k < 0 || k >= N) {
    /* aralık dışı: tanımsız davranış (UB) */
} else {
    void *addr = (void *) (p + k);
    int v = *(p + k);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Struct'a işaretçi ve ->

Bir struct, alanları tek bir değerde
gruplar. (*p).alan o kadar yaygın ki C
ona bir kısayol verir: p->alan.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Struct işaretçisi, bir diziyi gezmek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — yalnızca tek öğrenci

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — struct dizisini gezmek

Student *p = students;
for (; p != students + N; p++) {
    int id = (*p).id;
    int grade = p->grade;
    p->grade = new_grade;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sık yapılan hatalar

  • int *p;'yi hiçbir yeri göstermeden kullanmak (vahşi işaretçi)
  • int *p, x; — yalnızca p işaretçi, x değil
  • Bildirimde ve ifadede *'ı karıştırmak
  • Java'nın istisnası, C'nin tanımsız davranışıyla aynı değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

int *p = &x; verildiğinde, p ile *p
arasındaki fark nedir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

p, işaretçide saklanan adrestir
(x'in adresi). *p, o adresteki
değerdir (x'in değeri).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Java'nın neden hiç -> operatörüne
ihtiyacı yok?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

Java'da her nesne/dizi değişkeni zaten
bir referans
— . her zaman "önce izle,
sonra alana eriş" demek.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

5. Bellek Düzeni: Yığın, Öbek ve Kim Temizliyor

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Başlangıç sorusu

Bir fonksiyon yerel bir dizi bildirir ve
döner. Ona ne olur? Şimdi karşılaştırın:
bir fonksiyon malloc yapıp serbest bırakmadan döner.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kısa bir tarihçe

  • Yığın (stack) — çağrı başına bir çerçeve, Algol 60'a dayanır
  • malloc/free — en eski Unix C kütüphaneleri, 1970'lerin başı
  • Çöp toplama (garbage collection) — McCarthy, Lisp, 1959
  • Java (1995), çöp toplamayı günlük programlamada yaygınlaştırdı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sezgi: düzenli bir yığın ile bir depo

  • Yığın: her çağrı bir çerçeve iter; dönüş onu çeker
  • Her zaman LIFO, her zaman otomatik, her zaman hızlı
  • Öbek: bir blok istersiniz; geri verilene kadar durur
  • C'de bu "geri vermeyi" sizin dışınızda kimse yapmaz
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yığın ile öbek, yan yana

Yığın (Stack) Öbek (Heap)
Kim ayırır Derleyici, otomatik olarak Siz: malloc (C) / new (Java)
Kim serbest bırakır Otomatik, dönüşte C: free(). Java: çöp toplayıcı
Hız Son derece hızlı Daha yavaş: boş blok bulur
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Bir yığın çerçevesi bir öbek bloğuna nasıl bağlanır

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — sarkan bir işaretçi, işaretlendi

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — alloc_block / free_block

static int *alloc_block(int size) {
    int *p = malloc(size * sizeof(int));
    return p;
}

static void free_block(int *p) {
    free(p);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Java: new ve çöp toplama

C'de free'yi unutmak — ya da serbest
bıraktıktan sonra işaretçiyi kullanmak —
tamamen sizin sorumluluğunuzda. Java free'yi diliden kaldırır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Java referansları, takma adlar, çöp toplama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — bir döngü, yine de toplanır

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — Java referansları: takma ad ve döngü

Node p = new Node();
Node q = p;
p.ref = q;
q.ref = p;
p = null;
q = null;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sık yapılan hatalar

  • Sarkan işaretçi: free'den sonra işaretçiyi kullanmak, NULL yapmadan
  • Çift serbest bırakma: aynı işaretçiyi iki kez free etmek
  • Erken dönüşte free'yi unutmak (bir sızıntı)
  • Java'nın çöp toplayıcısının sızıntıyı imkânsız kıldığını sanmak (kılmaz)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Önizleme: dizi düzeni ile bağlı liste düzeni

Bir dizi tek bir bitişik blok ayırır:
arr[i] tek bir hesap, O(1). Bağlı liste
düğümleri dağıtır, işaretçilerle bağlar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Dizi ile bağlı liste düzeni, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — son eleman: en çok sıçrama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — bağlı liste kurmak

Node *head = NULL;
for (int i = N - 1; i >= 0; i--) {
    Node *node = malloc(sizeof(Node));
    node->data = arr[i];
    node->next = head;
    head = node;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Bir fonksiyon yerel olarak int arr[100];
bildiriyor ve ona bir işaretçi döndürüyor. Sorun ne?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

arr, o çerçevede yığında yaşar.
Fonksiyon döner dönmez çerçeve çekilir —
işaretçi çoktan sarkan hale gelmiştir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

free(block); block = NULL; — bu sırayla
— neden önemli?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

free, gerçek adrese ihtiyaç duyar. Önce
NULL yapmak free(NULL)'ı etkisiz bırakır
— blok sızar, adresi sonsuza dek kaybolur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

Sarkan bir işaretçi Java'da neden C'deki
gibi asla oluşamaz?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

Java'da free yok: bir nesne yalnızca
çöp toplayıcı hiçbir şeyin ulaşamadığını
kanıtlayınca geri alınır — erişilebilirken asla.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

6. ASN.1, BER TLV ve PER TLV

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Başlangıç sorusu

İki program, farklı diller, farklı
makineler, bir kaydı bayt olarak değişir.
Ham bir struct düzeni hiç taşınabilir değil.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kısa bir tarihçe

  • 1984 — ASN.1, ITU-T/CCITT X.409 olarak doğar
  • 1995 — X.680 serisi: modern, güncel biçim
  • BER (X.690) — kendini tanımlayan etiket + uzunluk + değer
  • PER (X.691, 1994) — iki taraf şemayı bilince bit bit paketler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sezgi: bir zarf, üç parça

  • Etiket (Tag): bu ne tür bir değer?
  • Uzunluk (Length): kaç bayt tutuyor?
  • Değer (Value): içeriğin kendisi
  • Evrensel olarak TLV denir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

TLV bayt düzeni

Parça Boyut Neyi kodlar
Etiket 1 bayt sınıf · ilkel/kurulu · etiket numarası
Uzunluk 1+ bayt kısa biçim (0–127) ya da uzun biçim (≥128)
Değer Uzunluk bayt içerik ya da iç içe TLV'ler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

TLV kodlama, alan alan

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — uzun biçim gerektiren bir uzunluk

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — encode_length: kısa ve uzun biçim

if (len < 128) {
    out[0] = (unsigned char) len;
    return 1;
}
int n = 0;
while (len > 0) {
    tmp[n++] = (unsigned char) (len & 0xFF);
    len >>= 8;
}
out[0] = (unsigned char) (0x80 | n);
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

BER ile PER

BER PER
Kendini tanımlar Evet: her alanda etiket + uzunluk Hayır: şema bilinmeli
Boyut Daha büyük: alan başına 2+ bayt Çok daha küçük: bayt değil bit
Tipik kullanım X.509, LDAP, SNMP Bant genişliği kritik (hücresel)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

PER: tam olarak gerektiği kadar bit

İki taraf bir alanın [min, max]
aralığını biliyorsa, ne etiket ne uzunluk
gerekir — yalnızca ceil(log2(max - min + 1)) bit.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

PER kodlama, bit bit

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — büyüklüğü 1 olan bir aralık: sıfır bit

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — pack_bits: bir seferde bir bit

int bit = (int) ((value >> i) & 1u);
int byte_index = *bitpos / 8;
int bit_index = 7 - (*bitpos % 8);
/* if (bit) buf[byte_index] |= bit (en anlamlıdan) */
(*bitpos)++;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sık yapılan hatalar

  • Uzunluk önekini unutup sabit bir okumanın işe yarayacağını ummak
  • Uzunluğun her zaman tek bayta sığacağını sanmak (yalnız 128'in altı)
  • Uzunluğu (yalnız V) tüm TLV'nin boyutuyla karıştırmak
  • BER ve PER baytlarını birbirinin yerine geçer sanmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

TLV'deki üç harf neyin kısaltması, ve
hangi sırayla gelirler?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

Tag, Length, Value — tam olarak bu
sırayla: ne tür, kaç bayt, sonra baytların
kendisi.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

SEQUENCE'in etiket baytı neden 0x10
değil (16 sayısının ikilik hâli), 0x30?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

En üst 3 bit etiket numarası değil: 2
sınıf biti (00) + 1 kurulu bit (1,
SEQUENCE başka TLV'ler tuttuğu için) = 0x30.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

7. Uygulamalı Atölye: C Araç Zinciri

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Bu neden önemli

Bundan sonra her hafta size kendi
kuracağınız C ve Java programları veriyor.
Vize projesi, kısmen temiz bir derlemeyle değerlendiriliyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Araç zinciri, kısaca

  • GCC — Richard Stallman, GNU projesi, 1987
  • GDB — aynı GNU projesi, 1986: adım adım gez, incele
  • CMake — elinizdeki her araç için derleme dosyaları üretir
  • Aynı CMakeLists.txt, Windows, WSL ve Linux'ta derlenir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — ilk derlemeniz

#include <stdio.h>

int main(void) {
    printf("Hello, Data Structures!\n");
    return 0;
}

gcc -std=c11 -Wall -Wextra -o /tmp/x hello_workshop.c && /tmp/x

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uyarıları açık derleyip okumak

-Wall -Wextra, kullanılmayan
değişkenleri, şüpheli karşılaştırmaları,
biçim uyuşmazlıklarını yakalar. Her program temiz derlenmeli.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Küçük bir hata avı

int average_buggy(const int arr[], int n) {
    if (n == 0) return 0;
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum = sum + arr[i];
    return sum / n;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

gdb ile bulmak

Yöntem: bir kesme noktası koy, çalıştır,
bir değişkeni incele, bir hipotezi doğrula
ya da çürüt. Canlı, adım adım izleyin.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Hata ayıklayıcıda adım adım, canlı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Uç durum — boş dizi koruması

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

gdb oturumu

(gdb) break debug_average.c:11
(gdb) run
(gdb) print sum
(gdb) print sum / n
(gdb) print (double) sum / n
(gdb) continue
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kod — CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(week1_cmake_demo C)
add_executable(week1_cmake_demo main.c)

cmake -S . -B build && cmake --build build

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Visual Studio üzerine bir not

Build → Build Solution derler; Debug →
Start Debugging (F5) hata ayıklayıcı altında
çalıştırır; kenar boşluğuna tıklamak kesme noktası koyar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Sık yapılan hatalar

  • -std=c11'i unutmak: makineye göre farklı davranış
  • Git'e bir build/ klasörü ya da .exe dosyaları eklemek
  • Başarısız bir derlemeden sonra eski bir çalıştırılabiliri koşturmak
  • Yalnızca printf'e sarılmak, iki dakikalık bir gdb oturumuna hiç değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

-Wall -Wextra ne yapar, ve bu ders neden
onun altında temiz bir derleme istiyor?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

Geniş bir uyarı kümesini açar. Genelde
gerçek hataları gösterir — temiz bir
derleme istemek onları hemen düzeltir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Mini soru

cmake -S . -B build ile cmake --build build her biri ne yapar, arada ne fark var?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Yanıt

İlki yapılandırır: derleme dosyaları
üretir, hiçbir şey derlemez. İkincisi
derler: o aracı çağırıp derler ve bağlar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Özet — dönemin temelleri

Fikir Ana gerçek
Veri yapısı Bilinen, çözümlenebilir maliyet — her zaman bir ödünleşim
Doğrusal / doğrusal olmayan Bir "sonraki" ya da belki birden çok
Big-O Büyümenin üst sınırı; en büyük terimi oku
Alan karmaşıklığı Aynı fikir, ek bellek için uygulandı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Özet — bellek ve kodlama

Fikir Ana gerçek
İşaretçi / referans Bir adres tutar; &, *, ->
Yığın / öbek Otomatik, LIFO / istenip açıkça bırakılan
TLV / BER / PER Kendini tanımlayan baytlar, ya da şemayla paketlenen bitler
C araç zinciri gcc, gdb, CMake — derle, çalıştır, hata ayıkla
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Büyük resim

Bugün kurulan iki araç — maliyeti ölçmek
için Big-O, ve bir bellek resmi —
dönemin geri kalanındaki her yapıyı değerlendiriyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Öz-değerlendirme turu

Beş kısa soru. Yanıt gelmeden önce
düşünün. Tam alıştırmalar ve on soruluk
bir quiz hafta notlarında.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

1. İki farklı, doğru algoritma neden çok farklı Big-O'ya sahip olabilir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Big-O adım sayısını ölçer, yanıtın doğru olup olmadığını değil

Doğrusal arama ve ikili arama, bir değeri
sırasıyla O(n) ve O(log n)'de, ikisi de doğru bulur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

2. Şunları hızlıdan yavaşa sıralayın: O(n log n), O(1), O(n), O(log n), O(n²)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

O(1) < O(log n) < O(n) < O(n log n) < O(n²)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

3. İkili arama neden sıralı bir dizi gerektirir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Ortayla karşılaştırmak, yalnızca bir taraf küçük diğeri büyük garantiliyse işe yarar

Bu garanti tam olarak "sıralı" demek.
Doğrusal arama hiçbir sıraya güvenmez.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

4. Bir BER TLV kodlamasında Uzunluk alanı gerçekte neyi sayar?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Hemen ardından gelen Değer'deki baytları — tüm TLV'nin boyutunu değil

SEQUENCE örneğinde Uzunluk = 8'di, ama
kodlanmış SEQUENCE'in tamamı 10 bayttı.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

5. p->x neden var, ve neyin kısaltması?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

p->x, (*p).x'in kısaltması: önce dereferans, sonra alana eriş

Bu tam kombinasyon C kodunda o kadar
yaygın ki var olma nedeni bu.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Önümüzdeki hafta

Hafta 2 — Bağlı Listeler

Bugün tanıştığınız işaretçilerle bağlanan,
bugünün öbeğinde yaşayan, tek tek ayrılmış
düğümlerden bir zincir kurun.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kaynaklar (1/2)

  • Ders izlencesi, Hafta 1: CEN207-2026-2027-Guz-Izlence.tr.md
  • Knuth. The Art of Computer Programming, Cilt 1, 3. baskı
  • Liskov, Zilles. "Programming with Abstract Data Types," 1974
  • Knuth. "Big Omicron and Big Omega and Big Theta," 1976
  • Cormen, Leiserson, Rivest, Stein. Introduction to Algorithms, 3. baskı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 1

Kaynaklar (2/2)

  • Sedgewick, Wayne. Algorithms, 4. baskı
  • Kernighan, Ritchie. The C Programming Language, 2. baskı
  • Liang. Introduction to Java Programming, 10. baskı
  • ITU-T X.680 / X.690 / X.691 — ASN.1, BER, PER
  • GNU (GCC, GDB) ve Kitware (CMake) belgeleri
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz

Konuşma notu: Hafta bire hoş geldiniz — bugün, sonraki her haftanın üzerine kurulduğu iki temeli atıyoruz: maliyeti ölçmek ve belleğin gerçekten nasıl çalıştığı.

Konuşma notu: On dört kısa animasyon bugünün dersinin çoğunu taşıyor; her biri bir kez gösteriliyor, en zorlu durumuna ikinci bir bakışla.

Konuşma notu: Her terim ilk geçtiğinde tam olarak tanımlanır; bu tablo yalnızca onu tekrar nerede bulacağınızı söylüyor.

Konuşma notu: Canlı çalıştırmak isterseniz şimdi bir terminal açın; bugünün her kod parçası tam olarak gösterildiği gibi derlenir ve çalışır.

Konuşma notu: Derste yalnızca ana hatlara değiniyoruz — izlenceyi, proje kılavuzunu ve ön koşullar sayfasını önümüzdeki haftaya kadar okuyun.

Konuşma notu: Takımınızı erken seçin — bu kural, bir takımın işi kilitlenmeden önce ivme kazansın diye var.

Konuşma notu: Veri yapıları, tam olarak iki şeyle ilgili bir ders: veriyi bellekte nasıl düzenlediğiniz ve bu düzenlemenin size ne kadara mal olduğu.

Konuşma notu: Bölüm 1, hiç koda dokunmadan önce, tüm dersin en temel sorusunu soruyor.

Konuşma notu: İsimlerin bellekte diziliş biçimi FARKIN ta kendisi — işte bu diziliş biçimine veri yapısı diyoruz.

Konuşma notu: Ne-nasıl ayrımı, bu dersin sürekli dayandığı bir ayrım — bugünden itibaren gayri resmi olarak başlıyor.

Konuşma notu: Bir tepsi yığını üstten eklemek/almak için hızlıdır, ortadan bir şey bulmak için berbattır — fikrin tamamı bu.

Konuşma notu: "Bilinen, çözümlenebilir maliyet" kısmı, "veriyi düzenlemek" gibi bulanık bir fikri bu dersin ölçebileceği bir şeye çeviriyor.

Konuşma notu: Aynı yapıda genelde bu dört işlemin hepsini birden hızlı yapamazsınız — bugünkü gerçek konu tam olarak bu ödünleşim.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Bu tek cümle, dönemin geri kalanının her hafta bir yeni yapı tanıtmasının nedeni.

Konuşma notu: Bu dönem göreceğiniz her yapı, tam olarak bu iki aileden birine giriyor — bu harita hatırlanmaya değer.

Konuşma notu: Bu fark, hangi işlemlerin ucuz hangilerinin pahalı olduğunu değiştiriyor — bugünkü ikinci bölümün tam konusu bu.

Konuşma notu: Bir ağaç düğümünün birden çok çocuğu olabilir; bir çizge düğümü birden çok başkasına bağlanabilir — artık tek bir "sonraki" yok.

Konuşma notu: Dördü de doğrusal — her eleman hâlâ tam olarak tek bir sonrakine sahip.

Konuşma notu: Hash tabloları ve dosyalar, yuvalarının diziliş biçiminde hâlâ doğrusal — yalnızca anahtarla erişim yeni; Hafta 7 bunu açıkça gösteriyor.

Konuşma notu: Bir ağaç ve bir çizge son derece yapılandırılmıştır — yalnızca birden çok "sonraki"ye izin verirler.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Her iki yönde de tek, belirsizliksiz bir sonraki — bu tam olarak doğrusal tanımı.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Bu, iki slayt önceki org şemasıyla aynı dallanma fikri.

Konuşma notu: Bu bugünün en büyük bölümü — sonraki her haftanın bir yapıyı değerlendirmek için kullandığı araç, Big-O.

Konuşma notu: İstediğimiz şey algoritmanın kendisinin bir özelliği: işi, girdi büyüdükçe nasıl büyüyor.

Konuşma notu: Gösterim, bilgisayarlardan on yıllarca önce var — başlangıçta bir fonksiyonun başka birine ne kadar yakın olduğunu tanımlıyordu.

Konuşma notu: Bu sayı yalnızca algoritmaya ve n'ye bağlıdır — makineye, dile ya da bugünkü CPU yüküne asla.

Konuşma notu: 11 elemanlı bir dizide, ortadaki bir değeri ararken karşılaştırmaları sayışını izleyeceğiz.

Konuşma notu: Normal örnek: 11 değer, hedef ortada. Karşılaştırma sayacının kutu kutu tırmanışını izleyin.

Konuşma notu: Hedef yokken doğrusal arama, bunu söyleyebilmek için yine de her kutuyu kontrol eder — gerçek en kötü durum bu.

Konuşma notu: Her yinelemede bir karşılaştırma, açıkça sayılıyor — bu, animasyonun ekranda az önce saydığı şeyin ta kendisi.

Konuşma notu: Milyon elemanlı bir dizi, en kötü durumda milyon karşılaştırma gerektirir — bu doğrudan büyüme O(n) demek.

Konuşma notu: Doğrusal aramanın az önce 9 karşılaştırma harcadığı aynı hedefi, 42'yi, arayacağız.

Konuşma notu: Normal örnek: 16 sıralı değer, hedef bulundu. lo, hi ve mid'in cevaba nasıl yaklaştığını izleyin.

Konuşma notu: Bu kez 31 değer var; aralık, kontrol edilecek hiçbir şey kalmayana, lo hi'dan büyük olana kadar yarılanır.

Konuşma notu: Tek bir karşılaştırma, kalanın YARISINI eler — bütün numara bu.

Konuşma notu: Ödünleşim: ikili arama önce sıralı bir dizi ister, sıralamanın kendisi bir aramadan daha pahalıdır.

Konuşma notu: Çok daha büyük bir ölçekte iki nokta — bu animasyon ölçeğin tamamını bir kerede gösteriyor.

Konuşma notu: Normal örnek: n, 1'den 512'ye ikiye katlanarak. n-kare ve 2^n'in diğerlerinden nasıl koptuğunu izleyin.

Konuşma notu: n = 400'den başlarken 2^n, diğerleriyle aynı grafiğe çizilemeyecek kadar büyük çoktan.

Konuşma notu: n = 100.000'de n-kare, n log n'den 6.000 kattan fazla büyük — küçük girdide anlık, büyük ölçekte çok farklı.

Konuşma notu: Bu, az önce gördüğünüz tabloyu beş gerçekçi büyüklük için üreten döngünün ta kendisi.

Konuşma notu: Sabitleri resmi olarak nadiren hesaplarsınız — adımları sayar, en hızlı büyüyen terimi okursunuz.

Konuşma notu: Örüntü şu: en hızlı büyüyen terimi tutun, daha küçük olan her şeyi ve her sabiti atın.

Konuşma notu: O(1), işaretçi aritmetiğinden gelen sabit zamanlı dizi erişimi; O(log n) ikili arama; O(n) doğrusal arama.

Konuşma notu: Tabloya güvenmek yerine, gerçek, sayılmış bir programı sayalım ve n-kareyi kendimiz görelim.

Konuşma notu: Normal örnek: kare bir döngü (j < n), n = 3 ayrıntılı, sonra dokuz n değeri daha.

Konuşma notu: Üçgen bir döngü (j < i) iç gövdeyi yine n(n-1)/2 kez çalıştırır — yine O(n kare), farklı bir sabit.

Konuşma notu: Ölçülen sayı, denenen her n için n*n ile tam eşleşti — T(n) = n kare, artı atılan daha küçük terimler.

Konuşma notu: En kötü durum, girdiyi kontrol edemediğinizde en çok işe yarayan garanti.

Konuşma notu: Özyinelemeli bir fonksiyon her çağrıda bir yığın çerçevesi iter — bu, bir döngünün asla ihtiyaç duymadığı ek bellek.

Konuşma notu: Normal örnek: 10 değer. Çağrı yığınının çağrı başına bir çerçeve büyümesini, sonra çözülmesini izleyin.

Konuşma notu: 22 eleman, zirvede 23 çerçeve demek — yeterince büyük n için yığın gerçekten tükenebilir.

Konuşma notu: İkisi de aynı toplamı döndürür. sum_recursive O(n) yığın belleği kullanır; sum_iterative her zaman tam olarak O(1).

Konuşma notu: Bir satırın içindeki gizli bir döngü (arr.contains(x) gibi) sessizce O(n)'i O(n kare)'ye çevirebilir.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Bu, "en büyük terimi oku" tablosunun doğrudan uygulanması.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Hafta 2 tam olarak bu yapıyı kuruyor, bu yüzden bu soru önümüzdeki haftayı doğrudan önizliyor.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: En iyi durumlar algoritmalar arasında birbirine benzer, bu yüzden karşılaştırmak için en kötü durum daha yararlı.

Konuşma notu: Bir işaretçi, bir değişkenin konumudur, yalnızca değeri değil — bugün bu fikri tamamen somutlaştırıyoruz.

Konuşma notu: Çağıranın değişkenlerine geri ulaşmak için fonksiyonun her birinin KONUMUNA ihtiyacı var, değerine değil — o konum bir işaretçi.

Konuşma notu: İki Java değişkeni yine aynı nesneyi adlandırabilir — yalnızca keyfi bir adres hesaplayamazsınız.

Konuşma notu: int x = 3, 3'ü bir posta kutusuna, diyelim 1000 numaraya, koyar — &x size o 1000'i verir.

Konuşma notu: Bunların her biri O(1) — bir işaretçiyi izlemek her zaman tek bir sıçrama, asla bir arama değil.

Konuşma notu: Normal örnek: beş işlem — adres-al, üzerinden yaz, kopyala (takma ad), taşı, takma ad üzerinden ekle.

Konuşma notu: NULL bir işaretçi üzerinden yazma burada asla çalıştırılmaz — bunun yerine tanımsız davranış olarak işaretlenir.

Konuşma notu: q = p, DEĞERİ değil ADRESİ kopyalar — q ve p artık aynı değişkenin takma adı.

Konuşma notu: alias, box ile AYNI dizinin ikinci adı; y ise x'in bağımsız bir KOPYASI — aynı sözdizimi, tam tersi davranış.

Konuşma notu: Bu, dizi indekslemesinin, arr[i]'nin, derlendiği O(1) aritmetik.

Konuşma notu: Normal örnek: bir int dizisi, beş geçerli offset. Her hesaplanan adresi ve dereferans edilen değerini izleyin.

Konuşma notu: Negatif bir offset ve sondan bir sonrası, ikisi de tanımsız davranış olarak işaretlenir, hiç dereferans edilmez.

Konuşma notu: Java'da işaretçi aritmetiği hiç yok — yalnızca a[k], aralık dışı bir k net bir istisna fırlatır.

Konuşma notu: Struct'a bir işaretçi, ORİJİNAL struct'a ulaşmanızı — ve onu değiştirmenizi — sağlar, bir kopyasına değil.

Konuşma notu: Normal örnek: 10 öğrenci, 2 not güncellemesi. (*p).id, p->grade ve p++'ın sizeof(Student) kadar ilerlemesini izleyin.

Konuşma notu: p, "dizinin hemen sonrasına" anında ulaşır — TUTMAK yasaldır, ama asla dereferans etmek değil.

Konuşma notu: (*p).id ve p->id aynı değer — ok işareti yalnızca bir kısayol, başka hiçbir şey değil.

Konuşma notu: Java her dereferansı kontrol eder ve gürültülü şekilde başarısız olur; C, kötü bir adresle donanım ne yaparsa onu yapar.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Aynı değişken, dereferans edip etmediğinize göre tamamen farklı iki soru.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: C hem . (değerler için) hem -> (işaretçiler için) ister; Java'nın yalnızca birine ihtiyacı var.

Konuşma notu: Bu, tüm dönem kullanacağınız bellekle ilgili en önemli tek gerçek.

Konuşma notu: İki sorunun tamamen farklı yanıtları var — bu fark bugünün tüm konusu.

Konuşma notu: Çöp toplama çoğu kişinin sandığından çok daha eski — Java'dan 36 yıl önce var.

Konuşma notu: Bir yığın çerçevesini itmek ya da çekmek yalnızca bir işaretçiyi taşımak — bu kadar hızlı olmasının nedeni bu.

Konuşma notu: Yığın taşması, derin özyinelemenin küçük, sabit bir bölgeyi aşması; öbek çok daha büyük ama daha yavaş.

Konuşma notu: Normal örnek: 10 blok, düzgün sahiplenilmiş, bir kısmı serbest. main'in blocks[] sütununun her öbek satırına işaret edişini izleyin.

Konuşma notu: İkinci bir takma ad hâlâ serbest bırakılmış bir bloğun eski adresini tutuyor; onu kullanmak UB olarak işaretlenir, hiç çalıştırılmaz.

Konuşma notu: p, alloc_block'un kendi çerçevesine özel — o çerçeve çekildiğinde yalnızca DÖNDÜRÜLEN adres ayakta kalır.

Konuşma notu: Bir nesne, çöp toplayıcı hiçbir şeyin ona ulaşamadığını kanıtlayana kadar öbekte yaşar.

Konuşma notu: Normal örnek: bir referans zinciri, sıradan toplama. Nesnelerin erişilemez hale gelip süpürülmesini izleyin.

Konuşma notu: İki nesne birbirini gösteriyor, ama hiçbir kök hiçbirine ulaşamayınca ikisi de toplanır — referans sayımı değil, erişilebilirlik.

Konuşma notu: C'de tam bu örüntü sonsuza dek sızardı — C'de döngünün erişilemez olduğunu fark edecek bir çöp toplayıcı yok.

Konuşma notu: Gereksiz tuttuğunuz bir referans toplanamaz ve etkide yine "sızar".

Konuşma notu: Önümüzdeki hafta tam olarak bu bağlı yapıyı kuracaksınız — bugün yalnızca önizleme.

Konuşma notu: Normal örnek: 10 değer, k = 4. Tek hesaplanan adresi, next üzerinden dört sıçramayla karşılaştırın.

Konuşma notu: Dizi son elemana yine tek adımda ulaşır; bağlı liste baştan itibaren her tek sıçramaya ihtiyaç duyar.

Konuşma notu: Aynı n değer, tam ters erişim maliyeti: dizi O(1), bağlı liste O(n) — aynı veri, tamamen farklı düzen.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Çözüm: bunun yerine malloc ile ayırın, böylece bellek fonksiyon dönse de hayatta kalır.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Sıra bir stil tercihi değil — tersine çevirmek sessizce bir bellek sızıntısı yaratır.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Erişilebilir bir referansın çoktan geri alınmış belleği gösterdiği bir an asla yok.

Konuşma notu: İki tamamen farklı program, bayt bayt, yapılandırılmış bir kayıt üzerinde nasıl anlaşır?

Konuşma notu: Derleyici, platform ve dolgu kuralları bir struct'ın tam bayt düzenini etkiler — iki tarafın da anlaştığı bir şey gerekiyor.

Konuşma notu: BER'li ASN.1, HTTPS'in temeli olan X.509 sertifikalarının, LDAP'ın ve SNMP'nin altında görünmez biçimde hâlâ duruyor.

Konuşma notu: Kaydınızı hiç görmemiş bir çözücü bile onu doğru gezebilir: etiketi oku, uzunluğu oku, o kadar baytı atla, tekrarla.

Konuşma notu: INTEGER etiket 0x02, UTF8String etiket 0x0C, SEQUENCE etiket 0x30 — gerçek ASN.1 evrensel sınıf numaraları.

Konuşma notu: Normal örnek: 10 alan — tamsayılar, kısa metinler, mantıksal değerler — her biri Etiket, Uzunluk, Değer oluyor.

Konuşma notu: 300 karakterlik bir metnin uzunluğu artık tek bayta sığmıyor — uzun biçim yalnızca "kaç tane" demek için fazladan bayt harcıyor.

Konuşma notu: Kısa biçim tek bayt; uzun biçimde en üst bit "sıradaki n bayt UZUNLUĞUN kendisi" demek.

Konuşma notu: İkisi de aynı soyut bilgiyi kodlar — BER boyutu kendini tanımlamaya, PER de tersini feda eder.

Konuşma notu: BER ile aynı türden kayıt, bu kez bayt bayt değil bit bit paketleniyor.

Konuşma notu: Normal örnek: 10 alan — isim harfleri, bir yaş, birkaç kısıtlı sayı — birkaç bayta paketlendi.

Konuşma notu: min, max'a eşitken olası tek bir değer var — alıcı bunu zaten biliyor, bu yüzden HİÇBİR ŞEY gönderilmiyor.

Konuşma notu: PER çıktısı yalnızca en sonda bayta hizalanır, alan alan değil — bitler birbirine sıkı sıkıya yaslanır.

Konuşma notu: Bir PER çözücü BER baytlarını okuyamaz, ya da tersi — aynı şema için iki farklı bayt biçimi.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Bir çözücü asla bir boyutu tahmin etmek zorunda kalmaz — uzunluk öneki her zaman tam olarak söyler.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: İkilikte 00 1 10000, tam olarak 0x30 — kurulu bit, 0x10'u 0x30'a çeviren şey.

Konuşma notu: Bugünkü her fikir, derlenip çalışana kadar değersiz — bu bölüm tüm dönem için akışı bir kez kuruyor.

Konuşma notu: Bu atölye, tüm dönem tekrarlayacağınız akışı bir kez kuruyor: derle, çalıştır, hata ayıkla.

Konuşma notu: Bir derleyici kaynağı makine koduna çevirir; bir bağlayıcı bunu C standart kütüphanesiyle birleştirir.

Konuşma notu: gcc, hello_workshop.c'yi x'e derler; && yalnızca derleme başarılıysa çalıştırır.

Konuşma notu: Bir uyarı, derleyicinin muhtemelen bir hata olduğunu, çalışma zamanında zor yoldan öğrenmeden önce söylemesidir.

Konuşma notu: Yazdırdığı ortalama yanlış — sum ve n doğru görünüyor, ama son satırdaki bir şey değil.

Konuşma notu: Bu yöntem, şimdi bulacağımızdan çok daha ince hatalara ölçeklenir.

Konuşma notu: Normal örnek: 10 eleman. İzleme panelinde i, sum ve n'yi adımlarken, sonra sum / n'yi yazdırırken izleyin.

Konuşma notu: n == 0, programı tam koruma satırında durdurur — sıfıra bölmek tanımsız davranış olurdu.

Konuşma notu: sum/n 7 verir (tam sayı bölmesi); (double) sum/n gerçek yanıtı, 7.666...'yı verir — hata yalnızca son bölmedeydi.

Konuşma notu: İlk komut YAPILANDIRIR: CMakeLists.txt'yi okur, derleyiciyi kontrol eder. İkincisi DERLER: derler ve bağlar.

Konuşma notu: Visual Studio bir CMakeLists.txt'yi doğrudan açabilir — bir önceki slayttaki aynı dosya değişmeden çalışır.

Konuşma notu: Çalıştırmayı her zaman && ile zincirleyin, böylece başarısız bir derleme sizi yanlışlıkla dünkü ikiliği çalıştırmaz.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Sonradan, çalışma zamanında, zor yoldan keşfedilmeden.

Konuşma notu: Sınıfın cevaplamasını bekleyin, sonra ilerleyin.

Konuşma notu: Yapılandırma genelde bir kez, derleme kaynağı her değiştirdiğinizde.

Konuşma notu: Sonraki her hafta bir yapı daha ekliyor, tam olarak bu aynı araçlarla değerlendirilerek.

Konuşma notu: İşaretçiler, yığın ve öbek, sonraki her haftanın sizde zaten var saydığı bellek resmi.

Konuşma notu: Bir öğrenci bugünden yalnızca tek bir cümle hatırlayacaksa, hatırlanmaya değer olan bu.

Konuşma notu: Bunlar, yazılı notların sonundaki öz-değerlendirme quizini yansıtıyor, burada slayt başına bir soru, daha kısa bir küme.

Konuşma notu: Sorun, bekleyin, sonra ilerleyin.

Konuşma notu: Doğruluk ve maliyet tamamen ayrı iki soru.

Konuşma notu: Sorun, bekleyin, sonra ilerleyin.

Konuşma notu: Bu tam sıra, dönemin geri kalanında her hafta tekrar geliyor.

Konuşma notu: Sorun, bekleyin, sonra ilerleyin.

Konuşma notu: Sıralı düzen olmadan, bir yarıyı atmak bir garanti değil, bir tahmin olurdu.

Konuşma notu: Sorun, bekleyin, sonra ilerleyin.

Konuşma notu: Uzunluk, Etiket baytını ya da kendi Uzunluk bayt(lar)ını asla saymaz.

Konuşma notu: Sorun, bekleyin, sonra ilerleyin.

Konuşma notu: Önce-dereferans-sonra-eriş o kadar sık bir örüntü ki C ona kendi operatörünü verdi.

Konuşma notu: Bugünün önizlemesindeki O(1)-her-yere-ekleme, O(n)-erişim ödünleşimi, artık tam olarak: ekleme, silme, gezinme, ölçülmüş.

Konuşma notu: Bunlar, haftanın yazılı notlarının sonunda listelenen aynı kaynaklar.

Konuşma notu: Tarihsel kaynaklar — Bachmann, Landau, Knuth, Liskov — bugünün "kısa tarihçe" slaytlarının dayandığı kaynaklar.