Algoritma Geliştirme ve Veri Yapıları – 9 Ağaç Veri Modeli ve Uygulaması Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması • Ağaç, verilerin birbirine sanki bir ağaç yapısı oluşturuyormuş gibi sanal olarak bağlanmasıyla elde edilen hiyararşik yapıya sahip bir veri modelidir. • Kullanım yerleri: o Kodlama/kod çözme işlemleri o Dosya sistemi o Oyunların olası hamleleri o Sıralı verilerin hızlı aranması gibi.. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması • Her ağacın bir kök işaretçisi vardır, herhangi bir düğüm eklenmemiş ise NULL değerini alır. • Kök işaretçisine bağlı olan düğüm kök(root) olarak adlandırılır, ağaç bunun etrafında serpilir. • Kendisine hiçbir bağlantı yapılmayan düğümler yaprak(leaf) olarak adlandırılır. Kök ve yaprak dışındaki düğümlere ara düğüm denilir. • Ağacın herhangi bir dalı kesildiğinde ortaya alt-ağaç çıkar; bir ağaç veya alt-ağaç birçok alt-ağacın birleşmesinden oluşabilir ve alt-ağacın kendisi de ağaç özelliğindedir(rekürsif programlamaya uygundur). Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması • Genel olarak, veri ağacın düğümlerinde tutulur. Dallar ise düğümlerin birbirleriyle bağlantısını gösterir. • Örnek ağaç üzerindeki kök, A, B ve C düğümlerinin durumu şöyledir: Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Tanım Düğümler Kök A B C Derece/Çocuk 2 1 0 2 Kardeş Düğüm 1 2 1 2 Düzey 1 3 6 3 Aile Yok d2 d26 d3 Ata Yok Kök (d1) d13, d7, d3, kök Kök (d1) Yol d1 (Kök düğümden) d1, d1, d3, d2, d4 d7, d13, d26, d52 d1, d3, d7 Derinlik 1 3 6 3 Yükseklik 6 2 1 4 Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması • Ağaç Türleri: o İkili Arama Ağacı: Bir düğüm en fazla iki tane çocuğa sahip olabilir ve alt/çocuk bağlantıları belirli bir sırada yapılır. o Kodlama Ağacı: Bir alfabedeki veya daha genel olarak bir kümedeki karakterlere kod atanması için kurulan ağaç şeklidir. o Sözlük Ağacı: Bir sözlükte bulunan sözcüklerin tutulması için kurulan bir ağaç şeklidir. Amaç, arama işleminin en performanslı bir şekilde yapılmasıdır. Sözlük ağaçları bir araya gelip sözlük ormanını oluşturur. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması o Kümeleme Ağacı: Bir çeşit sıralama ağacıdır; aslında ikili arama ağacı da sıralama ağacıdır. Ancak kümeleme ağacında çocuk düğümler her zaman aile düğümünden daha küçük değerlere sahip olur(yada tersi olabilir). Dolayısıyla kök düğüm en büyük değere sahip olurken yaprak türleri kendi ailesi içerisinde en küçük değerlere sahip olurlar. o Bağıntı Ağacı: Bir matematiksel bağıntının ağaç şeklinde tutulması için tanımlanmış bir ikili ağaç uygulamasıdır. Bağıntı ağacının yapraklarda değişkenler veya sabit değerler bulunurken, kök ve ara düğümlerde de işlem değeri olan simgeler(operatörler) bulunur. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Ağacın Bellekte Tutulması: • Ağacın bilgisayar belleğinde tutulması için “indis-bağlantısı” veya “düğüm-bağlantısı” yöntemleri kullanılmaktadır. • İndis-bağlantısı yaklaşımında ağacın düğümleri bir dizi üzerinde tutulurlar; dizinin ilk elemanı kök olup alt hiyerarşideki diğer düğümlere bir bağlantı uyarınca erişilir. • İndis-bağlantısı, bir düğümün çocuklarına erişmek için gerekli indisi o andaki aile düğümün indis değerine göre hesaplamada kullanılır. Böylece hiçbir bağlantı bilgisi kullanılmadan bir düğümde onun herhangi bir çocuğuna indis hesabı yapılarak erişilebilir. • Düğüm-bağlantısı olan yöntemde düğümler arası bağlantılar veri yapısı içerisine eklenmiş olan işaretçi değişkenler aracılığıyla sağlanır. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması İndis-Bağlantısı Yaklaşımında Veri Yapısı • Ağacın indis-bağlantısına göre bellekte tutulması düğümlerin veri kısmının bir dizi üzerinde tutulması kavramına dayanır. • Dizinin ilk elemanı ağacın köküdür. Daha sonraki elemanlar ağaç hiyerarşisi üzerindeki herhangi bir düğüme karşılık düşer. Ancak dizinin ikinci ve üçüncü elemanları kök düğümün çocuklarıdır; daha sonraki, yani dördüncüden sonraki düğümler için ağacın derecesi bilinmelidir. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması İndis-Bağlantısı Yaklaşımında Veri Yapısı • İkili ağaç (derecesi 2) 0 1 2 3 4 5 6 7 8 9 10 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 • Indissol(j)=2j+1 Mustafa Kemal Üniversitesi Indissag(j)=2j+2 11 12 13 14 Ağaç Veri Modeli ve Uygulaması Düğüm-Bağlantısı Yaklaşımında Veri Yapısı • Bu yaklaşımda tutulan yol her bir bağlantı için birer bağlantı bilgisi tutulmasıdır. struct ikili{ Veri kısmı; İşaretçiTipi sol,sağ; }AGAC2; • İkili ağaç için veri yapısı içerisindeki bilginin yanı sıra 2 adet işaretçi olmalıdır(m-dereceli için m tane işaretçi) Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Düğüm-Bağlantısı Yaklaşımında Veri Yapısı • MbellekAlanı= sizeof(Veri Yapısı) + sizeof(2 adet bağlantı) • Bağlantıları tutacak olan işaretçiler 4 Byte ise ikili bir ağaçta 8 Byte sadece bağlantıları göstermek için kullanılır. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Huffman Kodlama Ağacı • Kodlama ağacına dayanılarak değişen uzunluktaki kod ataması, özellikle veri sıkıştırma algoritmalarında kullanılan bir yöntemdir. Bu amaçla Huffman, ShannonFano gibi birçok kodlama ağacı şekli geliştirilmiştir. • Kodlama tablosunda kod uzunluğu log2N bağıntısından hesaplanır. N=4 için log24=2 bulunur. Genişletilmiş ASCII tablosu için (256 karakter) log2256=8 elde edilir. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Huffman Kodlama Ağacı Karakter Kod A 00 B 01 C 10 D 11 • Kodlama ağacı karakterlerin kullanım sıklığına göre oluşturulur. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması • BABACABA karakterlerinin her biri bellekte 8 bitlik yer kaplar, 8x8=64 bit=8 byte. • Huffman ile elde edilen sonuçlara göz atalım: A=0, B=10, C=110, D=111 yazılırsa 10 0 10 0 110 0 10 0 olur. 1001001100100 = 13 bit! • Tablodaki değerlerle yapılmış olsaydı her biri 2 bit olmak üzere 2x8=16 bit=2 byte yer kaplamış olacaktı. • Yöntem en çok kullanılan elemanın en düşük boyutlu bit ile temsil edilmesi üzerine kurulmuştur. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması İkili Ağaçlar ve İkili Arama Ağacı • İkili ağaçlarda bir düğümün derecesi en fazla iki olabilir, yani en fazla iki tane çocuk bağlantısı olabilir. • İkili arama ağacına bir düğüm eklenirken ağacın soluna mı, sağına mı ekleme yapılacağı düğümün veri alanı içerisindeki anahtar sözcüğe bakılarak yapılır. Bu konudaki genel yaklaşım, anahtar veri aile düğümünden küçük ise soluna büyük ise sağına eklemektir. Eğer anahtar veri sözce(string) ise alfabetik olarak önce geliyorsa soluna, sonra geliyorsa sağına eklenir. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması • Bağıntı ağaçları da ikili ağaç şeklindedir; bağıntı ağacında amaç bir matematiksel bağıntıya ait operatör, değişken ve sabitleri bağıntıyı ifade edecek şekilde ikili ağaç üzerinde tutmaktır. • İkili ağaçtaki bir düğüme ait veri yapısında veriye ek olarak iki tane işaretçi tutulur; biri sol diğeri sağ olarak adlandırılan bu işaretçilere düğümün çocukları bağlanır. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması İkili Ağaç Üzerinde Dolaşma • İkili ağaç üzerinde öncekök(preorder), ortadakök(inorder) ve sonrakök(postorder) olmak üzere üç farklı dolaşma şekli uygulamalara çözüm olmaktadır. Mustafa Kemal Üniversitesi Önce-Kök: PAPATYA Ortada-Kök: PAAPYTA Sonra-Kök: PAAYATP Ağaç Veri Modeli ve Uygulaması o Önce-Kök(preorder): Kök, Sol, Sağ o Ortada-Kök(inorder): Sol, Kök, Sağ o Sonra-Kök(Postorder): Sol, Sağ, Kök • Önce-kök yaklaşımında önce ağacın kökü, sonra sol altağaç ve ardından sağ altağaç • Ortada-kökte ise, önce sol altağaç, kök ve sağ altağaç • Sonra-kökta ise, önce sol altağaç, sonra sağ altağaç ve kök dolaşılır. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Sonra-Kök Önce-Kök Ortada-Kök Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Bağıntı Ağaçları Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması Bağıntı Ağaçları • Bir matematiksel bağıntının ağaç şeklinde tutulması için tanımlanmış bir ikili ağaç uygulamasıdır. Birçok derleyici, program içerisindeki denklemleri, bağıntı ağacı aracılığıyla ayrıştırır ve karşılığı olan kodları üretir. • Bağıntı ağacı üç farklı yöntem ile çıkarılabilir: iç-takı, ön-takı ve son-takı. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması • İç-takı (İnfix) Bağıntı ağacının iç-takı yöntemine göre değerlendirilmesi, bir önceki sayfada verilen örneklerde görüldüğü gibi, matematikte alışılagelen şekilde, operatörlerin ortada, değişken veya sabit değerlerin operatörün kenarlarında bulunması şeklinde yapılır. Değerlendirmeye iki çocuğu da yaprak (yani parametreleri hazır; işleme hazır) olan en soldaki altağaçtan başlanır ve sağa doğru, sırasıyla, yine çocukları yaprak olan altağaçlar ele alınarak bağıntı değerlendirilir. • Ön-takı (Prefix) ve Polonyalı Notasyonu Ön-takı yönteminde operatörler kendilerine karşı düşen parametrelerin (değişken veya sabit değerler) önündedir. Ön-takı yöntemi ikili ağaç üzerinde önce-kök dolaşması gibidir. • Son-takı (Postfix) Son-takı yöntemi ters Polonyalı notasyonu (reverse Polish notation) olarak da adlandırılır ve operatörler kendi parametrelerinin arkasından gelir. Ön-takı ve sontakı yönteminin en önemli özelliği bağıntıların parantez kullanılmadan gösterilebilmesidir. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması İkili Arama Ağacı • İkili arama ağaçları arama işleminin yoğun olduğu uygulamalarda ilk başvurulan veri modelleridir; arama işleminde kullanılacak anahtar sözcüğe bağlı olarak bir veya birden fazla ikili arama ağacı kurularak arama işlemi logN mertebesinde yapılır. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması 6 eklenmesi 11 eklenmesi 38 eklenmesi Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması İkili Arama Ağacı Uygulaması • Ağacın herhangi bir düğümünde bir tamsayı ve bir de 100 karakterlik bir mesaj tutulacaktır, bunlara ek olarak biri sağ diğeri sol olmak üzere iki adet işaretçiye de sahip olmalıdır. Böyle bir düğümün veri yapısı; struct topluluk{ int bilgi; char mesaj[100]; struct topluluk *sol,*sag; }AGAC2; AGAC2 *kok=NULL; Mustafa Kemal Üniversitesi AGAC2 bilgi mesaj sol sag Ağaç Veri Modeli ve Uygulaması • Bu aşamada bir ikili ağaç oluşmuş olur. Ancak içerisinde hiçbir düğüm yoktur. İlk yapılacak işlem ağaca düğüm ekleyecek algoritmanın tasarlanmasıdır. Bunun içinde her şeyden önce sıralamada kullanılacak olan anahtar sözcüğün belirlenmesidir. Bu örnekte, türü tamsayı olan bilgi adlı değişken anahtar veri olarak seçilmiştir. Dolayısıyla ikili ağaç üzerindeki ekleme, silme, arama gibi işlemler bu anahtar sözcük üzerinden gerçekleştirilecektir. Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması /* Düğüm Ekleme Fonksiyonu */ void ekle(AGAC2 *agacKok, AGAC2 *eklenen) { if(agacKok==NULL) kok=eklenen; else { if(eklenen->bilgi <= agacKok->bilgi) { if(agacKok->sol==NULL) agacKok->sol=eklenen; else ekle(agacKok->sol, eklenen); } else { if(agacKok->sag==NULL) agacKok->sag=eklenen; else ekle(agacKok->sag, eklenen); } } } Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması /* Listedeki tüm kayıtları listeleme */ void listele(AGAC2 *agacKok) { if(agacKok=!NULL) { listele(agacKok->sol); yazEkrana(agacKok); listele(agacKok->sag); } } /* Ağaç üzerinde bir kayıt arama */ AGAC2 *ara(AGAC2 *agacKok, int aranan) { while(agacKok!=NULL && agacKok->bilgi!=aranan) { if(aranan <= agacKok->bilgi) agacKok=agacKok->sol; else agacKok=agacKok->sag; } return agacKok; } Mustafa Kemal Üniversitesi Ağaç Veri Modeli ve Uygulaması 7’nin Çıkarılması 23’ün Çıkarılması Mustafa Kemal Üniversitesi 5’in Çıkarılması Ağaç Veri Modeli ve Uygulaması /* İkili ağaç üzerindeki düğüm sayısını sayar*/ int sayAgacDugum(AGAC2 *agacKok, int miktar) { if(agacKok==NULL) return miktar; miktar++; miktar=sayAgacDugum(agacKok->sol, miktar); miktar=sayAgacDugum(agacKok->sag, miktar); return miktar; } Mustafa Kemal Üniversitesi