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