• Tidak ada hasil yang ditemukan

VeriYapilariveAlgoritmalar11!12!13 14

N/A
N/A
Protected

Academic year: 2021

Membagikan "VeriYapilariveAlgoritmalar11!12!13 14"

Copied!
15
0
0

Teks penuh

(1)

Sakarya Üniversitesi Sakarya Üniversitesi

VERİ YAPILARI ve

VERİ YAPILARI ve

ALGORİTMALAR

ALGORİTMALAR

Hafta 11

Hafta 11

Doç. Dr.

Doç. Dr.Nejat YUMUŞAKNejat YUMUŞAK

Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun 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ü

olarak hazırlanan bu ders içeriğinin bütün hakları saklıdır. n hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tüİlgili kuruluştan izin almadan ders içeriğinin tümü ya damü ya da bölümleri mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve 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

(2)

11. B

11. B

 AĞLI L

 AĞLI L

İSTE

İSTE

VERİ

VERİ

Y

Y

APIS

APIS

I (Lİ

I (Lİ

NKED

NKED

LİST)

LİST)

Daha önce incelenen veri yapıları dizi üzerinde tasarlanmıştı. Dizilerde bir elemana 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 ulaşmanın maliyeti 1 olmasına rağmen sıralama, yığıt, kuyruk ve dairesel kuyruk uygulamala

uygulamalarında dizi kullanımının bazı sakıncaları rında dizi kullanımının bazı sakıncaları vardır.vardır. Dizi veri yapında başlangıçta dizi

Dizi veri yapında başlangıçta dizi eleman kapasitesi ile birlikte eleman kapasitesi ile birlikte tanımlanmatanımlanmaktadır. Bu ktadır. Bu kapasitekapasite programcı değiştirmediği sürece değişmez. Bilgisayar belleğinde yer olmasına rağmen 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

başlangıçta belirlediğimiz bu sayıdan dolayı, kapasiteden fazla bir eleman bu diziyeeman bu diziye girilemez.

girilemez. Aynı Aynı sebepten dolayı sebepten dolayı kapasitedkapasiteden en daha daha az az eleman girilmesi eleman girilmesi durumunda dadurumunda da bellekte boş yere bellek işgal edilmiş olacak ve bu alan dizi için ayrıldığından dolayı diğer bellekte boş yere bellek işgal edilmiş olacak ve bu alan dizi için ayrıldığından dolayı diğer birimler tara

birimler tarafından kullafından kullanılmayacaktır. nılmayacaktır. Hatta hiç Hatta hiç eleman gieleman girilmrilmemesi durumunda bile o yeremesi durumunda bile o yer ayrılmıştır.

ayrılmıştır.

Yani dizi veri yapısı statik bir veri yapısıdır ve bu yapı verimli bellek kullanımını Yani dizi veri yapısı statik bir veri yapısıdır ve bu yapı verimli bellek kullanımını engellemekt

engellemektedir. edir. Ayrıca Ayrıca programın sonlandırılması halinde programın sonlandırılması halinde dizi dizi de de bulunan bulunan tüm tüm bilgilerbilgiler silinecektir. Oysa bu bilgilerin bir dosy

silinecektir. Oysa bu bilgilerin bir dosyaya yazılması gerekir. Bu ise veritabanı uygulamalarıaya yazılması gerekir. Bu ise veritabanı uygulamaları için uygun bir yöntem değildir.

için uygun bir yöntem değildir.  Aşağıda 10 ele

 Aşağıda 10 elemanlı bir A dizisi bmanlı bir A dizisi bulunmaktadır. Heulunmaktadır. Herhangi bir sırlarhangi bir sırlama algoritmasıylma algoritmasıyla sıralı halea sıralı hale getirilen bu diziye en fazla 10 adet sayının girilebileceği açıktır.

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] A[8] A[9] A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

27

27 51 51 54 54 60 60 67 67 80 80 125 125 150150

Diziler bellekte ardı ardına gelen aynı türdeki verileri sakladığından, dizinin elemanları 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

arasında boşluk yoktur. Diziye bir eleman eklenmek istendiğinde bu bilgi dizinin ilk boş yerineboş yerine yazılır ve dizi herhangi bir

yazılır ve dizi herhangi bir sıralama algoritması yardımıylsıralama algoritması yardımıyla tekrar a tekrar sıralanır. Bu verinin hangi ikisıralanır. Bu verinin hangi iki eleman arasına geleceği test işlemleriyle bulunur. Bunun için dizinin ilk elemanından 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

