VERİ YAPILARI DERS NOTLARI BÖLÜM 1 GİRİŞ Yard. Doç. Dr. Deniz KILINÇ CELAL BAYAR ÜNİVERSİTESİ, YAZILIM MÜHENDİSLİĞİ 2015-2016
1. DERS İÇERİĞİ VE KAYNAKLAR Veri Yapıları (VY) dersinde görülmesi muhtemel konu başlıkları bölüm 1.1 de verilmiştir. Her VY teorik-örnekli açıklamasının yanında, ilgili VY nin C# programlama dilinde tasarlanması, güncel uygulamalarda kullanımı şeklinde ders anlatımı ve uygulamalar gerçekleştirilecektir. 1.1 Veri Yapıları Dersi Muhtemel Konu Başlıkları Veri Yapılarına Giriş Linked-Lists: List ADT, Array la Linked-List oluşturma, Doubly Linked-List, Stack ADT: Array uyarlaması, Linked-List uyarlaması Queue ADT: Array uyarlaması, Priority Queue, Deque (double ended queue) Tree: Binary Tree, Array, Linked-List uyarlamaları, recursive ve non-recursive fonksiyonlarla binary-tree nin (Preorder, Inorder ve Postorder) taranması (traverse), Binary Search Tree de, Insert, Delete ve Search işlemleri Search-Tree: Binary Search Tree, AVL-Tree ve B-Tree de Insert, Delete, Search Heap ve Priority Que ları: Heap ler de Insert, Delete, Heap Priority Queue sınıfı 1 Search ve Sort: Linear, Binary arama, Bubble, Selection, Insertion, quick, Merge, Heap, Radix ve Binary Tree sort algoritmaları Graph: Graph gösterimi (Adjacency Matrix), Graph Traverse (Deep-First, Breadth First, Kruskal, Prim ve Dijkstra) algoritmaları 1.2 Ders Kaynakları Ders kitabı olarak [1] kullanılacak olup (Chapter 8 den itibaren), LAB uygulamaları yine aynı kitabın LAB kitapçığından türetilecektir. Kaynak kitap olarak aşağıdaki dokümanlardan faydalanılacaktır: - Data Structures through JAVA, V.V.Muniswamy 1 - DSA Lecture Notes 2 - DSA Book 3 2. VERİ YAPILARI VE ALGORİTMALAR Veri yapıları ve Algoritmalar, Bilgisayar Bilimleri alanındaki en köklü ve klasik konulardan birisidir. Tüm bilgisayar programları algoritmalardan ve VY lerden oluşur. Bilgisayar bilimlerindeki klasik problem çözme süreci aşağıda belirtilmiştir.
Bilgisayar bilimlerinde işlenecek veri miktarı büyüdükçe bu verilerin saklanması, sıralanması, veriler içinde arama yapılması gibi temel işlemlerin verimli şekilde (hafıza, performans) gerçekleştirilebilmesi için VY ler geliştirilmiştir. Kısaca; Veri Yapısı, verinin verimli şekilde kullanılabilmesi için belirli bir formatta saklanıp organize edilmesini sağlayan matematiksel modeldir. VY leri implemente etmek için iki yöntem bulunmaktadır: a) Statik veri tipleri kullanmak (diziler). Statik veri türleri, kendilerine ayrılan bölümün tamamını kullanmasalar dahi sabit bir bellek alanı kullanırlar. b) Dinamik veri tipleri kullanmak (işaretçi, referans türleri). Program çalışma zamanında boyutları büyüyüp küçülebilir. Stack, Queue, Tree ve Graph lar VY lere bir örnektir. Verinin organize edilmesine bağlı olarak VY ler iki grupta sınıflandırılırlar: a) Linear VY: Elemanların (verinin) sırayla erişildiği Array, Linked List, Stack ve Queue gibi yapılardır. Daha basit VY lerdir. b) Non-Linear VY: Verinin lineer olmayan bir şekilde saklandığı-erişildiği Tree ve Graph gibi yapılardır. Şekil. Veri Yapıları Örnek: Liste Veri Yapısı
Örnek: Ağaç Veri Yapısı Bir algoritma için benzer VY modelleri arasından seçim yapılırken, VY nin hafıza kullanımı ve verimliliği (kabaca hızı) kullanılacak iki parametredir. VY lerin, güçlü ve zayıf yönleri üzerinden ele alan tablo aşağıda verilmiştir. Tablo. VY larının özet performans karşılaştırması
3. VERİ YAPILARI VE ADT KAVRAMI ADT (Abstract Data Type), VY bağlamında bir problemin bilgisayar çözümü için kullanılan matematiksel bir modeldir. Örneğin, bir grup sayıyı sıralamak için ADT, bir dizi ve dizi üzerinde çalışan sıralama algoritması olarak düşünülebilir. Bir başka ifadeyle, bir ADT verinin organizasyonu ve onların üzerinde yapılacak işlemlerin matematiksel modellenmesidir. Örneğin, bir tamsayı dizisi ve bu dizi üzerinde read, sort, search ve print işlemleri basit bir ADT modelidir. 1 Yaygın kullanılan ADT ler den biri olan Stack ADT si, verinin saklanma biçimi ve bu veri üzerinde tanımlanan işlemler şeklinde modellenir. Şekil. Stack veri saklanma biçimi Temel Stack İşlemleri: push (): Stack a bir eleman ekle pop (): En son eklenen elemanı Stack tan ayır Ek Stack İşlemleri: top(): Son eklenen elemanın değerini getirir size(): Stack taki eleman sayısını getirir Mantıksal isempty(): Stack ta elaman olup olmadığı kontrol edilir Stack Hata İşlemleri: Stack ta eleman olmadığında pop() ve top() işlemleri gerçekleştirilemez Aynı şekilde uyarlamaya bağlı olarak Stack a ayrılan alan doluysa push() gerçekleştirilemez. Buna uygun hata yakalama işlemleri de düşünülmelidir. Tablo. Stack işlemleri ADT, kullanıcı açısından arka plandaki karmaşıklığı kullanıcıdan soyutlama (abstraction) anlamında, OOP mantığına uygun bir yaklaşımdır. Örneğin bu soyutlama biçimi, Stack ADT sinde verinin saklama biçimi (Array, Linked List veya Tree) ve Stack işlemlerinin detayı kullanıcı tarafından bilinmeden kullanılmasını sağlar. ADT ler Interface veya Abstract Classlar ile tanımlanırlar. Interface de metot adları, parametre türleri ve döndürecekleri değer türleri gibi soyut tanımlamalar yapılırken metotlar 1 Data Structures through JAVA, V.V.Muniswamy (pg 86-87)
ilgili Interface i uyarlayan sınıflarda tanımlanır. Örnek bir Stack ADT Interface aşağıdaki tabloda verilmiştir. interface StackADT {. Boolean isempty();. void Push(Object element);. Object Pop();. Object Peek();. void Display(); }