Bölüm 6. Karma - Olcay Taner Yildiz Home Page

advertisement
Bölüm 6. Karma
Olcay Taner Yıldız
2014
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
1 / 31
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
Karma Tablosu
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
2 / 31
5 eleman içeren örnek bir karma tablosu
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
0
1
71
2
9
3
423
4
11
5
6
76
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
3 / 31
Tam sayılar içeren karma tablosu tanımı
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
public class Karma{
Ornek[] tablo ;
boolean[] silindi ;
int N;
public Karma(int N){
tablo = new Ornek[N];
silindi = new boolean[N];
this.N = N;
}
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
4 / 31
Tamsayılar için kullanılabilecek örnek bir
karma fonksiyonu
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
1
2
3
int karma(int sayi){
return sayi % N;
}
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
5 / 31
Katarlar (karakter dizileri) için
kullanılabilecek örnek bir karma fonksiyonu
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
1
2
3
4
5
6
7
8
int karma(String katar){
int i, pozisyon = 0;
for (i = 0; i < katar.length; i ++){
pozisyon = 39 * pozisyon + katar.charAt(i );
}
pozisyon = pozisyon % N;
return pozisyon;
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
6 / 31
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
Bağlı Liste ile Karma Tablosu Tanımı
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
7 / 31
Her elemanı bir bağlı liste olan örnek bir
karma tablosu
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
0
10
1
71
1
4
64
14
5
75
6
36
6
49
29
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
2
3
24
7
8
9
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
19
8 / 31
Her elemanı bir bağlı liste olan karma
tablosu tanımı
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
11
public class Karma{
Liste [] tablo ;
int N;
public Karma(int N){
int i;
tablo = new Liste[N];
for (i = 0; i < N; i ++)
tablo [ i ] = new Liste ();
this.N = N;
}
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
9 / 31
Her elemanı bağlı liste olan bir karma
tablosunda bir sayı arama
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
1
2
3
4
5
Eleman karmaAra(int icerik){
int adres;
adres = karma(icerik);
return tablo[adres].listeAra( icerik );
}
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
10 / 31
Her elemanı bağlı liste olan bir karma
tablosuna yeni bir eleman ekleme
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
1
2
3
4
5
void karmaEkle(Eleman eleman){
int adres;
adres = karma(eleman.icerik);
tablo [adres]. listeyeEkle (eleman);
}
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
11 / 31
Her elemanı bağlı liste olan bir karma
tablosundan bir elemanı silme
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
1
2
3
4
5
6
7
8
void karmaSil(int icerik){
Eleman eleman;
int adres;
adres = karma(icerik);
eleman = tablo[adres]. listeAra ( icerik );
if (eleman != null)
tablo [adres]. listedenSil (eleman);
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
12 / 31
Karma Tablosu İşlemleri (Bağlı Liste)
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Arama: O(1)
● Ekleme: O(1)
● Silme: O(1)
●
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
13 / 31
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
Açık Adresleme
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
14 / 31
Doğrusal strateji ile düzenlenmiş açık
adreslemeli bir karma tablosu
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
49
0
1
49
49
58
58
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
69
2
3
4
5
6
7
8
9
89
18
18
18
18
89
89
89
89
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
15 / 31
Karma tablosunda bir sayı arama (doğrusal
strateji)
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
Ornek karmaAra(int icerik){
int adres;
adres = karma(icerik);
while (tablo[adres] != null){
if (!( silindi [adres]) && tablo[adres]. icerik == icerik )
break;
adres = (adres + 1) % N;
}
return tablo[adres];
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
16 / 31
Karma tablosunda yeni bir eleman ekleme
(doğrusal strateji)
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
1
2
3
4
5
6
7
8
9
void karmaEkle(Ornek ornek){
int adres;
adres = karma(ornek.icerik);
while (tablo[adres] != null && !( silindi [adres]))
adres = (adres + 1) % N;
if (tablo [adres] != null)
silindi [adres] = false;
tablo [adres] = ornek;
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
17 / 31
Karma tablosundan eleman silme (doğrusal
strateji)
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
void karmaSil(int icerik){
int adres;
adres = karma(icerik);
while (tablo[adres] != null){
if (!( silindi [adres]) && tablo[adres]. icerik == icerik )
break;
adres = (adres + 1) % N;
}
silindi [adres] = true;
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
18 / 31
İkinci derece strateji ile düzenlenmiş açık
adreslemeli bir karma tablosu
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
49
0
49
49
58
58
1
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
2
69
3
4
5
6
7
8
9
89
18
18
18
18
89
89
89
89
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
19 / 31
Çift karma strateji ile düzenlenmiş açık
adreslemeli bir karma tablosu
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
69
0
1
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
2
58
58
49
49
49
18
18
18
18
89
89
89
89
3
4
5
6
7
8
9
89
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
20 / 31
Karma Tablosu İşlemleri (Dizi)
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Arama: O(1)
● Ekleme: O(1)
● Silme: O(1)
●
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
21 / 31
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
Tekrar Karma
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
22 / 31
Önceki şekildeki karma tablosunun tekrar
karılması
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
0
Açık Adresleme
1 71
Tekrar Karma
2
Uygulama: Hedef
Tahtası
3 423
Uygulama: Karma
Dizini
4
5
6 76
7
8
9 9
10
11 11
12
13
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
23 / 31
Bir karma tablosunu tekrar karma
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
11
12
13
14
15
16
17
void tekrarKarma(){
int i;
Ornek[] tablo ;
boolean[] silindi ;
tablo = new Ornek[N];
silindi = new boolean[N];
for (i = 0; i < N; i ++){
tablo [ i ] = this.tablo[i ];
silindi [ i ] = this. silindi [ i ];
}
this.tablo = new Ornek[2 * N];
this. silindi = new boolean[2 * N];
N = 2 * N;
for (i = 0; i < N / 2; i ++)
if (tablo [ i ] != null && !silindi [ i ])
karmaEkle(tablo[i ]);
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
24 / 31
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
Uygulama: Hedef Tahtası
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
25 / 31
Hedef tahtası probleminin geniş arama
yöntemiyle çözümü (1)
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
11
12
13
String hedefTahtasi(int[] tahta){
int i, t ;
String a;
Eleman e;
Kuyruk k;
Ornek o;
Karma kt;
e = new Eleman(0, "");
k = new Kuyruk();
k.kuyrugaEkle(e);
o = new Ornek(0);
kt = new Karma();
kt .karmaEkle(o);
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
26 / 31
Hedef tahtası probleminin geniş arama
yöntemiyle çözümü (2)
Karma Tablosu
14
Bağlı Liste ile Karma
15
Tablosu Tanımı
16
Açık Adresleme
17
Tekrar Karma
18
Uygulama: Hedef
19
Tahtası
20
Uygulama: Karma
21
Dizini
22
23
24
25
26
27
28
29
30
31
32
while (!k.kuyrukBos()){
e = k.kuyrukSil ();
if (e.toplam == 100)
return e.atis;
for (i = 0; i < 5; i ++){
t = e.toplam + tahta[ i ];
if (t <=100)
if (kt .karmaAra(t) != null){
a = e. atis ;
a = a + " " + tahta[ i ];
e = new Eleman(t, a);
k.kuyrugaEkle(e);
o = new Ornek(t);
kt .karmaEkle(o);
}
}
}
return null;
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
27 / 31
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
Uygulama: Karma
Dizini
Uygulama: Karma Dizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
28 / 31
Öğrenci bilgilerini (no, ad, soyad) içeren
örnek yapısı
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
public class Ornek{
String ad;
String soyad;
int icerik ;
public Ornek(int no, String ad, String soyad){
this.icerik = no;
this.ad = ad;
this.soyad = soyad;
}
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
29 / 31
Öğrenci dosyasındaki bilgilerle karma
tablosunu doldurmak
Karma Tablosu
1
Bağlı Liste ile Karma
2
Tablosu Tanımı
3
Açık Adresleme
4
Tekrar Karma
5
Uygulama: Hedef
6
Tahtası
7
Uygulama: Karma
8
Dizini
9
10
11
12
13
14
15
16
17
18
19
Karma dosyaOku(){
Scanner dosya;
Ornek e;
String ad;
String soyad;
int no, yas, i , sayi ;
Karma k;
dosya = new Scanner(new File("ogrenci.txt"));
sayi = dosya.nextInt ();
k = new Karma();
for (i = 0; i < sayi ; i ++){
no = dosya.nextInt ();
ad = dosya.next();
soyad = dosya.next();
e = new Ornek(no, ad, soyad);
k.karmaEkle(e);
}
return k;
}
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
30 / 31
Numarası 18 olan öğrencinin ad ve soyadını
bulan karma dizini kullanarak fonksiyon
Karma Tablosu
Bağlı Liste ile Karma
Tablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: Hedef
Tahtası
1
2
3
4
5
6
void sorgu(Karma k){
Ornek o;
o = k.karmaAra(18);
System.out.print(o.ad);
System.out.print(o.soyad);
}
Uygulama: Karma
Dizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013
31 / 31
Download