başlayarak karşılaştırma işlemleri yapılır ve yer bulunduktan sonra sağda kalan tüm bilgilersonra 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 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 çı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 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 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 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 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.

(3)

11. B

11. B

 AĞLI L

 AĞLI L

İSTE

İSTE

VERİ

VERİ

Y

Y

APIS

APIS

I (Lİ

I (Lİ

NKED

NKED

LİST)

LİST)

Daha önce incelenen veri yapıları dizi üzerinde tasarlanmıştı. Dizilerde bir elemana 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 ulaşmanın maliyeti 1 olmasına rağmen sıralama, yığıt, kuyruk ve dairesel kuyruk uygulamala

uygulamalarında dizi kullanımının bazı sakıncaları rında dizi kullanımının bazı sakıncaları vardır.vardır. Dizi veri yapında başlangıçta dizi

Dizi veri yapında başlangıçta dizi eleman kapasitesi ile birlikte eleman kapasitesi ile birlikte tanımlanmatanımlanmaktadır. Bu ktadır. Bu kapasitekapasite programcı değiştirmediği sürece değişmez. Bilgisayar belleğinde yer olmasına rağmen 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

başlangıçta belirlediğimiz bu sayıdan dolayı, kapasiteden fazla bir eleman bu diziyeeman bu diziye girilemez.

girilemez. Aynı Aynı sebepten dolayı sebepten dolayı kapasitedkapasiteden en daha daha az az eleman girilmesi eleman girilmesi durumunda dadurumunda da bellekte boş yere bellek işgal edilmiş olacak ve bu alan dizi için ayrıldığından dolayı diğer bellekte boş yere bellek işgal edilmiş olacak ve bu alan dizi için ayrıldığından dolayı diğer birimler tara

birimler tarafından kullafından kullanılmayacaktır. nılmayacaktır. Hatta hiç Hatta hiç eleman gieleman girilmrilmemesi durumunda bile o yeremesi durumunda bile o yer ayrılmıştır.

ayrılmıştır.

Yani dizi veri yapısı statik bir veri yapısıdır ve bu yapı verimli bellek kullanımını Yani dizi veri yapısı statik bir veri yapısıdır ve bu yapı verimli bellek kullanımını engellemekt

engellemektedir. edir. Ayrıca Ayrıca programın sonlandırılması halinde programın sonlandırılması halinde dizi dizi de de bulunan bulunan tüm tüm bilgilerbilgiler silinecektir. Oysa bu bilgilerin bir dosy

silinecektir. Oysa bu bilgilerin bir dosyaya yazılması gerekir. Bu ise veritabanı uygulamalarıaya yazılması gerekir. Bu ise veritabanı uygulamaları için uygun bir yöntem değildir.

için uygun bir yöntem değildir.  Aşağıda 10 ele

 Aşağıda 10 elemanlı bir A dizisi bmanlı bir A dizisi bulunmaktadır. Heulunmaktadır. Herhangi bir sırlarhangi bir sırlama algoritmasıylma algoritmasıyla sıralı halea sıralı hale getirilen bu diziye en fazla 10 adet sayının girilebileceği açıktır.

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] A[8] A[9] A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

27

27 51 51 54 54 60 60 67 67 80 80 125 125 150150

Diziler bellekte ardı ardına gelen aynı türdeki verileri sakladığından, dizinin elemanları 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

arasında boşluk yoktur. Diziye bir eleman eklenmek istendiğinde bu bilgi dizinin ilk boş yerineboş yerine yazılır ve dizi herhangi bir

yazılır ve dizi herhangi bir sıralama algoritması yardımıylsıralama algoritması yardımıyla tekrar a tekrar sıralanır. Bu verinin hangi ikisıralanır. Bu verinin hangi iki eleman arasına geleceği test işlemleriyle bulunur. Bunun için dizinin ilk elemanından 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

başlayarak karşılaştırma işlemleri yapılır ve yer bulunduktan sonra sağda kalan tüm bilgilersonra 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 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 çı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 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 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 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 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.

(4)

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

bu hareketlerden kaynaklandı görülür.naklandı görülür.

Belleği daha etkin kullanmak ve gereksiz işlem yükünden kurtulmak için, bilgilerin her 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 defasında sıralanmasını gerektirmeyen, dizi içerisinde ileri yada geriye doğru kaydırma işlemlerini gerektirmeyen (kitlesel veri hareketi) yaptırmayan

işlemlerini gerektirmeyen (kitlesel veri hareketi) yaptırmayan veri yapılarına gereksinimveri yapılarına gereksinim vardır.

vardır.

