ders notları - SciNet Central

Download Report

Transcript ders notları - SciNet Central

MIT503
Veri Yapıları ve algoritmalar
Algoritmalara giriş
Yrd. Doç. Dr. Yuriy Mishchenko
Algoritmalara giriş
Ders planı
• Algoritmalar nedir
• Algoritma “olmayan” algoritmalar
– Günlük hayatta algoritmalar
– Sayı ekleme ve çarpma süreçleri
• Arama
– İkiye bölme arama, sözlükler ve kataloglar
– KD arama, anahtar kelime arama
Algoritmalar nedir
• Algoritmalar herhangi bir problem için detaylı
ve biçimsel çözüm planıdır
• Herhangi algoritmanın temel adımları
– Problem yada sorun kesinleştirmek
– Problemin çözüm fikrini almak
– Problemin çözüm yöntemi kesinleştirmek
– Problemin çözüm planı yazdırmak, yani bu
noktada algoritma vardır
Algoritmalar nedir
• Genel anlamda algoritmalar bir çok durumda
günlük hayatımızda kullanırız, günlük hayattaki
eylemlerimizin algoritmalar olmasını bile
düşünmeyiz
Algoritma “olmayan” algoritmalar
Örneğin, yemek pişirme tariflerinin hepsi
algoritmadır
• Yemek pişirmenin problemi – yemek
pişirmektedir
• Pişirme tarifi, bu problemini çözümdür
• Yemek tarif websitelerinde tipik olarak bunun
gibi tarifler görünülebilir ...
Algoritma “olmayan” algoritmalar
“Mercimek çorbası”: 2 su bardağı mercimek, 7 su bardağı
su, 2 adet soğan, 1 tablet tavuk suyu kalıbı hazırlayın. İlk
önce soğanları ince ince doğrayıp yağda kavurun. Önceden
yıkadığımız mercimeği, 1 tablet tavuk suyu kalıbını
soğanların bulunduğu tencereye atın. Ardından kaynar su
ilave edin. Bu şekilde yaklaşık 10 dakika kaynatın. 10 dakika
sonra tenceredeki malzemeleri ince bir süzgeç yardımıyla
süzün. Süzdükten sonra tekrar tencereye alarak bir kere
daha kaynatın. Son kaynama sırasında ağız tadınıza göre
tuz ekleyin. Mercimek çorbası hazır!
Algoritma “olmayan” algoritmalar
• Bu bir algoritma ama algoritma şeklinde değil
çünkü
– Tarif adım adım ve yapılandırılmış şekilde değil,
tüm adımlar hep birlikte ve karışık tek paragraftır
– Tarif çok detaylı değil, birçok eylem tek cümle
içinde karışık şekilde anlatır
– “Tadınıza göre” gibi ifadeler belirli değil
• Bunun sorun, daha önce yemek hiç pişirmemiş
kişi bu tarifi gereken şekilde uygulayamaz
“Mercimek çorba tarifi” algoritma şeklinde
2 su bardağı mercimek alın, M olsun
7 su bardağı su alın, SU olsun
2 adet soğan alın, SO olsun
1 tablet tavuk suyu kalıbı alın, TS olsun
Tencere alın, T olsun
SO ince ince doğrayıp yağda kavurun, K olsun
K, T’ye atın
M, yıkayın
M ,T’ye atın
SU T’ye ekleyin, Ç olsun
Ç’yi kaynatın
10 dakika bekleyin
Ç’deki malzemeleri süzgeç yardımıyla süzün
Ç’yi tekrar kaynatın
1 dakika bekleyin
1 çay bardağı tuz ekleyin
Mercimek çorbası hazır!
Algoritma “olmayan” algoritmalar
• Bu tarifin ana farkları
– Tarif adım adım şekilnde yazılmıştır
– Tarif biçimsel yatay sırada yazılmıştır
– Eylemlerde kullanılacak malzemeler detaylı ve
belirli şekilde tanımlanmıştır
– “Tadınıza göre” gibi belirsiz ifadeler yokmuş
Algoritma “olmayan” algoritmalar
• Bu örnekte önemli bir kavramı da karşılaştık, yani
değişken
– “tencere, T olsun” gibi ifadeler, uzun ifadeyi daha
sonra daha kolayca birkaç defa tekrar kullanmak için
faydalıdır
– Değişken, bu anlamda daha önce belirtilmiş ve daha
sonra kullanılacak bir uzun ifadenin temsili
– Örneğin “mercimek, soğan, ve su içeren tencereyi
kaynatın” tekrar tekrar yazmamak için, “T” sembolünü
kullanarak, sadece “T’yi kaynatın” yazmamıza gerek
var
Algoritma “olmayan” algoritmalar
– Diğer açıdan değişken, aynı zamanda farklı ifadeler
veya değerler içerebilir bir konteyner olarak
düşünülebilir
– “T olsun” derken, “T” adlı konteynere birşeyin
atanmasını düşünürüz
– “T” tekrar kullanacak zamanda, önce atanmış
değerin tekrar kullanılması anlamına gelir
Algoritma “olmayan” algoritmalar
• İşte değişken, yani başka bir uzun
ifade/değer/işlemin sonucu/vb içeren ve
anlamına gelen bir sembol
Algoritma “olmayan” algoritmalar
• Ana okulda öğrenilmiş ekleme ve çarpma
işlemleri de algoritmalar
• Yani, ekleme işlemi
– İki sayı birbirinin altında yazıp basamak basamak
eklemeye başlıyoruz
– Eğer bir adımda sonuç 9 dan büyükse, 1
hatırlıyoruz ve sonraki basamakların toplamına
ekliyoruz
– Tüm basamaklar için bu şekilde ekleme işlemini
yapıyoruz
Algoritma “olmayan” algoritmalar
• Örnek:
38399
18389
56788
x1x11
Algoritma “olmayan” algoritmalar
• Bunun nasıl yapılacağını hepimiz biliyoruz,
algoritma/işlem sırası şeklinde bunu yazmak
çok basit soru değildir
• Deneyelim ...
“Sayı ekleme”
A, 1. giriş sayı olsun
B, 2. giriş sayı olsun
//basamakları sağdan sayılmayı deyelim
A’nın 1. basamak elde edin, a olsun
B’nın 1. basamak elde edin, b olsun
a ve b’nın toplamı ekleme tablosunu (9x9) kullanarak bulun, C olsun
Eğer C 9’dan büyük ise
1 hatırlayalım, H olsun
Aksi halde
H sıfır olsun
C‘nin son basamağı sonucun 1. basamak olarak yazın
------ sonra
A’nın 2. basamak elde edin, a olsun
B’nın 2. basamak elde edin, b olsun
a ve b’nın toplamı ekleme tablosunu kullanarak bulun, C olsun
Eğer H 1’e eşit ise
C‘nın sonraki sayı elde edin, yine C olsun
Eğer C 9’dan büyük ise
1 hatırlayalım, H olsun
Aksi Halde
H sıfır olsun
C‘nin son basamağı sonucun 2. basamak olarak yazın
------ sonra
A’nın 3. basamak elde edin, a olsun
B’nın 3. basamak elde edin, b olsun
a ve b’nın toplamı ekleme tablosunu kullanarak bulun, C olsun
...
Algoritma “olmayan” algoritmalar
• Burada iki yeni kavrama karşılaşıyoruz
– Koşullu işlemler; yani eğer bir koşul doğruysa bir
işlem, değilse diğer işlem yapmamıza gerek var
Eğer C 9’dan büyük ise
H bir
Değilse
H yok
– Bunun gibi “ise” işlemlere koşullu işlem diyoruz
Algoritma “olmayan” algoritmalar
• İkincisi önemli kavram olarak, fark edin ki
algoritmamızda baya bir birine benzer işlem var, yani
A’nın 2. basamak elde edin, a olsun
B’nın 2. basamak elde edin, b olsun
a ve b’nın toplamı ekleme tablosunu kullanarak bulun, C olsun
Eğer H 1’e eşit ise
C‘nın sonraki sayı elde edin, yine C olsun
Eğer C 9’dan büyük ise
1 hatırlayalım, H olsun
Aksi Halde
H sıfır olsun
C‘nin son basamağı sonucun 2. basamak olarak yazın
• Bu durumda “döngü” olduğunu diyoruz, yani birçok
defa tekrarlanması gereken bir işlem
“Sayı ekleme” algoritması
A, 1. giriş sayı olsun
B, 2. giriş sayı olsun
H yok olsun
//basamakları sağdan sayılmayı deyelim
A’nın K. basamak yada B’nın K. basamak var IKEN
A’nın K. basamak alın, a olsun
B’nın K. basamak alın, b olsun
a ve b’nın toplamı ekleme tablosunu kullanarak bulun, C olsun
Eğer H varsa
C‘nın sonraki sayı alın, yine C olsun
Eğer C 9’dan büyük ise
H var olsun
Değilse
H yok olsun
C‘nin son basamağı sonucun K. basamağı olarak yazın
K’nin sonraki sayı alın, K olsun //yani sonraki basamağa gidin
Algoritma “olmayan” algoritmalar
• İşte koşullu işlemler ve döngüler
– Koşullu işlem algoritmanın bir koşula bağlı, yani bir
koşul doğru İSE, işlemdir
– Döngü birkaç defa, yani bir koşul doğru İKEN,
tekrarlanması gereken işlemdir
“Sayı ekleme” algoritması
A, 1. giriş sayı olsun
B, 2. giriş sayı olsun
H yok olsun
A’nın K. basamak yada B’nın K. basamak var IKEN
A’nın K. basamak elde edin, a olsun
B’nın K. basamak elde edin, b olsun
a ve b’nın toplamı ekleme tablosunu kullanarak bulun, C olsun
Eğer H var ise
C‘nın sonraki sayı elde edin, yine C olsun
Eğer C 9’dan büyük ise
H var olsun
Aksi Halde
H yok olsun
C‘nin son basamağı sonucun K. basamağı olarak yazın
K’nin sonraki sayı alın, K olsun //yani sonraki basamak alın
Algoritma “olmayan” algoritmalar
• Benzer şekilde çarpma işlemini inceleyelim;
– İki sayı birbirinin altında yazıyoruz
– Önce, birinci sayı basamak basamak ikinci sayının
son basamakla çarpıyoruz;
– Böyle çarpmaların sonuçları birbirinin altında her
zaman soğa 1 basamak kayarak yazıyoruz
– Sonuçta bütün elde edilen öyle sayıları topluyoruz
(toplama işlemi biliyoruz, yani önceki algoritma)
Algoritma “olmayan” algoritmalar
• Örnek:
38399
389
345591
307202
115197
14938311
Algoritma “olmayan” algoritmalar
• Algoritmasını nasıl yazarız ?
Algoritma “olmayan” algoritmalar
• Çarpma işlemde iki döngü var, yani
– Bütün 2. sayının basamakları için, ve ...
– o 2. sayının basamağı için Bütün 1. sayının
basamaklarını çarpmak gerekir
• Döngüler içinde iki sayıların basamakları
çarpılır;
• Çarpımın son basamağı sonuca gider ve ilk
basamağı hatırlanır ve sonraki basamakların
çarpımını etkiler
“Sayı çarpma” algoritması
A, 1. giriş sayı olsun
B, 2. giriş sayı olsun
B’nın K. basamak var İKEN
H, sıfır olsun
A’nın M. basamak var İKEN
B’nın K. basamak ve A’nın M. Basamak çarpım tablosu kullanarak
(9x9, sonuçlar 81’den küçük) çarpın, C olsun
C’ye H ekleyin, D olsun
D’nin son basamağı eklenecek K. sonucun M. basamağı olarak yazın
Eğer D 9 dan küçük ise
H sıfır olsın
Yoksa
H D’nin ilk basamağı olsun
Sonraki M basamağı alın
Eklenecek K. sonuca sağda (K-1) sıfırı ekleyin
//yani K. sonucu sola K-1 basamak kaydırmak lazım
Sonraki K basamağı alın
Elde edilmiş bütün eklenecek K sonucu birbiriyle ekleyin
Algoritma “olmayan” algoritmalar
• Günlük hayatımızda düşünmeden birçok
algoritma kullanırız, ama
– Genellikle bu algoritmaları nasıl işletmeyi bilip
biçimsel şekilde anlatamayız
– İşlemi öğrenince tarifleri hatırlayamayız
– Öyle algoritmaların detaylı talimatlarını yazmak
bizim için zordur (örneğin ekleme, çarpma,
çıkartma, bölme)
Algoritma “olmayan” algoritmalar
• Algoritmaların açık, detaylı ve biçimsel
temsillerini verebilmemiz gerekir çünkü
– Yeni durumda aynı algoritmayı uygulamak için
algoritmanın iyi tanımı gerekmektedir
– Algoritma diğerlere anlatmak için bu algoritmanın iyi
tanımı gerekmektedir (özellikle bir algoritma
bilgisayara anlatmak için)
– Algoritmanın davranışı ve onun özelliklerini anlamak
için algoritmanın gerçek tanımı gerekmektedir
– Algoritmadan yeni algoritmaları çektirmek için
algoritmanın gerçek tanımı gerekmektedir
Arama
• Yukarıdaki basit algoritmalarla biz
ilgilemeyeceğiz, yani ekleme çıkartma gibi
işlemlerin nasıl yapılmasını bilgisayar/işçinin
bilmesini varsayırız
• Daha önemli algoritmalar, bu temel işlemler
üstünde olan ve daha zor problem çözen
algoritmalardır
Arama
• Arama, bunun gibi hem matematik hem
bilgisayar işlemleri hem de günlük hayat için
çok önemli bir konu
• Örnekler: arkadaşların telefon numarası,
katalogda ürünler, ucağın zaman tablosu, vb
• Arama, algoritma bilimin en önemli
konularından biri dir
Bir boyutlu arama
• Genel arama, “n” nesne arasında bir hedef
nesneyi olup olmadığı söyleme demektir, hedef
varsa onunn pozisyonunu da bulmak gerekir
• Diyoruz ki, “n” nesne dizisi vardır ve bu dizide bir
hedef nesneyi aramamız lazım
• En basit yaklaşımda, hedefi bulmak için dizideki
bütün nesnelerin incelenmesi gerekir, yani
ortalama n/2 incelenme işlemi yapılmalı
2
5
7
11
12
13
17
22
23
30
Bir boyutlu arama
• Sıralanmış dizi varsa, arama daha dah çok hızlı
gerçekleştirilebilir
• Sıralanmış dizi demek ki, nesneler veya
dizideki sayılar bir şekilde sıralanmıştır, en
küçük en büyüğe kadar artmakta
2
5
7
11
12
13
17
22
23
30
Bir boyutlu arama
• İkiye bölme algoritmanın ana fikri, ilk adımda
dizinin ortasına bakmaktır
• Eğer ortasında var olan sayı hedeften büyük
ise, dizi sıralanmış olduğu için, hedef dizinin
sadece sol yarısında olabilir, aksi halde – sağ
yarısında olmalıdır
İkiye bölme araması...
2
5
7
11
12
13
17
hedef
22
23
30
aramasının sırası
Bir boyutlu arama
• Öyleyse, ikinci adımda arama sol veya sağ
yarısında devam eder
• İlişkili taraftaki orta sayısının hedeften daha
büyük veya daha küçük olmasına göre, arama
tekrar kalan dizinin parçasının yada sol yada
sağ yarısında devam eder
İkiye bölme araması...
2
5
7
11
12
13
17
hedef
22
23
30
aramasının sırası
Bir boyutlu arama
• İkiye bölme sıralanmış dizide hedefi çok hızlı
bulmaya fırsat sağlar çünkü kalan nesnenin
sayısı her zaman iki kat azalır
• Örnek n=1000 sayı, ilk adımda dizinin ortasına
bakınca yada alt yada üst yarısında devam
ederiz, yani hedef için olabilir nesne sayısı 500
nesnedir
İkiye bölme araması...
2
5
7
11
12
13
17
hedef
22
23
30
aramasının sırası
Bir boyutlu arama
• İkinci adımda o yarısında çalışırken ortasına
bakıyoruz, ve hedefin yeni yada alt yada üst
yarısında olmasını öğreniyoruz, yani şimdi
kalan nesne sayısı 250
• Üçüncü adımda kalan nesne sayısı 125
İkiye bölme araması...
2
5
7
11
12
13
17
hedef
22
23
30
aramasının sırası
Bir boyutlu arama
• 4. adımda, kalan nesne sayısı 65
• 5. adımda, kalan nesne sayısı 33
• 6. adımda, kalan nesne sayısı 17
İkiye bölme araması...
2
5
7
11
12
13
17
hedef
22
23
30
aramasının sırası
Bir boyutlu arama
•
•
•
•
•
7. adımda, kalan nesne sayısı 9
8. adımda, kalan nesne sayısı 5
9. adımda, kalan nesne sayısı 3
10. adımda, kalan nesne sayısı 2
11. adımda, kalan nesne sayısı 1, ve hedefi
bulmaya garanti var
İkiye bölme araması...
2
5
7
11
12
13
17
hedef
22
23
30
aramasının sırası
Bir boyutlu arama
• Yani, 1000 nesne arasında biri bulmak için en
çok 10 adım gerekliliği garantisi vardır
• Bütün dizi incelersek, en çok 1000 adım
gerekebilirdi
• Bu yüzden sıralanmış dizinde ikiye bölme
kullanarak arama çok hızlı yapılabilir
İkiye bölme araması...
2
5
7
11
12
13
17
hedef
22
23
30
aramasının sırası
Bir boyutlu arama
• İkiye bölme algoritması, sadece sayısal diziler
için değil, çok genel durumda faydalı olabilir
İkiye bölme araması:
Bir boyutlu arama
• Sözlükler, sıralanmış bilgi deposudur, yani birçok
kelime içeren sıralanmış dizi; sözlükte gereken
kelimeyi bulmak için ikiye bölme kullanılabilir
– İlk önce sözlüğün ortasına bakmamız lazım, oradaki
kelimelerin daha “büyük” yada daha “küçük” olmasını
öğrenmemiz lazım; ona göre arama yada ilk yada son
sözlüğün yarısında devam edilebilir, vb
İkiye bölme araması:
Bir boyutlu arama
• Ürün katalogları da düzenli şekilde ürün içerir;
kataloglarda gereken ürünü bulmak için, ikiye
bölme yöntemi kullanılabilir
– İlk önce katalogunun ortasına bakmamız lazım,
oradaki ürünün daha “büyük” yada daha “küçük”
olmasını öğrenmemiz lazım; ona göre arama yada
ilk yada son katalogun yarısında devam edilecektir
İkiye bölme araması:
Bir boyutlu arama
• Telefon kıtapları da sıralanmış diziler, yani
arkadaşınızın numarasını bulmak için en hızlı
yöntem şudur: önceden telefon kıtabının
ortasına bakmak sonra yada ilk yada son
yarısında aramaya devam etmektir
İkiye bölme araması:
Bir boyutlu arama
• Gördüğümüz gibi, ikiye bölme algoritması
önemli genel arama yöntemidir
İkiye bölme araması:
Bir boyutlu arama
İkiye bölme arama algoritması
giriş nesne dizisi, D olsun
hedef nesnesi, H olsun
D’nin ortasındaki nesnesi, A olsun
A H’ye eşit değil ve D’nin boyut 1’den büyük İKEN
EĞER A H’den büyük İSE
yeni D D’nin sol yarısı olsun
AKSİ HALDE
yeni D D’nin sağ yarısı olsun
D’nin ortasındaki nesnesi, A olsun
Eğer A H’ye eşit değil İSE
Hedef bulunamadı
Çok boyutlu arama
• Aramanın ikinci önemli örnek, KD-arama
algoritmasıdır
• KD-arama “K-Dimensional search” (yani Kboyutlu arama) demektir
• KD-arama, birçok boyutlu verilerde verimli
arama için bir yöntemdir
Çok boyutlu arama
• Bir boyutlu arama - sözlük yada kitapta arama
olarak düşünülebilir, yani bir kelime/isim
kullanarak bir sırada düzenlenmiş kayıtlar
arasında bir kayıdı bulmak için
Çok boyutlu arama
• Çok boyutlu arama, birkaç kategoriye göre
düzenlenmiş kütüphane katalogu olarak
düşünülebilir
• Yani, tüm belgelere birkaç kategoriden
(edebiyet türü, ülke, yazar, vb) anahtar
kelimeleri atanmış durumda belirli anahtarlara
göre hedef belgenin yerini bulmak lazım
Çok boyutlu arama
• İkiye bölme, “bir boyutlu” arama için efektif
yöntemdir
• KD-arama, “birçok boyutlu” aramada
kullanılan ve ikiye bölmeye benzer bir
yöntemdir
Çok boyutlu arama
2. kategori anahtar
Eğer 1. kategorinin bütün anahtarları bir eksene 2.
kategorinin anahtarları 2. eksene koyarsak, tüm belgeler bu
şekilde 2 boyutlu uzayında bir nokta olarak temsil
edilecektir, yani “belge (anahtar1,anahtar2) “
(anahtar1,anahtar2)
1. kategori anahtar
Çok boyutlu arama
2. boyut
KD-arama; 1. adım: bütün belgeleri 1. anahtara göre iki
kümeye bölünce hedef hangi bölümde olması lazım?
A
B
1. boyut
Çok boyutlu arama
2. adım: tüm belgeleri 2. anahtara göre iki kümeye
bölünce hedef hangi bölümde olması lazım?
2. boyut
C
D
1. boyut
Çok boyutlu arama
İkiside birlikte, hangi bölüm yapar?
II
III
IV
2. boyut
I
1. boyut
Çok boyutlu arama
Yani, farklı eksenleri sırayla ikiye bölüp hedefin hangi bölgede
olmasını belirleyip belge sayısını her zaman 2’ye azaltırız
II
III
IV
2. boyut
I
1. boyut
Çok boyutlu arama
2 adımdan sonra, kalan belge sayısı 4 kat düşük, 4 adımdan sonra
- 16 kat, 10 adımdan sonra - 1,000 kat düşüktür
II
III
IV
2. boyut
I
1. boyut
Çok boyutlu arama
20 adımdan sonra – kalan belge sayısı 1,000,000 kat düşüktür
II
III
IV
2. boyut
I
1. boyut
Çok boyutlu arama
KD arama
• Bir belge kümesi vardır, bütün belgelere K
kategoriye göre anahtar kelimeleri atanmıştır,
belge: (anahtar1, anahtar2,anahtar3,...)
• Hedef belgesinin yerini bulmak için, hedef
belgesinin anahtarları kullanılır
hedef: (anahtar1, anahtar2,anahtar3,...)
Çok boyutlu arama
• Hedefi bulmak için, ilk önce belgeler 1. anahtara
göre iki bölgeye bölünür (mesela, bütün var olan
1. anahtarların orta noktasına göre belgeler
küçükler ve büyüklere bölünür)
• Hedef 1. anahtarını kullanarak hedefin hangi
bölgede olduğu öğrenilir; dolayısıyla o bölgede
var olan belgeler elde tutulur (böyle taranacak
belge sayısı 2 kat azaltılır)
Çok boyutlu arama
• Kalan belgeler 2. anahtara göre iki bölgeye
bölünür (yani bütün var olan 2. anahtarların orta
noktasına göre küçükler ve büyüklere bölünür)
• Hedef 2. anahtarına göre hedefin hangi bölgede
olduğu öğrenilir; dolayısıyla sadece o bölgede
olan belgeler elde tutulur (yeni tekrar belge
sayısı 2 kat azaltılır)
• Devam...
“KD arama” (K boyutlu arama)
giriş belge dizisi, B olsun
bütün kategorilerin anahtarlarının değişim aralıkları, A olsun // yani K tane
M, 1. kategori olsun
B’nin boyut 1’den büyük İKEN
hedefin k. anahtarı, H olsun
M. A aralığının ortası, O olsun
EĞER O H’den büyük İSE
yeni B, O’dan küçük M. anahtara sahip olan B’deki tüm belgeler olsun
yeni M. A aralığı kendinin alt yarısı olsun
AKSI HALDE
yeni B, O’dan büyük M. anahtara sahip olan B’deki tüm belgeler olsun
yeni M. A aralığı kendinin alt yarısı olsun
yeni M sonraki kategori olsun