bölüm 6. karma - haydut.isikun.edu.trhaydut.isikun.edu.tr/veriyapilari-sunum/karma.pdf · karma...
TRANSCRIPT
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 1 / 31
Bölüm 6. Karma
Olcay Taner Yıldız
2014
Karma Tablosu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 2 / 31
5 eleman içeren örnek bir karma tablosu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 3 / 31
6 76
5
4 11
3 423
2 9
1 71
0
Tam sayılar içeren karma tablosu tanımı
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 4 / 31
1 public class Karma{2 Ornek[] tablo ;3 boolean[] silindi ;4 int N;5 public Karma(int N){6 tablo = new Ornek[N];7 silindi = new boolean[N];8 this.N = N;9 }
10 }
Tamsayılar için kullanılabilecek örnek birkarma fonksiyonu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 5 / 31
1 int karma(int sayi){2 return sayi % N;3 }
Katarlar (karakter dizileri) içinkullanılabilecek örnek bir karma fonksiyonu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 6 / 31
1 int karma(String katar){2 int i, pozisyon = 0;3 for (i = 0; i < katar.length; i++){4 pozisyon = 39 * pozisyon + katar.charAt(i );5 }6 pozisyon = pozisyon % N;7 return pozisyon;8 }
Baglı Liste ile Karma Tablosu Tanımı
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 7 / 31
Her elemanı bir baglı liste olan örnek birkarma tablosu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 8 / 31
9 49 29 19
8
7
6 36 6
5 75
4 64 14 24
3
2
1 71 1
0 10
Her elemanı bir baglı liste olan karmatablosu tanımı
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 9 / 31
1 public class Karma{2 Liste [] tablo ;3 int N;4 public Karma(int N){5 int i;6 tablo = new Liste[N];7 for (i = 0; i < N; i++)8 tablo [ i ] = new Liste ();9 this.N = N;
10 }11 }
Her elemanı baglı liste olan bir karmatablosunda bir sayı arama
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 10 / 31
1 Eleman karmaAra(int icerik){2 int adres;3 adres = karma(icerik);4 return tablo[adres].listeAra( icerik );5 }
Her elemanı baglı liste olan bir karmatablosuna yeni bir eleman ekleme
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 11 / 31
1 void karmaEkle(Eleman eleman){2 int adres;3 adres = karma(eleman.icerik);4 tablo [adres]. listeyeEkle (eleman);5 }
Her elemanı baglı liste olan bir karmatablosundan bir elemanı silme
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 12 / 31
1 void karmaSil(int icerik){2 Eleman eleman;3 int adres;4 adres = karma(icerik);5 eleman = tablo[adres]. listeAra ( icerik );6 if (eleman != null)7 tablo [adres]. listedenSil (eleman);8 }
Karma Tablosu Islemleri (Baglı Liste)
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 13 / 31
● Arama: O(1)● Ekleme: O(1)● Silme: O(1)
Açık Adresleme
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 14 / 31
Dogrusal strateji ile düzenlenmis açıkadreslemeli bir karma tablosu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 15 / 31
9 89 89 89 89 89
8 18 18 18 18
7
6
5
4
3
2 69
1 58 58
0 49 49 49
Karma tablosunda bir sayı arama (dogrusalstrateji)
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 16 / 31
1 Ornek karmaAra(int icerik){2 int adres;3 adres = karma(icerik);4 while (tablo[adres] != null){5 if (!( silindi [adres]) && tablo[adres]. icerik == icerik )6 break;7 adres = (adres + 1) % N;8 }9 return tablo[adres];
10 }
Karma tablosunda yeni bir eleman ekleme(dogrusal strateji)
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 17 / 31
1 void karmaEkle(Ornek ornek){2 int adres;3 adres = karma(ornek.icerik);4 while (tablo[adres] != null && !(silindi [adres]))5 adres = (adres + 1) % N;6 if (tablo [adres] != null)7 silindi [adres] = false;8 tablo [adres] = ornek;9 }
Karma tablosundan eleman silme (dogrusalstrateji)
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 18 / 31
1 void karmaSil(int icerik){2 int adres;3 adres = karma(icerik);4 while (tablo[adres] != null){5 if (!( silindi [adres]) && tablo[adres]. icerik == icerik )6 break;7 adres = (adres + 1) % N;8 }9 silindi [adres] = true;
10 }
Ikinci derece strateji ile düzenlenmis açıkadreslemeli bir karma tablosu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 19 / 31
9 89 89 89 89 89
8 18 18 18 18
7
6
5
4
3 69
2 58 58
1
0 49 49 49
Çift karma strateji ile düzenlenmis açıkadreslemeli bir karma tablosu
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 20 / 31
9 89 89 89 89 89
8 18 18 18 18
7
6 49 49 49
5
4
3 58 58
2
1
0 69
Karma Tablosu Islemleri (Dizi)
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 21 / 31
● Arama: O(1)● Ekleme: O(1)● Silme: O(1)
Tekrar Karma
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 22 / 31
Önceki sekildeki karma tablosunun tekrarkarılması
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 23 / 3113
12
11 11
10
9 9
8
7
6 76
5
4
3 423
2
1 71
0
Bir karma tablosunu tekrar karma
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 24 / 31
1 void tekrarKarma(){2 int i;3 Ornek[] tablo ;4 boolean[] silindi ;5 tablo = new Ornek[N];6 silindi = new boolean[N];7 for (i = 0; i < N; i++){8 tablo [ i ] = this.tablo[i ];9 silindi [ i ] = this. silindi [ i ];
10 }11 this.tablo = new Ornek[2 * N];12 this. silindi = new boolean[2 * N];13 N = 2 * N;14 for (i = 0; i < N / 2; i++)15 if (tablo [ i ] != null && !silindi [ i ])16 karmaEkle(tablo[i ]);17 }
Uygulama: Hedef Tahtası
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 25 / 31
Hedef tahtası probleminin genis aramayöntemiyle çözümü (1)
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 26 / 31
1 String hedefTahtasi(int[] tahta){2 int i, t ;3 String a;4 Eleman e;5 Kuyruk k;6 Ornek o;7 Karma kt;8 e = new Eleman(0, "");9 k = new Kuyruk();
10 k.kuyrugaEkle(e);11 o = new Ornek(0);12 kt = new Karma();13 kt .karmaEkle(o);
Hedef tahtası probleminin genis aramayöntemiyle çözümü (2)
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 27 / 31
14 while (!k.kuyrukBos()){15 e = k.kuyrukSil ();16 if (e.toplam == 100)17 return e.atis;18 for (i = 0; i < 5; i++){19 t = e.toplam + tahta[ i ];20 if (t <=100)21 if (kt .karmaAra(t) != null){22 a = e. atis ;23 a = a + " " + tahta[ i ];24 e = new Eleman(t, a);25 k.kuyrugaEkle(e);26 o = new Ornek(t);27 kt .karmaEkle(o);28 }29 }30 }31 return null;32 }
Uygulama: Karma Dizini
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 28 / 31
Ögrenci bilgilerini (no, ad, soyad) içerenörnek yapısı
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 29 / 31
1 public class Ornek{2 String ad;3 String soyad;4 int icerik ;5 public Ornek(int no, String ad, String soyad){6 this.icerik = no;7 this.ad = ad;8 this.soyad = soyad;9 }
10 }
Ögrenci dosyasındaki bilgilerle karmatablosunu doldurmak
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 30 / 31
1 Karma dosyaOku(){2 Scanner dosya;3 Ornek e;4 String ad;5 String soyad;6 int no, yas, i , sayi ;7 Karma k;8 dosya = new Scanner(new File("ogrenci.txt"));9 sayi = dosya.nextInt ();
10 k = new Karma();11 for (i = 0; i < sayi ; i++){12 no = dosya.nextInt ();13 ad = dosya.next();14 soyad = dosya.next();15 e = new Ornek(no, ad, soyad);16 k.karmaEkle(e);17 }18 return k;19 }
Numarası 18 olan ögrencinin ad ve soyadınıbulan karma dizini kullanarak fonksiyon
Karma Tablosu
Baglı Liste ile KarmaTablosu Tanımı
Açık Adresleme
Tekrar Karma
Uygulama: HedefTahtası
Uygulama: KarmaDizini
O. T. Yıldız, C && Java ile Veri Yapılarına Giris, Bogaziçi Üniversitesi Yayınevi, 2013 31 / 31
1 void sorgu(Karma k){2 Ornek o;3 o = k.karmaAra(18);4 System.out.print(o.ad);5 System.out.print(o.soyad);6 }