Tren vagonlarına yeni bir vagon eklediğimizi yada vagonlarından birini kaldırdığımızı 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 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 yoktur. Sadece vagon eklediğimiz noktada gerekli bağlantıları değiştirmemiz yeterlidir. Bu modelde dizilerin yukarıda bahsedilen

modelde dizilerin yukarıda bahsedilen elemanların kaydırılması zorunluluğuelemanların kaydırılması zorunluluğu  sorunu  sorunu çözülmüştür. Verilerin birbirine bir trenin vagonları gibi bir bağlantı bilgisi yoluyla bağlandığı çözülmüştür. Verilerin birbirine bir trenin vagonları gibi bir bağlantı bilgisi yoluyla bağlandığı veri modeli ile bilgisayar bi

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

Verilere sıralı olarak erişebilmek için elemanların

Verilere sıralı olarak erişebilmek için elemanların fiziksel sıralıfiziksel sıralı olması yerineolması yerine mantıksalmantıksal sıralı

sıralı olduğu liste yapısına Bağlı listeolduğu liste yapısına Bağlı liste  (linked list)  (linked list) denir. Bağlı listeleri bir çizgi üzerindedenir. Bağlı listeleri bir çizgi üzerinde birbirine bağlanmış kayıtlar olarak düşünebiliriz.

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. 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 Buna göre yeni bir eleman eklendiğinde veya bir eleman silindiğinde, ana dizi üzerinde hiç bir değişiklik yapılmaz.

değişiklik yapılmaz. Sadece bağlı Sadece bağlı liste üzerinde liste üzerinde bu bu elemanlar ile elemanlar ile ilgili bağlar ilgili bağlar (linkler)(linkler) değiştirilir. Böylece dizilerdeki sorunlar ortadan kaldırılırken tren vagonundaki kolaylıkta veri değiştirilir. Böylece dizilerdeki sorunlar ortadan kaldırılırken tren vagonundaki kolaylıkta veri yapılarına kazandırılır.

yapılarına kazandırılır.

Şekilde de bir veri düğümü görüldüğü gibi liste

Şekilde de bir veri düğümü görüldüğü gibi liste elemanının saklandıelemanının saklandığı ve ğı ve bir sonraki elemanabir sonraki elemana bağlantıyı sağlayan göstergecin yer aldığı, iki farklı kısımdan oluşmaktadır. Bilgi kısmı bağlantıyı sağlayan göstergecin yer aldığı, iki farklı kısımdan oluşmaktadır. Bilgi kısmı istenilen

istenilen sayıda sayıda alandan alandan oluşabilir oluşabilir .. Ali

Ali Banu Banu CemCem ZeyneZeyne

pp bilgi

bilgi sonraki sonraki bilgi bilgi sonraki sonraki bilgi bilgi sonraki sonraki bilgi bilgi sonrakisonraki

Bilgi Sonraki Bilgi Sonraki

(5)

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 Banu Cem Dilek

bilgi sonraki bilgi sonraki bilgi 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.

(6)

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.

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” verisi 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.

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;

LB -1 A 5 C 6 D 7 F 8 Z 0 5 6 7 8 10 LB

(7)

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.

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.

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.

X=10 E X=10 F 8 X=7 D 10 X=6 E 7 X=10

X

Bağ(yeni)=bağ(eski) Bağ(eski)=yeni (1)

(8)

Görüldüğü gibi dizilerde yaşadığımız sorunu burada yaşamadık. E

Görüldüğü gibi dizilerde yaşadığımız sorunu burada yaşamadık. E verisi sadece ilgili yerdekiverisi sadece ilgili yerdeki bağ güncellemeleri yapılarak listeye eklendi ve listenin diğer elemanları yer değiştirme bağ güncellemeleri yapılarak listeye eklendi ve listenin diğer elemanları yer değiştirme işlemine maruz kalmadı.

işlemine maruz kalmadı.

Eğer önceden girilmiş bir liste bulunmuyorsa liste en baştan oluşturulacaktır. Yine işletim 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 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.

adresli alanda “S” verini saklayalım. Bunun için LB değişkenine dikkat etmeliyiz.

Bundan sonra gelecek olan

Bundan sonra gelecek olan yeni yeni elemanlar LB’nı izleyerek elemanlar LB’nı izleyerek uygun yere uygun yere (1) güncellemesi ile(1) güncellemesi ile eklenecektir.

eklenecektir. Dizi uygulDizi uygulamalarında amalarında bir veriyi dizbir veriyi dizinin birinci inin birinci elemanı olaraelemanı olarak eklemek içik eklemek içinn dizinin bütün elemanlarının yer değiştirmesi gerekirken burada bu işlem tek adımla 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.

