- C++ ile Apter Trees
- Yalnızca iki vektör kullanarak,
(düğüm değeri, ebeveyn indeksi) ile sade biçimde ifade edilen bir tree
- Çoğu tree, ikili tree gibi uygulanır ve her düğüm kendi değeriyle birlikte sol/sağ çocuk düğümlere işaret eden pointer'lar içerir
- Bu tür veri yapıları genellikle özyinelemeli olarak uygulanır ve cache davranışı ile sık
malloc() çağrıları nedeniyle yavaş olabilir
- Bir tree düğümüne kimin "sahip olduğu" kavramı, çok katmanlı yazılımlarda karmaşık hale gelebilir
- Apter tree çok daha hızlıdır, hakkında akıl yürütmesi daha kolaydır ve uygulanması daha basittir
Nasıl çalışır
- Aynı boyutta iki diziyle uygulanır
- Verinin vektörü (dizi)
d
- Ebeveyn indekslerinin vektörü
p. d vektöründeki indeks anahtar olarak kullanılır (c)
- Çoğu zaman anahtar/indeks
c bir tamsayıdır
- Coco, Molly ve Arca'nın ebeveyniyse ve Arca'nın da Cricket adında bir çocuğu varsa yapı aşağıdaki gibi olur
tree.d = ["Coco", "Molly", "Arca","Cricket"]
tree.p = [0,0,0,2]
- Ebeveyni 0 olan ve anahtarı 0 olan düğüm kök düğümdür (Apter tree'de kök düğüm zorunludur ya da
-1 "ebeveyn yok" anlamına gelir, ancak burada bunu göz ardı ediyoruz)
- Bilgisayarlar vektörleri çok hızlı işler. Pointer işlemlerinden çok daha hızlı oldukları için, algoritmaların Big-O gösterimini karşılaştırmak pratikte pek anlamlı değildir
Neden önemli
- Bu uygulama biçimi, yazarın gördüğü tree uygulamaları arasında en zarif olanı
- Uygun bir vektör işlemleri kütüphanesiyle kullanıldığında anlaşılması kolay ve hata ayıklaması kolaydır
- Basitliği sayesinde başka kullanım senaryolarına da kolayca uyarlanabilir
- Ebeveyn indeks vektörünü yok sayıp değerler üzerinde hızlıca yineleme yapılabilir; bu da ücretsiz bir Deep Map gibidir
- GPU dostudur ve gömülü ortamlarda kullanımı kolaydır
- Vektörlerin belirli bir boyutun ötesine büyümesini engelleyerek güvenliği korumak daha kolay hale gelir
Kökeni
- Bu tekniği kimin icat ettiğini bulmaya çalışıyor; 60'lar ve 70'lerdeki vektör odaklı dönemde bunun zaten bir adı olduğunu tahmin ediyor
- İlk tam açıklamayı Apter'ın anlattığı biçimde görmüş olsa da, K3'te de kapsamlı biçimde belgelenmiş
- APL, tree'leri geleneksel biçimde uygular ama vektör graph'lar için benzer teknikler kullanır
- J kullanıcıları arasında da biliniyor; Rosetta Code'da J dilinde tree uygulamasına dair bir açıklama var
- John Earnest, silinmiş öğeler için "offset index" yaklaşımı da dahil olmak üzere vektör tree uygulamasını daha ayrıntılı açıklar
- Daha karmaşık bir yaklaşım ise her öğenin derinliğini takip etmektir
Diğer yaygın tree uygulamaları
- FreeBSD'nin kernel tree uygulaması, klib'in tree'leri, Ruby'nin tree sınıfı ve Python'un bildirime dayalı tree sınıfı gibi örnekler var
- Bunlar Apter tree ile aynı işlevi yerine getirmez; bazıları genelleştirme nedeniyle çok daha büyüktür
Bu kodun durumu
- Bunu, C++17 öğrenmek için bir uygulama denemesi olarak yazmış
- Henüz kullanıma hazır değil ve C++ hakkında daha fazla şey öğrenmesi gerekiyor
GN⁺'un görüşü
- Apter Trees, mevcut karmaşık tree yapılarını sadeleştirerek hızlı ve verimli veri yönetimini mümkün kılar
- Vektör tabanlı tree uygulaması, bellek ek yükünü en aza indirip doğrusal erişimle performansı artırabilir
- Bu yazı, yazılım mühendisliğinde veri yapılarına yönelik yenilikçi yaklaşımları keşfetmek açısından ilgi çekici
1 yorum
Hacker News görüşleri
ilk çocukvesonraki kardeşişaretçileri ekleyerek atree tasarımını genelleştirmenin aslında kolay olduğunu belirtti. Ayrıca, gereken işlemleri desteklemek için veri yapısını değiştirmenin tavsiye edildiğini söyledi.mallocçağrılarını azaltmak ve veri yerelliğini artırmak isteniyorsa, düğüm havuzu kullanan geleneksel bir ağaç uygulamasının denenmesini önerdi.handleveyaindex-handledenmesiyle ilgili bir yorum vardı; ayrıca bu ağaç gösteriminin heap ve disjoint set gibi klasik veri yapılarını hatırlattığı söylendi.pointersayılabileceği ve geleneksel ağaç uygulamalarındamallocgereksiniminin düğümlerin dinamik olarak eklenip çıkarılması ihtiyacından kaynaklandığı açıklandı. Ağacın boyutu sınırlıysa ve sık silme yapılmıyorsa, dizi uygulamasının uygun olabileceği belirtildi.