MIT503 Veri Yap*lar* ve algoritmalar

advertisement
MIT503
Veri Yapıları ve algoritmalar
Veri Yapılarına Giriş
Y. Doç. Yuriy Mishchenko
Veri yapıları ve veri tipleri
Ders planı
• Veri yapıları nedir
• Neden veri yapıları
• Basit veri yapıları
• Bileşik veri yapıları
• İleri (soyut) veri yapıları
Sonlu durum hesaplama
• Bildiğimi algoritmaların hepsi şu şekilde
düşünülebilir: bir amacı ulaşmak için, bir
değişken kümesi var ve o kümeyi sırayla
değiştiren işlemler vardır
• Hesaplamaların tüm adımlarında algoritmanın
durumunu belirten değişkenlere bi
algoritmanın durumu deriz, ayrıca algoritmanın
durumunu güncelleştiren işlemlere
algoritmanın kodu veya program denir
Sonlu durum hesaplama
• Bu şekilde gerçekleştirilen hesaplamalara
algoritma biliminde sonlu durum makinesi denir
• Sonlu durum makinesi hesaplamanın bir türü, ama
tek türü değil, yani hesaplama farklı şekilde de
organize edilebilir (mesela sonsuz durum makinesi
veya kuantum hesaplama)
• Fakat modern bilgisayarlarda kullanılan tüm
programlar sonlu durum makinelerinden birilerdir
Sonlu durum hesaplama
• Başladığımız gibi, sonlu durum makinelerinin
bir durum var ve o durum sonlu – yani belirli
sayıda normal değişkenler veya değerler ile
belirlenebilir; sonsuz'un anlamı budur
• Algoritmanın durumu güncelleştirmek için
böyle sonlu durum değiştiren talimatlar var, o
talimatlar makinenin temel işlemleri tanımlar
• Böyle işlemlerin belirli sırasına işte makinenin
programı denir
Sonlu durum hesaplama
Program
İşlem
Durum
Sonlu durum hesaplama
• Sonlu durum makine kavramları, Alan Turing,
Konrad Zuse, John von Neumann
matematikçiler tarafından 1930-1950 yıllarda
geliştirilmiştir
• Bu nedenle sonlu durum makinelerine Von
Neumann mimarisi veya Turing makineleri
denir
Sonlu durum hesaplama
• Bizim için bu anda önemli olan şu –
algoritmalar belirli bir "durum" üzerinde
tasarımlanır ve bu durumu temsil etmek veya
belirtebilmek için belirli araçlara ihtiyacımız var
• Bu araçlar veri yapıları dır
Veri yapıları nedir
• Veri yapısı: algoritmanın hesaplama
durumunu herhangi bir anda belirtmek için
kullanılan değerşler veya veriler
Veri yapıları nedir
• Veri yapıları temel değişkenlerden daha ileri
bir kavram, yani değişken bir değerin eşdeğeri
olarak düşünülebilirse eğer, veri yapıları aynı
zamanda bu değerle gerçekleştirilebilir işlem
veya dönüşümleri de belirtilir
Veri yapıları nedir
• Örneğin, matematiksel sayılar işte (a) bir
sayısal değer VE (b) o değerlerle yapılabilir
ekleme, çıkartma, çarpma ve bölme
işlemlerinin tanımları
• İşte gerçekten bunların ikisi birlikte gelmeli –
sayısal değer aritmetik işlemler olmadan çok
anlamlı değildir
• Bilgisayar bilimin veri yapıları bu basit bir
kavramın genişletilmesidir
Neden veri yapıları?
• Veri yapıların zengin bir çeşitliği var, böyle veri
yapıları temsil edilebilen değerler ve
tanımlanan yani bilinen işlem kümeleri olarak
farklıdır
Neden veri yapıları?
• Bundan dolayı, belirli algoritmada o
algoritmanın işlem ihtiyaçlarına en iyi şekilde
karşılayabilecek veri yapılarının kullanımı
avantajlı ve büyük önem taşır
• Örneğin –metin işletme yapan algoritmada
karakter veri yapıları kullanılması çok daha
anlamlı; veritabanları ile ilgli algoritmalarda
dizi veri yapıları kullanılmaktan büyük kolaylık
çıkar
Neden veri yapıları?
• Çok basit örnek – temel matematiksel işlem
yapan program veya algoritmada temel sayısal
değişkenler ve ilgili veri yapıları
kullanılmaktadır
Neden veri yapıları?
• Diğer taraftan, verilerin kümeleri ile çalışan
programlarda dizi/array lerin kullanımı
neredeyse şarttır
• Arrayler, bir nesnenin kümesi bir sırada içeren
bir veri yapısı, mesela A=[“a”,“b”,“c”]
Neden veri yapıları?
• Kayıt veya record'ler, bir farklı veri yapısı,
burada birkaç değer isimli alanlarda içerir –
bunların kullanımı da belirli durumlarda
anlamlı
• Mesela –
öğrenci.ad:=“Temel”,
öğrenci.soyad:=“Okuyucu”,
öğrenci.not:=“AA”, VB
Neden veri yapıları?
• Baze durumlarda değer kümesi program içerisinde dinamik
olarak değiştirilmesi gerekiyor, bu durumda ne record nede
array'ler tam olarak işi yaratmıyor
• Böyle durumlarda dinamik dizi veri yapıları kullanılabilir,
onlardan biri hash-tabloları veya asosiative diziler
• Asosiative diziler değerleri "anahtar-değer" çiftleri şeklinde
organize eder ve çiftler dinamik olarak kümeye eklenebilir
veya kaldırılabilir
• Asosiative diziler, algoritmada dinamik veriler veya kaytılar
ile çalışabilmek için kullanılabilir
• öğrenci[“ad”]:=“Temel”, öğrenci[“soyad”]:=“Okuyucu”,
öğrenci[“araba”]:=“Ford", öğrenci[“not”]:=“AA””
Veri yapıları
• Vari yapıları üç temel gruba bölünebilir
– Primitif veri yapıları
– Bileşik veri yapıları
– Soyut veri yapıları
Basit veri yapıları
• Primitif veri yapıları matematiksel sayılardan
çekilmiştir
Basit veri yapıları
Tamsayılar
– Tamsayı veri yapısı, normal tamsayılara temsil eder
– Toplama, çıkartma, çarpma, ve bölme işlemler var
– Daha büyük, daha küçük ve eşitlik işlemler var
– Önceki ve sonraki ardışıklık işlemi de var
• Modern bilgisayarda gerçekten tek temel
veriler tamsayılardır, tüm değer veri yapıları
bilgisayarlarda tamsayılar kullanarak
uygulanması gerekmektedir
Basit veri yapıları
• Programlama dillerinde tamsayılar kullanılan
belleğin boyutuna göre byte, short, int, long
tiplere bölümür:
–
–
–
–
Byte – 8 bit (1 byte), 0’dan 255’e kadar
Short – 16 bit (2 byte), 0’dan 65 535’e kadar
Int – 32 bit (4 byte), 0’dan 4 294 967 296’e kadar
Long – 64 bit (8 byte), 0’dan 18 446 744 073 709 551
616’e kadar
– Bunlar ayrıca işaretli veya işaretsiz olabilir: işaretli ise
– aynı aralık iki eş negatif ve pozitif kısıma bölünür,
örneğin, işaretli byte -127’den 127’e kadar değerleri
kapsayan tamsayılar dır
Basit veri yapıları
Gerçel sayılar
– Normal gerçel sayıların anlamına gelir
– Aritmetik toplama, çıkartma, çarpma ve bölme
işlemleri var
– Daha büyük, daha küçük ve eşitlik karşılaştırma
İşlemleri var
– Gerçel sayılar için ardışıklık işlemleri yoktur
Basit veri yapıları
• Bilgisayarlarda gerçel sayılar tabi tamsayılar kullanarak
işletilir, ayrıca sadece yaklaşık olarak kaydedilebilir
• Örneğin bilgisayarda hesaplanan karekök 2 gerçekten
karekök değil, onun bir yaklaşımı yani 1.414213562 ve
bukadar, karekök 2 bundan sonra tabi çok daha devam
eder
• Gerçel sayılar bilgisayarlarda “mantis” ve “exponent”
iki tamsayı kullanarak temsil edilir, genellikle .24351E15
şekilde yazılan sayılar aslında 0.24351*1015 anlamına
gelir; burada .24351 mantis ve 15 exponent tir
Basit veri yapıları
• Programlama dillerinin çoğunda gerçel sayılar
float veya double olarak tanımlanabilir
– Float – 32 bit (4 byte) kullanan, ±3.4E38 aralıkta,
8 basamak mantise sahip olan sayılardır
– Double – 64 bit (8 byte) kullanan, ±1.8E308
aralıkta, 16 basamak mantise sahip olan gerçel
sayılardır
– Gerçel değişkenler her zaman işaretlidir
Basit veri yapıları
Boolean (mantıksal) sayıları
– Sadece iki değer var, yanlış (0) veya doğru (1)
– OR, XOR, AND ve NOT mantıksal işlemleri tanımlanır
– Algoritmalarda mantıksal işlemleri yapmak için
kullanılır
Karakterler
– Algoritmalarda metinle çalişmak için kullanılır
– Programlama dillerinde genellikle byte veya short
tamsayı ile temsil eder, sadece ilişkili tamsayılara bir
tablo kullanarak “a”, “b”, “c” gibi harf değerleri atanır
Bileşik veri yapıları
• Bileşik veri yapıları, verilerin kümeleri toplu
olarak temsil eden veri yapılarıdır; bunlardan
ilki diziler veya array'ler
Bileşik veri yapıları
Diziler, en temel bileşik veri yapısı
– Belirli bir sırada bşr eleman süresi belirtir
– Bilgisayarlarda belekte tek belek bloku olarak
kaydedilir ve elemanların sırasına göre erişim
sağlanır
1
a
2
3
4
5
123
b
Yuri
ders
6
7
8
3.5
503
ttt
sıra
elemanlar
Bileşik veri yapıları
Diziler
– Elemanlara direkt erişim olabilmesi için, dizilerdeki
verilere erişim çok hızlı ve verimli
1
a
2
3
4
5
123
b
Yuri
ders
6
7
8
3.5
503
ttt
sıra
elemanlar
Bileşik veri yapıları
Diziler
– Dizi veri yapısı sadece içerik koyma/ortaya çıkartma
işlemi tanımlar; bazen arama işlemi de tanımlanır
– Koyma/çıkartma işlemleri sayısal “indeks” yani
“pozisyon” kullanarak gerçekleştirilir, örneğin
benim_dizi[pozisyon]:=benim_değer
1
a
2
3
4
5
123
b
Yuri
ders
6
7
8
3.5
503
ttt
indeks
içerik
Bileşik veri yapıları
Matrisler, iki, üç, vb boyutlu dizilerdir
• En temel iki boyutlu matris bir tablonun
anlamına gelir
• Matrislerdeki işlemleri gerçekleştirmek için
bileşik indeksler kullanılır, yani
benim_tablom[i,j]
0
0
2
0
0
1
3
0
0
0
0
0
0
0
0
1
0
0
0
0
0
2
0
0
0
0
3
0
0
5
Bileşik veri yapıları
Seyrek matrisler
• Seyrek matrisler çoğunlukla 0 içeren
matrislerdir
0
0
2
0
0
1
3
0
0
0
0
0
0
0
0
1
0
0
0
0
0
2
0
0
0
0
3
0
0
5
Bileşik veri yapıları
• Seyrek matrisler, sıfırdan farklı elemanın listesi
şekilde belirtilirse çok daha ekonomik ve
verimlidir
Bileşik veri yapıları
• Bağlantılı listeler ikinci temel dii veri yapısıdır
• Bağlantılı listeler dinamik diziler ile
çalışabilmek için keşfedilmiştir; eğer dizinin
boyutu baştan belli olmalı ve program çalışıyor
zaman değişemez, bağlantılı listelerin boyutu
dinamik yani değişebiliyor
• Bağlantılı liste, bir elemanın zinciri olarak
düşünülebilir
Bileşik veri yapıları
Bağlantılı listenin ana fikri:
nesne
nesne
nesne
Her elemanda ilişkili veri ve
sonraki elemana işaretçi vardır
işaretçiler
işaretçiler
İşaretçileri takip ederek bütün liste
geçirilebilir
İki yonlü listelerde sonraki ve
önceki elemana işaretçiler
kullanılır
Bileşik veri yapıları
• Bağlantılı listedeki eleman sayısı kollayca
değiştirilebilir, zincirin sonuna her zaman yeni
bir eleman eklenerek
• Fakat belirli pozisyondaki elemana ulaşmak
zahmetli olabilir, yani verilere erişim yavaş
Bileşik veri yapıları
Bağlantılı listelerin işlemleri
– Ekleme – yeni eleman eklenmesi
• yeni eleman listenin sonuna eklenir ve işaretçi ile
önceki elemana bağlanır
– Kaldırma – var olan eleman kaldırılması
• Kaldırma için, eleman sıradan kaldırıp yanındaki
elemaların işaretçileri uygun şekilde güncelleştirilir
– Arama – listede belirli elemanın ortaya çıkartma
• Listenin birinci elemandan başlayınca hedef veya sona
ulaşmaya kadar işaretçiler takip edilir
Bileşik veri yapıları
Bağlantılı listede ekleme ve kaldırma
nesne
nesne
nesne
işaretçiler
nesne
nesne
Ekleme
Yeni eleman sonuna ekleyip
yeni işaretçi ile bağlanır
nesne
Belirtilen elemanı kaldırıp yanındaki
elemanın işaretçileri güncelleştirilir
Kaldırm
a
Bileşik veri yapıları
• Bağlantılı liste genel veri yapılarının kavramının
çok güzel bir örnek, çünkü basit fakat primitif
olmayan ilgli işlemler için algoritma tanımlanması
lazım; bu algoritmalar tabi bizim tarafımızdan
belirtilmesi gereklidir
• Fakat bu algoritmalar uygulandıktan sonra
bağlantılı liste verileri tek bir nesne olarka
kullanılmaya başlayabilir; programlama dillerinin
çoğunda bağlantılı liste veri tipi tanımlanır ve bu
şekilde programlarda kullanılabilir
Bileşik veri yapıları
Bagbaglantili liste = {ilk, son}
eleman={.nesne, .onceki,.sonraki}
Baglantili liste ekleme algoritmasi
liste.ekle(yeni_nesne)
yeni_eleman.nesne=yeni_nesne
yeni_eleman.onceki:=son
yeni_eleman.sonraki:=0
son.sonraki:=yeni_eleman
Baglatili liste kaldirma algoritmasi
liste.kaldir(hedef)
eleman:=liste.bul(hedef)
onceki_eleman:=eleman.onceki
sonraki_eleman:=eleman.sonraki
onceki_eleman.sonraki:=
sonraki_eleman
Bileşik veri yapıları
Hash Tabloları
• İkinci önemli dinamik dizi veri yapısı Hash
Tabloları dır
• Hash tabloları, bağlantılı listeler gibi boyutu
değişebilir, aynı zamanda elemanlar normal
dizilerine kadar hızla ulaşılabilir
Bileşik veri yapıları
• Hash tablolarda elemanları kaydetmek için
"anahtar-değer" çiftleri kullanır; burada
anahtar index anlamına gelir ve daha önce
kaydedilmiş değeri ortaya çıkartmak için
kullanılabilir
• Anahtar-değer çiftleri serbest eklenip
kaldırılabilir, yani böyle dizinin boyutu sabit
değil - dinamik
Bileşik veri yapıları
Hash tablosu nedir?
Veri bloğu (bilgisayar belleği)
Anahtar - nesne
(1) Verilen “anahtar” için bir
“adres fonksiyonu” kullanarak
bilgisayar belleğinde kaydetme
adresi hesaplanır –
“bellek adresi = H(anahtar)”
N
H’ye “hash fonksiyon” denir, ana özelliği –
herhangi farklı iki anahtar için farklı adres verilmektedir
Bileşik veri yapıları
Hash tablosu nasıl çalışıyor ?
Veri bloğu (bilgisayar billeği)
Anahtar - nesne
(2) Hash fonksiyonu
kullanarak farklı
anahtarlı değerler tabi farklı
adreslerde kaydedilir
a
c
g
e
h
d
h
x
m
l
n
b
f
x
N
ı
z
k
k
İkinci özelliği – hash fonksiyonu verileri adres bloğunu düzgün
şekilde tamamen kullanacaktır
Bileşik veri yapıları
Hash tablosu nasıl çalışıyor ?
Veri deposu (bilgisayar billeği)
Anahtar ?
a
c
g
(3) Daha önce kaydedilmiş
değeri geri çıkartmak için,
“anahtar” kullanarak yeni belek
adresi hesaplanır ve program
değeri o adresten direkt olarak
çıkartır
e
h
d
h
x
m
l
n
b
f
x
N
ı
z
k
k
Bileşik veri yapıları
• Hash tabloların ana avantajı, kaydedilmiş
değerleri tekrar ortaya çıkartmak için tek
operasiyon gerekir – anahtara göre adresi
hesaplayıp o adrese başvurmak, aynı zamanda
anahtar-değer çiftleri serbest eklenebilir
• Yani bağlantılı liste ise, bu tür işlem N eleman
var ise O(N) işlem gerekebilir, burada hala O(1)
her durumda
Bileşik veri yapıları
• Algoritmalarda çok kullanılan dizi veri yapıları
yığınlar (stack) ve kuyruklar (queue) dır
• Yığınlar ve kuyruklar özel dinamik dizilerdir
• Yığınların ve kuyrukların düşük seviyeli
programlamada yani asembler gibi işlemci
seviyesi yapılarda çok yaygın şekilde kullanılır
Bileşik veri yapıları
Yığın
• Yığınlar seri girişi kaydetmek ve sonra ortaya çıkartmak
için kullanılır; örnek, metin satırı bir seri giriştir
giriş
v
e
r
i
y
a
p
ı
yığın
• İki yığın türü var, Last-İn-First-Out (LİFO) ve Firstİn-First-Out (FİFO, ayrıca kuyruk ayrıca queue dir)
Bileşik veri yapıları
• Last-in-first-out (LİFO) ve First-in-first-out
(FİFO) yığınları arasında farkı şöyledir
1
girdi
1
2
1
2
girdi
3
1
2
1
2
girdi
LİFO 
girdi
1
2
1
1
2
3
1
2
1
2
3
girdi
3
girdi
çıktı
3
çıktı
3
 FİFO