gerçekleşmekte diğer elemanların kaydırılmasına ihtiyaç duyulmamaktadır. 11.1.2.

11.1.2.

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

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

 Aşağıdaki bağl

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

Öncelikle LB göstergesi izlene

Öncelikle LB göstergesi izlenerek silinecek eleman bulunur. Burada D elemanının silinmesirek 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 D’yi gösteren bir adresin olmaması demektir. O halde D verisini gösteren bağ artık D’yi göstermeyece

göstermeyecek, k, D’nin bağını gösterecektir.D’nin bağını gösterecektir.

V

Veerr ii (( xx)) = = “S“S” /” / / / EEll eemmaan n ggii rr ii ll ddii

bağ(x bağ(x)) ==-- 1 1 // / / ll ii s t e s t e s os onnuu A A 5 5 C C 6 6 D D 7 7 F F 8 8 Z Z 00 5 5 6 6 7 7 88 10 10 LB LB C C 77 D D 7 7 F F 88 5 6 7 5 6 7

X

X

(9)

Burada yapılan işlemi de genelleştirebiliriz. Listedeki herhangi bir X elemanını silmek Burada yapılan işlemi de genelleştirebiliriz. Listedeki herhangi bir X elemanını silmek istiyorsak LB ile bu X’i

istiyorsak LB ile bu X’i bulduğumuzda bulduğumuzda X’ i adresleyen X’ i adresleyen düğüme X’in “öncel” i düğüme X’in “öncel” i dersek aşağıdakidersek aşağıdaki bağ güncellemelerini yapabiliriz.

bağ güncellemelerini yapabiliriz.

11.2.

11.2.

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

İ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 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 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 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 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 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 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 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 veri yapılarında listeyi oluşturan bir düğüm sol ve sağ olmak üzere iki adet bağ bilgisine ve bir adet veri alanı bilgisi

bir adet veri alanı bilgisine sahiptir. ne sahiptir. Aşağıdaki şekil iki yönAşağıdaki şekil iki yönlü bağlı listeyi oluşturan bir düğülü bağlı listeyi oluşturan bir düğümm

modelini g

modelini göstermektediöstermektedir.r.

Buradan anlaşılacağı gibi bir hücreden hem önceki hem de bir sonraki veriye ulaşmak 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 mümkündür. Cep telefonumuzdaki isim listesi, televizyonumuzun uzaktan kumandasının kanal listesine ulaşımı iki

kanal listesine ulaşımı iki yönlü bağlı listelere örnek yönlü bağlı listelere örnek olarak verilebilir. Eğer televizyonumuzuolarak verilebilir. Eğer televizyonumuzunn uzaktan kumandasını değil de televizyonun kendi butonlarını kullanarak kanallara ulaşmayı uzaktan kumandasını değil de televizyonun kendi butonlarını kullanarak kanallara ulaşmayı denersek burada sadece tekyönlü bağlı l

denersek burada sadece tekyönlü bağlı liste modelini kullanmış oluruz. Bu iste modelini kullanmış oluruz. Bu verilen örneklerdeverilen örneklerde

son kanaldan ilk kan

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

oluştururlar.

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

bağ(x)) ==-- 1 1 // / / ll ii s t e s t e s os onnuu

solbağ

solbağ   VeriVeri sağbağsağbağ

Adres Adres 1 1 BTV BTV 3 3 2 2 CTV CTV 44 2 2 33 3 3 MTV MTV -1-1 44 -1 ATV 2 -1 ATV 2 11 LB LB

(10)

Burada LB=1 adresinde ATV verisi bulunmaktadır. ATV verisinin sol bağı

Burada LB=1 adresinde ATV verisi bulunmaktadır. ATV verisinin sol bağı -1 olup listenin en-1 olup listenin en

başlangıç durumunu göstermektedi

başlangıç durumunu göstermektedir. ATV r. ATV verisinin sağ bağı x=2 adresini gverisinin sağ bağı x=2 adresini göstöstermekte ve buermekte ve bu

adreste BTV kanalı verisi bulunmaktadır. BTV verisinin sol bağı x=1 adresini (ATV kanalını), 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 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ı) 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. 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 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, 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 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 veriyi gösterecektir. İlk veri olduğundan bu verinin sol bağı listenin boş halini, sağ bağı ise

listenin sonunu gösterecektir. listenin sonunu gösterecektir.

11.2.1.

11.2.1.

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

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

a)

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

