200 likes | 469 Views
Ders İçeriği. Bağlantılı Liste Tanım ve Operasyonları İki Yönlü Bağlantılı Liste Tanım . List e. Liste nedir ? A1, A2, …, AN şeklinde sıralı eleman dizisi. class List e { …. void add ( int e); void add ( int po z , int e); void remove ( int po z );
E N D
Ders İçeriği • 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(intpoz, int e); void remove(intpoz); intindexOf(int e); intlastIndexOf(int e); boolclear(); boolIsEmpty(); intfirst(); intlast(); intget(intpoz); intsize(); }
Liste Kullanımı publicstaticvoid 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 3 ……… 0 1 2 N-1 MAX_SIZE A_4 ……… A_1 A_2 A_3 A_N-1
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 0 3 1 2 bag bag bag bag A_1 A_2 A_3 A_4 düğüm 4 elemanlı bir liste (düğüm)
Hafıza 0 1 2 A_1 A_2 X W Z Y NULL A_3 A_5 A_4 Adres L0 A_1 c bytes L0 + c A_2 L0 + 2c A_3 L0 + 3c A_4 L0 + 4c A_5 Liste: BitişikveBağlı Gerçekleştirim Adres Hafıza 0 1 2 Baş = T T W X Y Z Bitişik olmayan(Bağlı) Bitişik
Bağlantılı Liste: Genel Bakış düğüm public class Dugum { publicDugumbag; publicintveri; } veri bağ Liste düğümüne genel bakış son = W bas = T 3 4 0 1 2 Z A_1 Y X W A_4 A_5 NULL A_2 A_3 T, W, X, Y ve Z hafızada farklı yerlerdir
Bağlı Liste – Java 3 0 1 2 classBagliListe{ privateDugumbas; privateDugumson; privateinteleSayisi; A_1 A_2 A_3 A_4 NULL publicBagliListe(){ bas=son=null; eleSayisi=0; } publicvoid add(intpoz, int e); publicvoid remove(intpoz); publicintindexOf(int e); publicboolisEmpty(); publicintfirst(); publicintlast(); publicintget(intpoz); publicintsize(); ... }
ListeOperasyonları: 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 1 2 Liste Başı bag bag A_1 A_2 A_3 NULL p Yeni düğüm Çalışma Zamanı? O(N) – yeri bulmak için O(1) – eklemek için bag X düğüm
ListeOperasyonları: 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 0 2 3 Liste Başı bag bag bag A_1 A_2 A_4 NULL A_3 p q
Liste Operasyonları: remove • remove(Pozisyon P) • Örnek: remove(2):2 nolu yerdeki elemanı sil 1 0 2 3 Liste Başı bag bag bag A_1 A_2 A_4 NULL A_3 1 0 2 p p q q Liste Başı bag bag bag A_1 A_2 A_4 NULL A_3 Çalışma zamanı? elemanı bulmak – O(N), silmek – O(1)
ListeOperasyonları: indexOf • indexOf(Eleman Türü E) • Örnek: indexOf(X): listede X’i arama • Doğrusal Arama yapılmalı • Çalışma zamanı: O(N) 1 0 2 3 Liste başı bag bag bag A_1 A_2 A_4 NULL A_3
Liste Operasyonları: isEmpty • isEmpty() • Liste boşsa true döndür • bas == NULL ise true döndür • Çalışma zamanı: O(1) 1 0 2 3 Liste Başı bag bag bag A_1 A_2 A_4 NULL A_3
Liste Operasyonları: first, last, get • first() • last() • 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 0 2 3 Liste Başı bag bag bag A_1 A_2 A_4 NULL A_3
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 0 2 3 Liste başı bag bag bag A_1 A_2 A_4 NULL A_3 p
İki Yönlü Bağlantılı Liste Liste Sonu Liste Başı once sonra once sonra once sonra A_3 A_1 A_2 NULL NULL public class Dugum { publicDugumonce; publicDugumsonra; publicintveri; } Dugumbas; Dugumson;
İki Yönlü Bağlantılı Liste Liste Sonu Liste Başı once sonra once sonra once sonra A_3 A_1 A_2 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