6 - Bağlantılı Listeler

advertisement
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
Download