verisini ekleyelim. verisini ekleyelim.

Bunun için öncelikle ATV’nin ekleneceği yer bulunur. LB’ndan itibaren bağlar izlendiğinde bu 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 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. 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 Bağ güncellemelerini şu şekilde yapacağız. LB değişkeni eklenen “yeni” verisini

gösterecektir. LB= “ATV” yada daha genel olarak

gösterecektir. LB= “ATV” yada daha genel olarak LB=”yeni”LB=”yeni” olacaktır. Listenin ilk düğümüolacaktır. Listenin ilk düğümü

 ATV

 ATV olacağına göre olacağına göre ATV ATV verisinin sol verisinin sol bağıbağı --1 değerini, solbağ(ATV)=1 değerini, solbağ(ATV)=-1, yada -1, yada daha daha genelgenel olarak

olarak solbağ(yeni)=solbağ(yeni)=-1-1 olacaktır. Sağbağ(Aolacaktır. Sağbağ(ATV)=BTV yada daha genel olarakTV)=BTV yada daha genel olarak

sağbağ(yeni)= “orta”

sağbağ(yeni)= “orta” olacaktırolacaktır. . Son Son güncellemeyi güncellemeyi solbağ(BTsolbağ(BTV)=ATV V)=ATV yada yada daha daha genelgenel

olarak

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

bu güncellemeleri aşağıdaki şekille özetleyebiliriz. LB=LS=0

LB=LS=0

Solbağ(yeni)=0 //

Solbağ(yeni)=0 // yeni düğümyeni düğüm

1 1 CTV CTV 3 3 2 2 DTV DTV 44 2 2 33 3 3 MTV MTV -1-1 44 -1 BTV 2 -1 BTV 2 11 LB LB

(11)

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üncellemeleri 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.

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üncellemeyi özetlemektedir. 1 CTV 3 2 DTV 4 2 3 3 MTV -1 4 5 BTV 2 1 LB -1 ATV 1 x=5 1 CTV 3 2 DTV 6 2 3 6 MTV —  4 5 BTV 2 1 LB -1 ATV 1 x=5 3 EGE 4 6 Solbağ(eklenen)=solbağ(orta) Sağbağ(eklenen)=orta Solbağ(orta)=eklenen Sağbağ[Solbağ(eklenen)]=eklenen

(12)

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.

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üncellemeler bu güncellemeyi göstermektedir.

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 CTV 3 1 DTV 6 2 3 6 MTV -1 4 5 BTV 3 1 LB -1 ATV 1 x=5 3 EGE 4 6 Sağbağ(solbağ(silinecek))=sağbağ(silinecek) Solbağ(sağbağ(silinecek))=solbağ(silinecek)

(13)

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 nitelendirilir. 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.

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.

1 CTV 3 2 DTV 4 2 3 3 MTV 1 4 4 BTV 2 1

(14)

Ö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.

(15)

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.

Referensi

Dokumen terkait

Tek katlı bir parabolik yaprak yay için sonlu elemanlar (SE) modeli üzerinde gerilme ve yorulma analizleri Ansys Workbench 14.5 ve Ansys nCode Design Life 14.5

Senden bütün istediğim Küçük bir sevgidir, Gelen ve ağır ağır büyüyen Değil, gelen ve giden.... www.antoloji.com - kültür

"Türkiye ile dostluk ve tarafsızlık anlaşmasının uzatılması" Politikamız, bir barış ve bütün ülkelerle ticaret ilişkileri kurma politi­ kasıdır. Bu politikanın

Üretim sonrasında bölmeden çıkarma ve buna bağlı uygulamalar nedeniyle çalışma alanının büyük bir kısmında toprağın kütle yoğunluğu artmakta ve buna

Genetik algoritma yöntemi kullanılarak yapılan iyileştirilmiş tek boyutlu yöntem için nesil sayısı, popülasyon büyüklüğü, çaprazlama oranı ve mutasyon olasılığı gibi her

Buna göre bir parametreye bağlı bir eğri ailesinin diferansiyel denklemini bulmak için eğri ailesinin denkleminde değişkene göre türev alınır, elde edilen denklemle

uyum sağlamak için gerekli doğru bilgi ve becerileri yoktur. Bu konuyu öğrenmek için, sevgiye ve yardıma ihtiyaçları vardır. Bu konu tartışılması gereken hassas bir konudur.

Herhangi bir sorunun çözümü için izlenmesi gerekli olan aritmetik ve mantıksal Herhangi bir sorunun çözümü için izlenmesi gerekli olan aritmetik ve mantıksal adımların söz