Bileşik veri yapıları
• Yani FIFO yığın girdiği satırı aynı sırada geri
verir, LIFO girdiği satırı ters sırada geri verir
Bileşik veri yapıları
• Bilgisayar belleğinde yığınlar belirli boyutta
standart bir dizi olarak uygulanır, böyle dizinin
boyutun yıgın boyutu denir
• Giriş geldiğinde, dizi başından doldurulur,
değerleri ortaya çıkartmak için, elemanlar
yada başından yada sonundan çıkartılır
(FIFO/LIFO’ya göre)
s
FİFO
t
a
c
k
LİFO
Bileşik veri yapıları
Dolayısıyla yığın işlemleri
– PUSH – (itmek) yeni değer yığına koymak
– POP – değer çıkartmak, FIFO veya LIFO olarak
– EMPTY – yığının boş olmasını kontrol etmek (yani
sormak, boşaltmak değil)
EMPTY
PUSH
PUSH
PUSH
POP
1
2
1
2
1
3
3
3
2
2
1
1
Bileşik veri yapıları
• Ödev – yıgın veri yapısı sözde kod kullanarak
uygulayınız
Bileşik veri yapıları
• Baze yığınlarla ilgili kavramlar,
– Yığını uygulayan dizinin boyutu sonlu olduğu için
yıgın aşırı dolu durumuna çıkabilir, bu durumda
yıgına “overflowed” denir
– “Stack overflow”, yaygın bir güvenlik problemidir,
bilgisayarda yığın dizinin boyutu yeterli olmadığı
zaman, veriler yandaki beleğin veya program
kodunun üstüne yazmaya başlayabilir
s
t
yığın
a
c
k
WIN
DO
ilgisiz belek
WS
Bileşik veri yapıları
Kuyruklar (queue)
• Kuyruklar, yığınlar gibi seri giriş için kullanılır
• FİFO yığınlarına eşit, ama farklı terimler
kullanılır: “push” ve “pop” yerine “queue” ve
“dequeue” denir
Bileşik veri yapıları
Kuyruklar (queue)
• Öncelikli kuyruklar (priority queues) önemli bir
özel durumudur
– Bütün değerler için bir “öncelik” tanımlanır
– “Queue”/”Push”, önceki push gibi çalışır
– “Dequeue”/”Pop”, ilk gelen değer yerinde en
yüksek öncelikte olan değer verir
Bileşik veri yapıları
Öncelikli kuyruk
öncelik
nesne
(a,1)
(b,2)
a
a
b
(c,0)
dequeue b
c
a
c
a
queue
kuyruk
queue
queue
Daha yüksek önceliğe
nesnesi önüne gidiyor
b
Bileşik veri yapıları
Öncelikli kuyrukların işlemleri
– ADD – yeni nesne eklemek
– POLL – nesne alıp kaldırmak
– PEEK – nesne kaldırmadan almak, sadece nesneye
bakmak demek yani
– EMPTY – kuyruğun boş olmasını kontrol etmek
İleri veri yapıları
• Soyut veri yapıları genellikle farklı
matematiksel kolleksiyon veya kümeleri
uygularlar
– Küme, matematiğin temel bir kavramdır ve
bilgisayar algoritmalarda da çok önemlidir
– Bunlarla ilgili önemli veri yapıları kümeler,
haritalar, veri ağaçlar ve graflar (öbür ders)
İleri veri yapıları
Kümeler
• Normal matematiksel küme temsil eder
– Değerlerin bir çeşiti sıra olmadan kaydeder
– Yapılabilir işlemi, değerin kümede var olup
olmadığını söylemektir
– Not edelim ki, diziden faklı olarak kümelerde iki
aynı değer aynı anda bulunamaz
İleri veri yapıları
Küme işlemleri
– Üyelik, belirli değerin kümede var olup olmadığı
– Ekleme, değeri kümeye eklemek
– Kaldırma, değeri kümeden kaldırmak
– İteratör, küme içindeki tüm değerleri bir sırada
geçirmek
– Boyut, içindeki değer sayısı
İleri veri yapıları
Map veya Haritalar
• Harita veri yapısı matematiksel fonksiyonun
anlamına gelir: bir x argumanı karşılayan
değeri belirtir (x → f(x))
• Haritalar, (x,y) bir çifti olarak da düşünülebilir
– hash tabloları düşünün – fakat x'e biz
haritanın parametresi ve y'e sonucu diyoruz ve
x-y çiftine ilişki diyoruz
İleri veri yapıları
Haritaların işlemleri
– Haritada parametrenin olup olmadığı
– Haritada sonucun olup olmadığı
– Haritanın parametre kümesini vermek
– Haritanın sonuç kümesini vermek
– Belirli parametreye göre sonucu vermek
– Yeni “parametre → sonuç” ilişkisi eklemek
Ödev
• LIFO yığın uygulayın
– LIFO = {DIZI, var olan eleman sayisi n}
– PUSH, POP ve EMPTY işlemleri için gerekli
algoritmalar yazın (sözde kod kullanarak)
• Küme veri yapısıni uygulayın
– Küme = { bir dinamik deposu, bağlantılı liste veya
hash tablo olabilir, fark etmez }
– Üyelik, ekleme, kaldırma, boyut vb işlemler için
gerekli algoritmalar yazın (sözde kod kullanarak)
Not: tipli ve tipsiz veri yapıları
Tipli ve tipsiz kolleksiyonlar
• Kolleksiyonda genel türlü nesneler içerilebilirse (örneğin
aynı kolleksiyonda tamsayılar, gerçek sayılar, karakterler, vb
olablirse), böyle kolleksiyona tipsiz denir
• Tipli kolleksiyonda sadece belirli tipten nesneler içerilebilir
– Örneğin: Kolleksiyonda içerilen nesnelerin hepsi tamsayı olmalı
• Programlamada bunun gibi ifadeler bazen görülebilir
– Set<String> - sadece karakterler (String) içeren bir küme (Set)
– Map<String,Integer> - sadece karakterlerden (String)
tamsayılara (Integer) bir harita (fonksiyon)
– Hash<String,String> - sadece karakterlerden (String) karakterlere
(String) bir hash tablosu (Hash)
• Bir yerde görecekseniz, demek bu.
Download