VeriYapilariveAlgoritmalar11!12!13 14

May 25, 2018 | Author: rezo111 | Category: N/A
Share Embed Donate


Short Description

Veri Algoritma...

Description

Sakarya Üniversitesi

VERİ YAPILARI ve ALGORİTMALAR Hafta 11 Doç. Dr. Nejat YUMUŞAK

Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan bu ders içeriğinin bütün bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü tümü ya da bölümleri mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz. Her hakkı saklıdır © 2008 Sakarya Üniversitesi

 AĞLI LİSTE L İSTE VERİ YAPIS APISII (LİNKED (Lİ NKED LİST)

11. B

Daha önce incelenen veri yapıları dizi üzerinde tasarlanmıştı. Dizilerde bir elemana ulaşmanın maliyeti 1 olmasına rağmen sıralama, yığıt, kuyruk ve dairesel kuyruk uygulamalarında uygulamalarında dizi kullanımının bazı sakıncaları vardır. Dizi veri yapında başlangıçta dizi eleman kapasitesi ile birlikte tanımlanmaktadır. tanımlanmaktadır. Bu kapasite programcı değiştirmediği sürece değişmez. Bilgisayar belleğinde yer olmasına rağmen başlangıçta belirlediğimiz bu sayıdan dolayı, kapasiteden fazla bir el eman bu diziye girilemez.

Aynı sebepten dolayı kapasiteden kapasited en daha az eleman girilmesi durumunda da

bellekte boş yere bellek işgal edilmiş olacak ve bu alan dizi için ayrıldığından dolayı diğer birimler tarafından tarafından kullanılmayacaktır. kullanılmayacaktır. Hatta hiç eleman girilm girilmemesi durumunda bile o yer ayrılmıştır. Yani dizi veri yapısı statik bir veri yapısıdır ve bu yapı verimli bellek kullanımını engellemektedir. engellemekt edir.

Ayrıca programın sonlandırılması halinde dizi de bulunan tüm bilgiler

silinecektir. Oysa bu bilgilerin bir dosy aya yazılması gerekir. Bu ise veritabanı uygulamaları için uygun bir yöntem değildir.  Aşağıda 10 elemanlı elemanlı bir A dizisi bulunmaktadır. bulunmaktadır. Herhangi Herhangi bir sırlama sırlama algoritmasıyla algoritmasıyla sıralı hale getirilen bu diziye en fazla 10 adet sayının girilebileceği açıktır.

A[0]

A[1]

A[2]

A[3]

A[4]

A[5]

A[6]

A[7]

27

51

54

60

67

80

125

150

A[8]

A[9]

Diziler bellekte ardı ardına gelen aynı türdeki verileri sakladığından, dizinin elemanları arasında boşluk yoktur. Diziye bir eleman eklenmek istendiğinde bu bilgi dizinin ilk boş yerine yazılır ve dizi herhangi bir sıralama algoritması yardımıyla yardımıyla tekrar sıralanır. Bu verinin hangi iki eleman arasına geleceği test işlemleriyle bulunur. Bunun için dizinin ilk elemanından başlayarak karşılaştırma işlemleri yapılır ve yer bulunduktan sonra sağda kalan tüm bilgiler bir ileriye doğru kaydırılır. Böylece dizideki bütün elemanların yeri değişir. Diziden bir eleman çıkarıldığında da diğer elemanların fiziksel olarak yerleri değişecektir. Bu programcılık noktasından bakıldığında ciddi bir sorundur. Çünkü özellikle ekleme ve çıkarma işlemlerinin sık yapıldığı uygulamalarda bu işlem yükü hem zaman kaybına hem de gereksiz işlemlere sebep olacaktır. Günlük hayatta kolay bir biçimde gerçeklenen kitlesel hareketler bilgisayar belleğinde çok fazla çalışma zamanı maliyetlerine neden olabilmektedir ve böylesi yapılar etkin bellek kullanımı ile hız işlemlerinden dolayı tercih edilmemelidir.

 AĞLI LİSTE L İSTE VERİ YAPIS APISII (LİNKED (Lİ NKED LİST)

11. B

Daha önce incelenen veri yapıları dizi üzerinde tasarlanmıştı. Dizilerde bir elemana ulaşmanın maliyeti 1 olmasına rağmen sıralama, yığıt, kuyruk ve dairesel kuyruk uygulamalarında uygulamalarında dizi kullanımının bazı sakıncaları vardır. Dizi veri yapında başlangıçta dizi eleman kapasitesi ile birlikte tanımlanmaktadır. tanımlanmaktadır. Bu kapasite programcı değiştirmediği sürece değişmez. Bilgisayar belleğinde yer olmasına rağmen başlangıçta belirlediğimiz bu sayıdan dolayı, kapasiteden fazla bir el eman bu diziye girilemez.

Aynı sebepten dolayı kapasiteden kapasited en daha az eleman girilmesi durumunda da

bellekte boş yere bellek işgal edilmiş olacak ve bu alan dizi için ayrıldığından dolayı diğer birimler tarafından tarafından kullanılmayacaktır. kullanılmayacaktır. Hatta hiç eleman girilm girilmemesi durumunda bile o yer ayrılmıştır. Yani dizi veri yapısı statik bir veri yapısıdır ve bu yapı verimli bellek kullanımını engellemektedir. engellemekt edir.

Ayrıca programın sonlandırılması halinde dizi de bulunan tüm bilgiler

silinecektir. Oysa bu bilgilerin bir dosy aya yazılması gerekir. Bu ise veritabanı uygulamaları için uygun bir yöntem değildir.  Aşağıda 10 elemanlı elemanlı bir A dizisi bulunmaktadır. bulunmaktadır. Herhangi Herhangi bir sırlama sırlama algoritmasıyla algoritmasıyla sıralı hale getirilen bu diziye en fazla 10 adet sayının girilebileceği açıktır.

A[0]

A[1]

A[2]

A[3]

A[4]

A[5]

A[6]

A[7]

27

51

54

60

67

80

125

150

A[8]

A[9]

Diziler bellekte ardı ardına gelen aynı türdeki verileri sakladığından, dizinin elemanları arasında boşluk yoktur. Diziye bir eleman eklenmek istendiğinde bu bilgi dizinin ilk boş yerine yazılır ve dizi herhangi bir sıralama algoritması yardımıyla yardımıyla tekrar sıralanır. Bu verinin hangi iki eleman arasına geleceği test işlemleriyle bulunur. Bunun için dizinin ilk elemanından başlayarak karşılaştırma işlemleri yapılır ve yer bulunduktan sonra sağda kalan tüm bilgiler bir ileriye doğru kaydırılır. Böylece dizideki bütün elemanların yeri değişir. Diziden bir eleman çıkarıldığında da diğer elemanların fiziksel olarak yerleri değişecektir. Bu programcılık noktasından bakıldığında ciddi bir sorundur. Çünkü özellikle ekleme ve çıkarma işlemlerinin sık yapıldığı uygulamalarda bu işlem yükü hem zaman kaybına hem de gereksiz işlemlere sebep olacaktır. Günlük hayatta kolay bir biçimde gerçeklenen kitlesel hareketler bilgisayar belleğinde çok fazla çalışma zamanı maliyetlerine neden olabilmektedir ve böylesi yapılar etkin bellek kullanımı ile hız işlemlerinden dolayı tercih edilmemelidir.

Çok basit sıralama algoritmalarının zaman karmaşıklıkları incelendiğinde bunun dizilerdeki

bu hareketlerden kaynaklandı görülür. Belleği daha etkin kullanmak ve gereksiz işlem yükünden kurtulmak için, bilgilerin her defasında sıralanmasını gerektirmeyen, dizi içerisinde ileri yada geriye doğru kaydırma işlemlerini gerektirmeyen (kitlesel veri hareketi) yaptırmayan veri yapılarına gereksinim vardır. Tren vagonlarına yeni bir vagon eklediğimizi yada vagonlarından birini kaldırdığımızı düşünelim. Bu işlem sonrasında geriye kalan vagonlarla ilgili bir işlem yapmamıza gerek yoktur. Sadece vagon eklediğimiz noktada gerekli bağlantıları değiştirmemiz yeterlidir. Bu modelde dizilerin yukarıda bahsedilen elemanların kaydırılması zorunluluğu  sorunu çözülmüştür. Verilerin birbirine bir trenin vagonları gibi bir bağlantı bilgisi yoluyla bağlandığı

veri modeli ile bilgisayar bi liminde bağlı liste veri yapısı oluşturulmuştur.

Ali bilgi

Banu sonraki

bilgi

Zeyne

Cem sonraki

bilgi

p sonraki

bilgi

sonraki

Verilere sıralı olarak erişebilmek için elemanların fiziksel sıralı olması yerine mantıksal sıralı olduğu liste yapısına Bağlı liste  (linked list) denir. Bağlı listeleri bir çizgi üzerinde

birbirine bağlanmış kayıtlar olarak düşünebiliriz. Bağlı listede her eleman, büyüklükçe kendisinden sonra gelen elemanın adresini gösterir. Buna göre yeni bir eleman eklendiğinde veya bir eleman silindiğinde, ana dizi üzerinde hiç bir değişiklik yapılmaz.

Sadece bağlı liste üzerinde bu elemanlar ile ilgili bağlar (linkler)

değiştirilir. Böylece dizilerdeki sorunlar ortadan kaldırılırken tren vagonundaki kolaylıkta veri yapılarına kazandırılır. Şekilde de bir veri düğümü görüldüğü gibi liste elemanının saklandığı saklandığı ve bir sonraki elemana bağlantıyı sağlayan göstergecin yer aldığı, iki farklı kısımdan oluşmaktadır. Bilgi kısmı istenilen

sayıda

oluşabilir .

alandan

Bilgi

Sonraki

Silinecek bir eleman ile ilgili olarak yapılması gereken, öncelikle bu elemanın bulunması ve düğümlerin bağlantı bilgilerinin güncellenmesidir. Bu ise silinecek eleman bulunduktan sonra önceki elemanın sonraki göstergeci silinecek ve bir sonraki elemanı gösteren hale

getirilecektir.

 Ali

bilgi

Banu

sonraki

bilgi

Cem

sonraki

bilgi

Dilek

sonraki

bilgi

sonraki

Görüldüğü gibi bir eleman silindikten sonra sadece bağlantı bilgileri güncellenmekte ve diğer elemanlara dokunulmamaktadır. Bağlı liste veri yapısında bağ bilgilerinde başka listenin başını ve sonunu gösteren özel değişkenlere ihtiyaç duyulacağı açıktır. Herhangi bir elemana liste başından (LB) itibaren ulaşılmaya çalışılacak ve listenin sonu LS ile kontrol edilecektir. Listede son elemanın bulunduğu hücrede özel olarak bir adres saklanarak bu kontrol gerçeklenir. Örneğin bu özel

adres -1 yada sıfır olarak belirlenir ve başka bir yerde kullanılmazsa ve sadece listenin sonunda kullanılırsa liste taranırken 0 yada -1 adresine ulaşıldığında listenin sonuna gelindiği anlaşılır. Tanımlarından anlaşılacağı gibi bağlı listede yapılabilecek temel işlemler eleman ekleme, eleman çıkarma, listeyi yazdırma ve herhangi bir elemanı arama olarak belirlenebilir. Listenin boş yada dolu olup olmadığı bu işlemler sırasında kontrol edilmelidir. Herhangi bir elemanı bağlı listenin başına, ortasına ya da sonuna eklemek mümkündür. Yukarıda açıklanan modelde her zaman LB adresinin gösterdiği elemandan başlayarak tek yönde ilerleyerek aradığımız elemana ulaşmak zorundayız. Bu bir dezavantaj olarak düşünülebilir. Bunu ortadan kaldırmak için çift yönlü bağlı liste ve çift yönlü dairesel bağlı liste uygulamaları vardır. Bağlantılı liste veri yapısında eleman sayısının önceden belirlenmesi şart değildir. Elemana ihtiyacımız olması halinde işletim sisteminden düğüm isteyebileceğimiz için bağlı listeler kuyruk, yığıt ve dizi veri yapılarının aksine dinamik veri yapılarıdır. Şimdi bağlı liste veri yapıları için çeşitli modellerde ekleme ve çıkarma işlemleri ni inceleyelim.

11.1.

Tek Yönlü, Bağlantılı ( ve sıralı) Liste

Bu liste veri yapısında her verinin sadece bir tane bağ alanı vardır. Yani her veri sadece kendisinden sonraki verinin adresini tutmaktadır. Tek yönlü ve bağlantılı denilmesinin sebebi

budur.  Aşağıda tek yönlü ve bağlantılı liste örneği şematik olarak gösterilmektedir.

LB -1

Burada LB imleci listenin ilk elemanının adresini göstermektedir. Bu eleman “Ahmet” verisidir. Bu verinin bağ alanında bir sonraki verinin adresi saklanmaktadır. “Hüsrev” ve risi ise bağ alanında -1 içerdiğinden listenin son elemanıdır. 11.1.1.

Tek Yönlü, Bağlantılı ( ve Sıralı) Listeye Eleman Ekleme

 Aşağıdaki tek yönlü bağlı ve sıralı liste yapısı imcelendiğinde her bir elemanın yada düğümün üç bileşenle tanımlandığı görülür . Bunlar verinin kendisi, verinin adresi ve verinin bağ bilgisidir. Aşağıdaki örnekte LB=10 adresi listenin ilk elemanını gösterir. A verisinin sağbağı x=5 adresini içerir ve bu da C elemanının adresidir. X=8 adresinde Z elemanı vardır ve Z elemanını sağ bağı liste sonunu göstermektedir.

LB

10 A

5 5

6 C

6

7 D

7

8 F

8

Z

O halde bu listeye yeni bir eleman ekleneceği zaman işletim sisteminden bu üçlüyü içeren bir bellek alanı istenir. Çünkü bu veri yapısı ile bilgiler bu biçimde organize edilmektedir. Tekyönlü sıralı ve bağlantılı bir listeye eleman eklemenin birinci adımı işletim sisteminden bu yeni düğümü istemek olacaktır. İşletim sistemi bu yeni veri için bir adres ve bağ alanını değişik dillerde bazı komutlarla verebilmektedir. (malloc). Şimdi E verisini yukarıdaki listeye

ekleyelim. İşletim sistemi bize;

0

X=10

yapısını gönderecektir. Yani boş bir düğüm almış olduk. Şimdi bu düğümün veri alanına eklemek istediğimiz elemanı yazalım. X=10

E

Bu işlemi normal dizi operasyonları ile yapmak mümkündür. LB’nı izleyerek bu yeni elemanı ekleyeceğimiz yeri bulalım. Yeni düğüm D’nin arkasına eklenecektir. Yani D’nin bağı artık yeni elemanın adresini (x=10) göstercektir. D’nin bağı daha önce hangi veriyi adresliyorsa yeni eklenen elemanın sağ bağı o adresi gösterecektir. X=6

D

X=7 10

X

F

8

X=10

E

7

Burada D’nin arkasına E’yi sıralama bozulmaksızın ekledik. Burada yapılan işlemi genelleştirelim. “eski” isimli verinin arkasına “yeni” isimli bir veriyi eklemek istiyoruz. Bu durumda tek yönlü, sıralı ve bağlı listedeki bağ güncelleme işlemleri aşağıdaki gibi olacaktır. Bağ(yeni)=bağ(eski) Bağ(eski)=yeni

(1)

Görüldüğü gibi dizilerde yaşadığımız sorunu burada yaşamadık. E verisi sadece ilgili yerdeki bağ güncellemeleri yapılarak listeye eklendi ve listenin diğer elemanları yer değiştirme işlemine maruz kalmadı. Eğer önceden girilmiş bir liste bulunmuyorsa liste en baştan oluşturulacaktır. Yine işletim siteminden bahsedilen üçlüyü içeren bir alan istenir ve şu başlangıç oluşturulur. Örneğin x=5 adresli alanda “S” verini saklayalım. Bunun için LB değişkenine dikkat etmeliyiz.

Ver i ( x) = “S “S” ” / / El eman gi r i l di bağ(x) =- 1

/ / l i s t e s on onu

Bundan sonra gelecek olan yeni elemanlar LB’nı izleyerek uygun yere (1) güncellemesi ile eklenecektir. Dizi uygulamalarında uygulamalarında bir veriyi dizinin dizinin birinci elemanı olarak olarak eklemek için için dizinin bütün elemanlarının yer değiştirmesi gerekirken burada bu işlem tek adımla gerçekleşmekte diğer elemanların kaydırılmasına ihtiyaç duyulmamaktadır. 11.1.2.

Tek Yönlü, Bağlantılı ( ve Sıralı) Listeden Eleman Çıkarma

 Aşağıdaki bağlı bağlı tekyönlü ve sıralı sıralı listeden D elemanını elemanını çıkaralım. çıkaralım.

LB

10 A

5 5

6 C

6

7 D

7

8 F

8

Z

Öncelikle LB göstergesi izlenerek silinecek eleman bulunur. Burada D elemanının silinmesi D’yi gösteren bir adresin olmaması demektir. O halde D verisini gösteren bağ artık D’yi göstermeyecek, göstermeyecek, D’nin bağını gösterecektir.

5

6 C

7

X

7 D

7

F

8

0

Burada yapılan işlemi de genelleştirebiliriz. Listedeki herhangi bir X elemanını silmek istiyorsak LB ile bu X’i bulduğumuzda X’ i adresleyen düğüme X’in “öncel” i dersek aşağıdaki bağ güncellemelerini yapabiliriz.

Bağ(öncel)=bağ(x) “S” // Eleman girildi bağ(x) =- 1

11.2.

/ / l i s t e s on onu

İki Yönlü Bağlı ve Doğrusal Liste Yapısı

Tek yönlü, bağlı ve sıralı listelerde herhangi bir elemandan bir önceki elemana bağ bilgisinin olmaması bir eksiklik olarak değerlendirilmektedir. Bu listelerde herhangi bir elemana ulaşmanın tek bir yöntemi vardır. O da her zaman listenin ilk düğümünden başlayıp ilgili elemanı bulmaktır. Eğer liste çok sayıda elemandan oluşuyor ise her defasında bu yolu izlemek maliyet bakımından uygun olmayacaktır. Eğer böyle listelerde herhangi bir düğüm aynı zamanda önceki elemanın da adresini içerirse tek yönlü bağlı listelerin bu eksikliği giderilecektir. Bu şekilde tasarlanan listelere iki yönlü bağlı ve doğrusal liste yapısı denir. Bu veri yapılarında listeyi oluşturan bir düğüm sol ve sağ olmak üzere iki adet bağ bilgisine ve bir adet veri alanı bilgisine bilgisine sahiptir. Aşağıdaki şekil iki yönlü yönlü bağlı listeyi oluşturan bir düğüm düğüm

modelini göstermektedi g östermektedir. r. Adres solbağ  

Veri

sağbağ

Buradan anlaşılacağı gibi bir hücreden hem önceki hem de bir sonraki veriye ulaşmak mümkündür. Cep telefonumuzdaki isim listesi, televizyonumuzun uzaktan kumandasının kanal listesine ulaşımı iki yönlü bağlı listelere örnek olarak verilebilir. Eğer televizyonumuzun televizyonumuzun uzaktan kumandasını değil de televizyonun kendi butonlarını kullanarak kanallara ulaşmayı denersek burada sadece tekyönlü bağlı liste l iste modelini kullanmış oluruz. Bu verilen örneklerde

son kanaldan ilk kanala da bir bağ bulunuyorsa bunlar dairesel iki yönlü bağlı liste örneği oluştururlar.

LB -1

1 ATV

2 2

1

BTV

3 3

2

CTV

4 4

3

MTV

-1

Burada LB=1 adresinde ATV verisi bulunmaktadır. ATV verisinin sol bağı -1 olup listenin en başlangıç durumunu göstermektedir. göstermektedir. ATV verisinin sağ bağı x=2 adresini göst g östermekte ve bu adreste BTV kanalı verisi bulunmaktadır. BTV verisinin sol bağı x=1 adresini (ATV kanalını), sağ bağı ise x=3 adresini (CTV kanalını) göstermektedir. CTV verisinin sol bağı kendisinden bir önceki veri olan BTV’yi yani x=2 adresini sağ bağı ise x=4 adresini (MTV kanalını) gösterir. MTV kanalı verisinin sol bağı CTV’yi sağ bağı ise liste sonunu işaret etmektedir. Buradan anlaşılmaktadır ki yeni bir veriyi listeye eklemek istediğimizde işletim sisteminden alacağımız düğümde 4 bilgi saklayabileceğimiz alan olacaktır. Eğer ilk verimizi ekliyorsak, yani liste henüz mevcut değilse (LS=0) , LB ve LS değerleri ekleyeceğimiz “yeni” isimli bu veriyi gösterecektir. İlk veri olduğundan bu verinin sol bağı listenin boş halini, sağ bağı ise

listenin sonunu gösterecektir.

LB=LS=0 Solbağ(yeni)=0 // yeni düğüm

11.2.1.

İki Yönlü Bağlı ve Doğrusal Listeye Eleman Ekleme

a) Var olan bir listeye ilk eleman olarak ekleme: Aşağıdaki iki yönlü bağlı listeye AATV verisini ekleyelim. LB

1

-1

BTV

2 2

1

3

CTV

3

2

4

DTV

4

3

MTV

-1

Bunun için öncelikle ATV’nin ekleneceği yer bulunur. LB’ndan itibaren bağlar izlendiğinde bu verinin liste başına eklenmesi gerektiği anlaşılmaktadır. BTV verisine “orta” diyelim ve problemi “yeni” isimli veriyi “orta” isimli değişkenin öncesine ekleme biçiminde genelleyelim. Bağ güncellemelerini şu şekilde yapacağız. LB değişkeni eklenen “yeni” verisini

gösterecektir. LB= “ATV” yada daha genel olarak LB=”yeni” olacaktır. Listenin ilk düğümü  ATV olacağına göre ATV verisinin sol bağı -1 değerini, solbağ(ATV)=-1, yada daha genel

olarak

solbağ(yeni)=-1 solbağ(yeni)= -1

olacaktır.

Sağbağ(ATV)=BTV

sağbağ(yeni)= “orta” olacaktır. olacaktır . Son güncellemeyi

yada

daha

genel

olarak

solbağ(BTV)=ATV solbağ(BT V)=ATV yada daha genel

olarak solbağ(orta)=”yeni” biçiminde yaparak ekleme işlemini tamamlamış oluruz. Yapılan bu güncellemeleri aşağıdaki şekille özetleyebiliriz.

1 5

LB

BTV

2 2

1

CTV

3 3

2

DTV

4 4

3

MTV

-1

x=5 -1

ATV

1

Sadece ilgili iki düğümde güncelleme yaptık ve yeni bir elemanı listenin ilk düğümü olarak ekledik. Listenin diğer elemanlarında hiçbir şekilde kaydırma ya da test işlemi yapmadık. Eğer listenin ortasında bir yere eleman eklemek istersek gerekli günc ellemeleri benzer mantıkla yapmalıyız. Şimdi iki yönlü bağlı ve sıralı liste yapısına EGETV verisini ekleyelim. Öncelikle bu veriyi ekleyeceğimiz yeri LB’nı izleyerek buluruz ve aşağıdaki şekildeki gibi güncellemeleri yaparız. “eklenen” isimli Yeni ekleyeceğimiz veriyi “orta” verisinin önüne ekleyecek şekilde genelleme yapalım.

1 5

LB

BTV

2 2

1

CTV

3 3

2

DTV

4 6

6

x=5 -1

ATV

MTV

6

1

3

EGE

4

Ekleyeceğimiz “yeni” isimli veriyi “orta” verisinin önüne ekleyecek şekilde yapılması gereken güncellemeleri genelleştirelim. Şekildeki mavi çizgili güncellemeler bu güncellem eyi

özetlemektedir. Solbağ(eklenen)=solbağ(orta) Sağbağ(eklenen)=orta Solbağ(orta)=eklenen Sağbağ[Solbağ(eklenen)]=eklenen

— 

11.2.2.

İki Yönlü Bağlı ve Doğrusal Listeden Eleman Silme

Şekli inceleyerek güncelleme tablosunu oluşturalım. Bu sıralı, iki yönlü bağlı listeden CTV elemanını çıkaralım. Bağlı listeden eleman çıkarmak demek bu elemanı adresleyen bir bağın olmaması anlamına gelmektedir. Güncellemelerimizi yaparken bunu dikkate almalıyız.

1 5

LB

BTV

2 3

1

CTV

3 3

1

DTV

4 6

6

x=5 -1

ATV

MTV

6

1

3

EGE

4

Yapılan bu bağ güncellemesini “silinecek” isimli elemanı bağlı listeden kaldıracak biçimde genelleştirelim. Yukarıdaki şekilde yeşil çizgili güncelleme ler bu güncellemeyi göstermektedir.

Sağbağ(solbağ(silinecek))=sağbağ(silinecek) Solbağ(sağbağ(silinecek))=solbağ(silinecek) Bu uygulamalardan anlaşılacağı gibi

bir elemanı silerken sadece o elemanı gösteren

adresleri (imleçleri) değiştirmemiz yeterli olmaktadır. Diğer elemanlara hiç dokunmayışımız ve ilave işlemler yapmayışımız bir avantaj olmasına rağmen burada bir problem oluşmaktadır. Çünkü elemana ulaşılamaz ve silinmiştir ama bu düğüm hala bellektedir. Bu düğüm bir boşlar listesine gönderilerek daha sonra listeye eleman ekleneceği zaman bu boşlar listesinden faydalanılabilir. Listeden bir eleman silindiğinde silinen elemanların işgal ettiği blokların tekrar kullanılması için yapılan bu çalışmalara çöp toplama (garbage collection) adı verilir ve dinamik programlama için önemli bir anahtar kavramdır. Eğer çöp toplama işlemi gerçekleşmez ise listeden çıkarılan eleman aynen bellekte kalır silme işlemi artıkça bu şekilde kullanılamayan bellek alanı artar. Buna ise bellek şişmesi denir. Bu durum önlemek için birçok programlama dili önlemler alırlar. Programlama dillerinde bir değişkene bağlanan bir bellek hücresi, kullanılabilir bellek hücreleri arasından seçilir ve bu işleme

-1

bellek yeri ataması ( allocation ) denir. Bir değişkenin kullandığı bellek hücresini geri vermesi

ise belleğin serbest bırakması (deallocation ) işlemi olarak nitelendirili r. C dilinde malloc fonksiyonu ile free fonksiyonları bu amaç için kullanılmaktadır. 11.3.

Dairesel Bağlı, Tek Yönlü ve Çift Yönlü ve Sıralı Listeler

Dairesel kuyruk modelinde olduğu gibi balı listede eğer son düğümün sağbağ değerini -1 ve ilk düğümün solbağ değeri -1 olarak tanımlamayıp, son düğümün sağbağının ilk düğümü; ilk düğümün sol bağının da son düğümü adresleyecek biçimde tasarlanması sonucu oluşan yapıya dairesel bağlı liste denir. Bu durumda veriler adeta bir daire oluşturur ve böylece bu

listelerde ilk düğüm ve son düğüm kavramları ortadan kalkar. Aşağıdaki şekil bunu göstermektedir.

1

4

BTV

2

2

1

CTV

3

3

2

DTV

4

4

3

MTV

1

Daha önce açıklanan silme algoritmaları ve güncellemeleri dairesel bağlı sıralı listelere

uyarlanabilir.

Ödev1. :Dairesel bağlı, sıralı ve tek yönlü bir liste yapısında eleman ekleme ve çıkarma işlemlerini bütün durumlar için araştırınız 

Ödev 2. Yığıt veri yapısını daha önce dizi üzerinde tasarlamıştık. Bağlı liste kullanarak yığıt veri yapısını nasıl tasarlayabiliriz? Araştırınız. Ödev

3. Kuyruk veri yapısını daha önce dizi üzerinde tasarlamıştık. Bağlı liste kullanarak kuyruk veri yapısını nasıl tasarlayabiliriz? Araştırınız.

Özet Dizi, kuyruk ve yığıt veri yapısında fark edilen problemler bağlı liste yaklaşımı ile çözülmüştür. Bu yapılar statik bir performans gösterirken bağlı listeler dinamik çözümler sunmaktadır. Bağlı listeler dinamik yapı ile belleğin en verimli biçimde kullanılmasını sağlamaktadır. Bağlı listelerde ortaya çıkabilecek bir sorun bellek şişmesidir. Bu problem programlama dillerinde çöp toplama mekanizmalarıyla çözülmektedir. Bağlı listeler sıralama gibi algoritmalarda işlem yükünü azaltmaktadır. Tekyönlü bağlı, iki yönlü bağlı ve dairesel tek yönlü ve dairesel çift yönlü modellerde işlem yükü giderek azalırken bir miktar bellek sarfiyatı artmaktadır.

Sakarya Üniversitesi

VERİ YAPILARI ve ALGORİTMALAR Hafta 12 Doç. Dr. Nejat YUMUŞAK

Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF