İkili ağaçlar hiyerarşik verilerin depolanmasında özel bir amaca hizmet ediyor mu? Kanonik kullanımları nedir?


12

İkili ağaçların yapısını ve bunların nasıl geçileceğini anlıyorum. Ancak, programların ve programlamanın gerçek kullanımlarını, amaçlarını gerçekleştirmek için uğraşıyorum. Hiyerarşik verilerin 'gerçek yaşam' örneklerini düşündüğümde neredeyse 2'den fazla çocuğu var. Örneğin, bir soy ağacında, bir annenin genellikle ikiden fazla çocuğu olabilir.

'İkili ağaçlar' diziler ve listeler üzerinde daha hızlı işlem süreleri nedeniyle doğrusal olarak ilgili verileri depolamak için gerçekten yararlı mıdır? Alternatif olarak, hiyerarşik verilerin depolanmasında belirli bir amaca hizmet ediyorlar mı? Eğer öyleyse, ikili ağaçların uygulanmasına ilişkin örnekler vardır. Bir düğümün en fazla 2 çocuğu olacak şekilde hangi veriler var ?


Bence bir ikili ağacın ana kullanımı veri sipariş etmektir. https://en.wikipedia.org/wiki/Binary_search_tree
Mandrill

Yanıtlar:


25

Hayır, ikili ağaçlar düşündüğünüz anlamda hiyerarşik verileri depolamak için değildir. nSabit bir sayı olan n-ary ağaçları için birincil kullanım durumu , semantik bir hiyerarşi değil , hızlı arama özelliğidir .

Bir kişinin 1 ile 100 arasında bir sayı düşündüğü ve diğerinin bunu olabildiğince az tahminde tahmin etmesi gereken eski oyunu hatırlayın ve yanlış tahmin ederseniz, sayıyı düşünen kişi size de yüksek mi yoksa çok düşük mü? Bir süre sonra sıkıcı oluyor çünkü hızlı bir şekilde her zaman 50'den başlayıp 25 veya 75'e gitmeniz gerektiğini anlıyorsunuz ve bundan sonra her yeni tahminle aranacak aralığı ikiye bölmeye devam ediyorsunuz ve sonunda herhangi bir sayıyı tahmin edebilirsiniz en fazla 7 tahminde, garantili.

Eğlenceli bir oyun yapmayabilir, ancak bu özellik ikili (ve diğer n-ary) ağaçları kullanışlı kılan şeydir: bunları çok az bir sürede çok büyük bir veri kümesini aramak için kullanabilirsiniz.


Mükemmel cevap çok teşekkür ederim. Yani, ikili ağaçların gerçekten bir dizi veya listede olduğu gibi veri depolamak için başka bir yapı, ama hızlı arama yetenekleri ek avantajı ile?
sw123456

1
@ sw123456: Doğru. Herhangi bir mühendislikte olduğu gibi, aynı sayıda öğeye sahip bir diziden daha fazla (ve daha fazla parçalanmış - bellek kullanır) bellekler ile birlikte gelir, O (n) O (1) yerine veri kümesinin #n öğesine erişim ancak hızlı arama kesinlikle ikili ağaçların en büyük yararıdır.
Mason Wheeler

@ sw123456 Açıklamak yardımcı olabilir sevindim :)
Mason Wheeler

3
Ağaç dengelendiğinde elemanlara erişim O (log (n)) şeklindedir. O (n) dejenere olduğunda en kötü durum olacaktır (sadece bir braketli çoğu düğüm).
Mandrill

@ sw123456 Ağ yönlendirmesi, Trie (sorun etki alanı için daha fazla verimlilik için yaratılmış) adı verilen bir ikili ağacın küçük bir değişikliğini kullanır. Yönlendiriciler, paketi nereye yönlendirmesi gerektiğini bulmak için bir IP adresi ararken, ağacı birer birer gezdiğinden hiyerarşi bilgilerini depolar. IP adresleri de doğası gereği hiyerarşiktir, bu nedenle en uzun önek eşleşmesini bulmak için bir IP'de geçiş yaparken, yönlendirici IP hiyerarşisini, alt ağ IP'lerini vb. Geçmektedir. Anlamsal olarak açık değildir, ancak ilişki oradadır. Yönlendiriciler, Mason'un cevapladığı gibi arama verimliliği için bu yapıyı kullanır.
Chris Cirefice

3

Bir düğümün sınırsız sayıda çocuğa sahip olabileceği herhangi bir ağaç yapısı, ikili bir ağaç kullanılarak uygulanabilir.

Ağacınızdaki her düğüm için, sağ ve sol işaretçi olan bir düğümle değiştirin. Sol işaretçi düğümün ilk çocuklarına gider. Sağ düğüm, düğümün bir sonraki kardeşine gider. Belirli bir düğümün tüm çocukları, sağ işaretçileriyle birleştirilen bağlantılı bir listededir ve listenin başı ebeveynlerinin sol işaretçisine işaret eder.

Karmaşık, n-ary ağacınız basit, ikili bir ağaç haline geldi.

Eminim bu Knuth, Vol. 1 bir yerde.


Bu gerçekten ilginç bir uygulama. Her alt düğümün bağlantılı bir listenin başlangıcı olması nedeniyle, her düğümü ziyaret etmenin başlayacağı gerçeği nedeniyle, ağacın artık dengeli (O) (log) n) veya dengeli değilse O (n) olmayacağını düşünüyor muyum? doğrusal bir aramadan? Bu uygulama çok daha yavaş arama sürelerine neden olur mu? Ancak, yukarı yönde, arama süreleri standart bir doğrusal yapıdakinden daha hızlı olur mu? Bunu doğru anladım mı?
sw123456

@ sw123456, Orijinal ağaç dengelenmiş olsaydı, sonuçta elde edilen ikili ağaç neredeyse kesinlikle olmazdı. Diğer her şeyin ağaçtaki fanlara, herhangi bir düğümün kaç çocuğa sahip olduğuna bağlı olduğuna inanıyorum. Doğrusal bir arama, yalnızca belirli bir düğümün alt öğelerinden hangisini izleyeceğini öğrenirken gerçekleşir. Ama n-ary ağacının başka herhangi bir uygulamasında bundan kaçınabileceğinizden emin değilim.
Justsalt

2

İkili ağaçlar neden onları kullanıyorsunuz?

Programlamada aynı tip veri koleksiyonlarıyla çok çalışıyorsunuz.

Bu verileri depolamanın iki temel yolu şunlardır: bağlantılı listeler ve diziler.

İkisi de yukarı ve aşağı yönde gelir: Bağlantılı bir listede, herhangi bir konuma öğe eklemek veya öğeleri kaldırmak kolaydır. Ancak belirli bir öğeye erişim daha zordur, çünkü istediğiniz öğeye gelene kadar listeden geçmeniz gerekir.

  • Verimli arama yapmaz, ancak ekleme ve silme kolaydır.

Belirli bir öğeye dizi erişimi kolaydır, ancak bir öğe eklemek veya silmek daha zordur çünkü ekleme araçları: diziyi birer genişletir, ekleme konumu 1'den önce tüm öğeleri sağa kaydırır ve öğeyi ekler.

  • Verimli arama yapar (sıralanırsa) ancak ekleme ve silme işlemi zordur.

Yani bağlantılı liste ve dizi dezavantajları var.

İkili ağaçlar, dizinin ve bağlantılı listenin her iki sorununun üstesinden gelmek için yapılır:

  1. Kolay ekleme ve silme
  2. Kolay arama

Bu yüzden ikili ağaç, düzenli olarak değişen çok fazla veriye sahip olduğunuzda yapılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.