Veri Yapıları ve Programlama
Bu kitap, Python ile temel programlama becerilerini edinmiş öğrenciler için hazırlanmıştır. Burada Python sözdizimini baştan öğrenmek yerine veriyi nasıl düzenlediğimizin, bir işlem için hangi yapıyı seçtiğimizin ve aynı problemi çözen iki yaklaşımın neden farklı maliyetlere sahip olabildiğinin üzerinde duracağız.
Amaç veri yapılarını yalnızca adları ve tanımlarıyla ezberlemek değildir. Bir problemle karşılaştığınızda şu soruları sorabilmeniz önemlidir:
- Veriyi hangi biçimde tutmalıyım?
- Sıra önemli mi?
- Tekrar eden değerleri korumalı mıyım?
- Bir anahtar üzerinden hızlı erişime ihtiyacım var mı?
- Elemanlar hangi sırayla eklenip çıkarılmalı?
- Arama ya da sıralama için hangi yaklaşım daha uygun?
- Çözüm veri büyüdükçe nasıl davranır?
Kitabı nasıl kullanmalısınız?
Bölümlerde yeni kavramlar mümkün olduğunca şu akışla işlenir:
Tahmin Et → Çalıştır → Gözle → Karşılaştır → Değiştir → Gerekçelendir
Web sürümündeki Python hücreleri tarayıcı içinde çalışır. Kodları Run Code ile çalıştırabilir, uygun hücrelerde kodu değiştirebilir, bazı alıştırmalarda ipucu ve çözüm açabilir ve otomatik geri bildirim alabilirsiniz.
İki farklı çözüm aynı doğru sonucu verebilir. Asıl soru çoğu zaman hangi çözümün hangi koşulda daha uygun olduğudur. Kodu çalıştırdıktan sonra seçtiğiniz veri yapısının ve algoritmanın neden uygun olduğunu açıklamaya çalışın.
Başlamadan önce
Koşullar, döngüler, fonksiyonlar, string’ler, listeler, sözlükler, kümeler, temel dosya işlemleri ve hata ayıklama konularını başlangıç düzeyinde biliyor olmanız beklenir. Gerekli yerlerde kısa hatırlatmalar yapılır; ancak bu konular yeniden baştan anlatılmaz.
Kullanıcı tanımlı sınıfları bilmeniz gerekmez. Yığın ve kuyruk gibi soyut veri türlerini öğrenirken önce Python’ın yerleşik koleksiyonlarından ve standart kütüphanesinden yararlanacağız.
Haftalar
Aşağıdaki sıra dönem boyunca izleyeceğimiz öğrenme yolunu gösterir. Bir bölümü tamamladıktan sonra bölüm başlığının üstündeki gezinme çubuğuyla önceki haftaya, sonraki haftaya veya bu sayfaya dönebilirsiniz.
Hafta 1
Veri yapısı, soyut veri türü ve maliyet sezgisi
Veri yapısı ile ADT ayrımı; işlem maliyetlerini karşılaştırmak için temel büyüme sezgisi.
Hafta 2
Listeler, demetler, mutability ve aliasing
Liste ve demetlerin davranışı; değiştirilebilirlik, referans paylaşımı ve kopyalama etkileri.
Hafta 3
Sözlükler, kümeler, hash sezgisi ve yapı seçimi
Anahtar tabanlı erişim, benzersizlik, hash sezgisi ve probleme uygun koleksiyon seçimi.
Hafta 4
Kayıtlar ve iç içe veri yapıları
Birden fazla alanı ve koleksiyonu birlikte kullanarak daha düzenli veri modelleri kurma.
Hafta 5
Yığın veri modeli
LIFO davranışı, push/pop işlemleri ve yığın mantığının tipik kullanım alanları.
Hafta 6
Kuyruk ve deque
FIFO davranışı, çift uçlu kuyruk ve sıraya dayalı işlem problemleri.
Hafta 7
Doğrusal arama ve arama kalıpları
Elemanları sırayla inceleme, arama koşulları ve erken sonlandırma kalıpları.
Hafta 8
İkili arama
Sıralı veri üzerinde arama aralığını yarıya indirerek daha verimli arama yapma.
Hafta 9
Temel sıralama tasarımı
Basit sıralama fikirlerini adım adım kurma, izleme ve maliyetlerini karşılaştırma.
Hafta 10
Python ile pratik sıralama
sorted, list.sort, key ve gerçek problemlerde sıralama ölçütü tasarlama.
Hafta 11
İşlem maliyetini ölçme ve yorumlama
Teorik maliyet sezgisini küçük ölçümlerle ilişkilendirme ve sonuçları doğru yorumlama.
Hafta 12
Veri işleme uygulaması
Koleksiyon, arama, sıralama ve özetleme işlemlerini tek bir veri işleme akışında birleştirme.
Hafta 13
Uygun veri yapısı ve algoritma seçimi
Aynı probleme alternatif çözümler üretme ve seçimleri gereksinimlere göre gerekçelendirme.
Hafta 14
Bütünleştirme ve genel tekrar
Dönem boyunca kullanılan veri yapıları, algoritmalar ve maliyet sezgisini birlikte uygulama.
İlk bölümde veri yapısı ile algoritma arasındaki farkı ve O(1), O(n), O(n²) gibi ifadelerin çözüm seçeneklerini karşılaştırırken nasıl kullanılabileceğini inceleyeceğiz.