Ders İçeriği • Bağlantılı Liste – Tanım ve Operasyonları • İki Yönlü Bağlantılı Liste – Tanım 1 Liste • Liste nedir? – A1, A2, …, AN şeklinde sıralı eleman dizisi class Liste { … void void void int int bool bool int int int int } add(int e); add(int poz, int e); remove(int poz); indexOf(int e); lastIndexOf(int e); clear(); IsEmpty(); first(); last(); get(int poz); size(); 2 Liste Kullanımı public static void main(String[] args){ Liste liste = new Liste(); liste.add(10); liste.add(5); liste.add(1, 7); liste.add(2, 9); // // // // 10 10, 5 10, 7, 5 10, 7, 9, 5 liste.indexOf(7); liste.get(3); liste.remove(1); liste.size(); liste.isEmpty(); // // // // // Returns 1 Return 5 10, 9, 5 Returns 3 Returns false liste.remove(0); liste.clear(); // 9, 5 // boş liste }/* bitt-main */ 3 Liste: Gerçekleştirim • 2 tür gerçekleştirim var: – Dizi tabanlı - ArrayList – Bağlantılı liste - LinkedList • Dersin sonunda bu iki farklı gerçekleştirimin çalışma zamanlarını karşılaştıracagız. 4 Liste: Dizi Tabanlı Gerçekleştirim • Temel fikir: – – – – – Büyük bir dizi için yer açın (MAX) N değişkeni ile ilk boş yeri tutun N = 0 ise liste boş Silme veya ekleme işleminde elemanları kaydırın. Dizi doluysa ne yapılabilir? • • • • Daha büyük bir dizi için yer ayırın Eski dizideki elemanları yeni diziye kopyalayın Eski diziyi hafızadan silin Bu işlemler birçok hafıza değişimine/işlemine neden olmaktadır 0 1 2 3 ……… N-1 A_1 A_2 A_3 A_4 ……… A_N-1 MAX_SIZE Bağlantılı Liste • Aynı kümeye ait veri parçalarının birbirine, bellek üzerinde, sanal olarak bağlanmasıyla oluşturulur. – Tüm veri, bir tren katarı gibi birbirine bağlı parçalardan oluşur. • Bağlantılı listede birisi veri, diğeri bağlantı bilgisi olmak üzere temelde iki kısım bulunur. – Veri kısmında o uygulama için gerekli olan bilgi bulunur. – Bağlantı kısmında bağlantının nereye yapılacağını gösteren bir veya birkaç adres bilgisi bulunabilir. 6 Liste: Bağlantılı Liste • Temel fikir: – Her eleman için bir düğüm oluşturun – Düğünler hafızada sıralı değildirler. Hafızada farklı yerlerde tutulurlar. – Her eleman kendini takip eden bir sonraki elemanın hafızadaki yerini tutar – İlk elemanın yerini tutmanız gerekir. Liste basi A_1 0 bag 1 A_2 bag 2 Liste sonu A_3 bag düğüm 4 elemanlı bir liste (düğüm) 3 A_4 bag Liste: Bitişik ve Bağlı Gerçekleştirim 0 1 2 Hafıza Adres Hafıza 0 1 2 Baş = T Adres L0 L0 + c L0 + 2c L0 + 3c L0 + 4c A_1 A_2 A_3 A_4 A_5 Bitişik T A_1 Y W A_5 NULL X A_3 Z Y A_2 X Z A_4 W c bytes Bitişik olmayan(Bağlı) Bağlantılı Liste: Genel Bakış düğüm veri bağ Liste düğümüne genel bakış public class Dugum { public Dugum bag; public int veri; } son = W bas = T 0 A_1 1 Y A_2 3 2 X A_3 Z A_4 4 W A_5 NULL T, W, X, Y ve Z hafızada farklı yerlerdir 9 Bağlı Liste – Java class BagliListe { private Dugum bas; private Dugum son; private int eleSayisi; 0 1 2 3 A_1 A_2 A_3 A_4 NULL public BagliListe(){ bas=son=null; eleSayisi=0; } public void add(int poz, int e); public void remove(int poz); public int indexOf(int e); public bool isEmpty(); public int first(); public int last(); public int get(int poz); public int size(); ... } 10 Liste Operasyonları: add • add(Pozisyon P, Eleman Türü E) – Örnek: add(2, X): 2 nolu pozisyona X elemanını ekle – Algoritma: (1) X’in nereye ekleneceğini bul (p’den sonra) (2) X elemanını içeren yeni bir düğüm oluştur (3) Düğümde bag kısmını güncelle 0 Liste Başı A_1 1 bag 2 A_2 bag A_3 p Çalışma Zamanı? O(N) – yeri bulmak için O(1) – eklemek için Yeni düğüm X düğüm bag NULL Liste Operasyonları: remove • remove(Pozisyon P) – Örnek: remove(2): 2 nolu yerdeki elemanı sil – Öncelikle sileceğimiz elemanın yerini bulmamız lazım. 1 0 Liste Başı A_1 bag 2 A_2 bag q A_3 bag 3 A_4 NULL p – p ile gösterilen düğümü silebilir miyim? – Bir önceki düğümü de tutman gerekir • Sileceğim düğümü bulurken bir önceki düğümü de izlemem gerekir(q değişkeni p değişkenini liste boyunca izler) – Şimdi düğümün bag kısmını güncellemem gerekiyor • q.bag = p.bag Liste Operasyonları: remove • remove(Pozisyon P) – Örnek: remove(2): 2 nolu yerdeki elemanı sil Liste Başı 1 0 A_1 bag A_2 bag q A_1 A_3 bag 3 A_4 bag 2 A_2 bag q NULL p 1 0 Liste Başı 2 A_3 bag p Çalışma zamanı? elemanı bulmak – O(N), silmek – O(1) A_4 NULL Liste Operasyonları: indexOf • indexOf(Eleman Türü E) – Örnek: indexOf(X): listede X’i arama Liste başı 1 0 A_1 bag A_2 bag • Doğrusal Arama yapılmalı – Çalışma zamanı: O(N) 2 A_3 bag 3 A_4 NULL Liste Operasyonları: isEmpty • isEmpty() – Liste boşsa true döndür 1 0 Liste Başı A_1 bag A_2 bag 2 A_3 bag • bas == NULL ise true döndür – Çalışma zamanı: O(1) 3 A_4 NULL Liste Operasyonları: first, last, get • first() • last() • get(Pozisyon K) 1 0 Liste Başı A_1 bag A_2 bag Liste sonu 2 A_3 bag 3 A_4 • first – Çalışma zamanı: O(1) • last – Çalışma zamanı: O(1) – listenin sonunu tutarsak • get – Çalışma zamanı: O(N) NULL Liste: Çalışma Zamanı Karşılaştırması Operasyon Dizi Tabanlı Liste Bağlantılı Liste add O(N) O(N) or O(1) remove O(N) O(N) indexOf O(N) O(N) isEmpty O(1) O(1) first O(1) O(1) last O(1) O(1) get O(1) O(N) size O(1) O(1) 17 Silme İşlemi • Sileceğimiz düğüm elimizde zaten varsa ne yapabiliriz? – remove(Dugum p); 1 0 Liste başı A_1 bag 2 A_2 bag A_3 bag 3 A_4 NULL p • Hala bir önceki düğümü tutmamız lazım – Bir önceki pozisyonu bulmak için çalışma zamanı O(N) – Bu işlemi daha hızlı yapabilir miyiz? – Eğer bir önceki elemanın yerini tutarsak. EVET! • İki yönlü bağlantılı liste (Double Linked List) İki Yönlü Bağlantılı Liste Liste Sonu Liste Başı A_1 once sonra NULL A_2 once public class Dugum { public Dugum once; public Dugum sonra; public int veri; } Dugum bas; Dugum son; sonra A_3 once sonra NULL İki Yönlü Bağlantılı Liste Liste Sonu Liste Başı A_1 once sonra NULL A_2 once sonra A_3 once • Avantajları: • remove(Dugum p) O(1) • previous(Dugum p) O(1) • Liste üzerinde ileri ve geri gitmeyi sağlar • Dezavantajları: • Hafıza kullanımı (her düğümde fazladan bir yer tutulması) • Güncelleme işlemlerinde daha fazla işlem ve karmaşıklık sonra NULL