Ders İçeriği Bağlantılı Liste İki Yönlü Bağlantılı Liste Tanım ve Operasyonları İki Yönlü Bağlantılı Liste Tanım
Liste Liste nedir? A1, A2, …, AN şeklinde sıralı eleman dizisi class Liste { … void add(int e); void add(int poz, int e); void remove(int poz); int indexOf(int e); int lastIndexOf(int e); bool clear(); bool IsEmpty(); int first(); int last(); int get(int poz); int size(); }
Liste Kullanımı public static void main(String[] args){ Liste liste = new Liste(); liste.add(10); // 10 liste.add(5); // 10, 5 liste.add(1, 7); // 10, 7, 5 liste.add(2, 9); // 10, 7, 9, 5 liste.indexOf(7); // Returns 1 liste.get(3); // Return 5 liste.remove(1); // 10, 9, 5 liste.size(); // Returns 3 liste.isEmpty(); // Returns false liste.remove(0); // 9, 5 liste.clear(); // boş liste }/* bitt-main */
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.
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 1 2 ……… N-1 MAX_SIZE A_1 A_2 A_3 A_N-1 3 A_4
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.
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 Liste sonu 1 2 3 bag bag bag bag A_1 A_2 A_3 A_4 düğüm 4 elemanlı bir liste (düğüm)
Liste: Bitişik ve Bağlı Gerçekleştirim Hafıza A_1 A_2 A_5 A_3 A_4 1 2 Adres L0 L0 + c L0 + 2c L0 + 3c L0 + 4c c bytes Adres Hafıza 1 2 Baş = T T A_1 Y W A_5 NULL X A_3 Z Y A_2 X Z A_4 W Bitişik Bitişik olmayan(Bağlı)
Bağlantılı Liste: Genel Bakış düğüm public class Dugum { public Dugum bag; public int veri; } veri bağ Liste düğümüne genel bakış bas = T son = W 1 2 3 4 A_1 Y A_2 X A_3 Z A_4 W A_5 NULL T, W, X, Y ve Z hafızada farklı yerlerdir
Bağlı Liste – Java class BagliListe { private Dugum bas; 1 2 3 class BagliListe { private Dugum bas; private Dugum son; private int eleSayisi; 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(); ...
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 1 2 Liste Başı bag bag A_1 A_2 A_3 NULL p Çalışma Zamanı? O(N) – yeri bulmak için O(1) – eklemek için X düğüm bag Yeni düğüm
Liste Operasyonları: remove remove(Pozisyon P) Örnek: remove(2): 2 nolu yerdeki elemanı sil Öncelikle sileceğimiz elemanın yerini bulmamız lazım. 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 1 2 3 Liste Başı bag bag bag A_1 A_2 A_3 A_4 NULL q p
Liste Operasyonları: remove remove(Pozisyon P) Örnek: remove(2): 2 nolu yerdeki elemanı sil 1 2 3 Liste Başı bag bag bag A_1 A_2 A_3 A_4 NULL q p Liste Başı bag A_1 A_2 A_4 p NULL A_3 q 1 2 Çalışma zamanı? elemanı bulmak – O(N), silmek – O(1)
Liste Operasyonları: indexOf indexOf(Eleman Türü E) Örnek: indexOf(X): listede X’i arama Doğrusal Arama yapılmalı Çalışma zamanı: O(N) 1 2 3 Liste başı bag bag bag A_1 A_2 A_3 A_4 NULL
Liste Operasyonları: isEmpty Liste boşsa true döndür bas == NULL ise true döndür Çalışma zamanı: O(1) 1 2 3 Liste Başı bag bag bag A_1 A_2 A_3 A_4 NULL
Liste Operasyonları: first, last, get get(Pozisyon K) first – Çalışma zamanı: O(1) last – Çalışma zamanı: O(1) – listenin sonunu tutarsak get – Çalışma zamanı: O(N) Liste sonu 1 2 3 Liste Başı bag bag bag A_1 A_2 A_3 A_4 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 indexOf isEmpty O(1) first last get size
Silme İşlemi Sileceğimiz düğüm elimizde zaten varsa ne yapabiliriz? remove(Dugum 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) 1 2 3 Liste başı bag bag bag A_1 A_2 A_3 A_4 NULL p
İki Yönlü Bağlantılı Liste Sonu once sonra once sonra once sonra A_1 A_2 A_3 NULL NULL public class Dugum { public Dugum once; public Dugum sonra; public int veri; } Dugum bas; Dugum son;
İki Yönlü Bağlantılı Liste Sonu Liste Başı once sonra once sonra once sonra A_1 A_2 A_3 NULL NULL 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