Bir veri yapısının "müdahaleci" olması ne anlama geliyor?


120

Listeler ve yığınlar gibi veri yapılarını tanımlamak için kullanılan müdahaleci terimini gördüm , ama bu ne anlama geliyor?

Müdahaleci bir veri yapısının bir kod örneğini ve müdahaleci olmayan bir yapının nasıl farklı olduğunu verebilir misiniz?

Ayrıca, neden müdahaleci (veya müdahaleci olmayan) yapasınız? Faydaları nelerdir? Dezavantajları nelerdir?

Yanıtlar:


107

Müdahaleci bir veri yapısı, depolamak için depolamayı düşündüğü öğelerden yardım gerektiren bir yapıdır.

Tekrar ifade edeyim. Bu veri yapısına bir şey koyduğunuzda, bu "bir şey" bir şekilde o veri yapısında olduğu gerçeğinin farkına varır. Veri yapısına eleman eklemek, elemanı değiştirir.

Örneğin, her düğümün sol ve sağ alt ağaçlara ve bu düğümün eleman değerine bir referansa sahip olduğu, müdahaleci olmayan bir ikili ağaç oluşturabilirsiniz.

Veya, bu alt ağaçlara yapılan referansların değerin kendisine gömülü olduğu müdahaleci bir tane oluşturabilirsiniz.

Müdahaleci veri yapısının bir örneği, değiştirilebilir olan öğelerin sıralı bir listesi olabilir. Öğe değişirse, listenin yeniden sıralanması gerekir, bu nedenle liste nesnesi, işbirliğini sağlamak için öğelerin gizliliğine müdahale etmelidir. yani. eleman, içinde bulunduğu listeyi bilmeli ve değişiklikleri ona bildirmelidir.

ORM sistemleri, büyük nesne listeleri üzerindeki yinelemeyi en aza indirmek için genellikle müdahaleci veri yapıları etrafında döner. Örneğin, veritabanındaki tüm çalışanların bir listesini alırsanız, onlardan birinin adını değiştirirseniz ve bunu veritabanına geri kaydetmek isterseniz, çalışan nesnesi değiştiğinde izinsiz çalışanların listesi söylenir, çünkü nesne hangi listede olduğunu bilir.

Müdahaleci olmayan bir liste söylenmez ve neyin değiştiğini ve kendi kendine nasıl değiştiğini bulması gerekirdi.


8
Yine de bir örnek ve artıları ve eksileri görmek istiyorum, ancak bu iyi bir giriş.
Rudiger

Posta kodu yerine STL'nin müdahaleci olmadığını söyleyeceğim, ancak Boost.Intrusive müdahaleci (tabii ki).
stonemetal

1
Müdahaleci Artılar: Verilerinizi olduğu gibi kullanılabilecek dahili bir yapıya kopyalamanıza gerek yok. Eksileri: Verilerinizin depolanacağı kapsayıcıları desteklemek için verilerinizin kapsüllenmesini kırmanız gerekir. Verilerinizin birden çok kapta olması gerekiyorsa, bu karmaşık olabilir. Müdahaleci olmayan kapsayıcılar Artıları: Daha iyi kapsülleme, kapsayıcılarınız için verileri değiştirmeye gerek yoktur. Eksileri: Verilerinizin dahili düğüm yapısına kopyasını gerektirir.
stonemetal

3
boost.org/doc/libs/1_45_0/doc/html/intrusive.html'de örnekler ve artı ve eksilerin iyi bir açıklaması vardır.
Tony Delroy

5

22

Müdahaleci bir kapta, kap için gerekli bilgilerin depolanmasından verinin kendisi sorumludur. Bu, bir yandan veri türünün nasıl depolanacağına bağlı olarak özelleştirilmesi gerektiği anlamına gelirken, diğer yandan verilerin nasıl depolandığını "bildiği" ve dolayısıyla biraz daha iyi optimize edilebileceği anlamına gelir.

Sigara müdahaleci:

template<typename T>
class LinkedList
{
  struct ListItem
  {
    T Value;
    ListItem* Prev;
    ListItem* Next;
  };

  ListItem* FirstItem;
  ListItem* LastItem;

  [...]
  ListItem* append(T&& val)
  {
    LastItem = LastItem.Next = new ListItem{val, LastItem, nullptr};
  };
};

LinkedList<int> IntList;

İntrüsif:

template<typename T>
class LinkedList
{
  T* FirstItem;
  T* LastItem;

  [...]
  T* append(T&& val)
  {
    T* newValue = new T(val);
    newValue.Next = nullptr;
    newValue.Prev = LastItem;
    LastItem.Next = newValue;
    LastItem = newValue;
  };
};

struct IntListItem
{
  int Value;
  IntListItem* Prev;
  IntListItem* Next;
};

LinkedList<IntListItem> IntList;

Şahsen ben şeffaflığı nedeniyle müdahaleci tasarımı tercih ediyorum.


Bu son satır, "şeffaf" kelimesinin kullanımından dolayı meraklıdır, çünkü müdahaleci bir kap içinde olmak, nesneye göre şeffaf değildir .
Kızak

@ArtB Verilerin son uygulamada tam olarak nasıl kullanıldığını aktarmada daha nettir, müdahaleci olmayan veriler söz konusu olduğunda genellikle kaplara girmeniz gerekirken, izinsiz veriler için verileri yalnızca verilerin yapısından görürsünüz.
API-Beast

1
Sanırım şeffafın herhangi bir "şeffaf" kullanımı, hangi açıdan bakıldığında nitelendirilmelidir. Tecrübelerime göre, "şeffaf" terimi genellikle verilerin nasıl işlendiğinin etki alanında görünmez olduğunu (yani alan modellemesinin saf olduğunu) belirtmek için kullanılır. Terim her iki şekilde de kullanılıyorsa, herhangi bir değeri olup olmadığını merak ediyorum.
Kızak

2
@ArtB Oh! Şeffaf için bazı özel Bilgisayar Bilimi anlamı var! Şeffaf benim için iç kısımları görebileceğiniz anlamına gelir, örneğin "görünümü engellememek", tıpkı cs dışı bağlamlarda kullanıldığı gibi.
API-Beast
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.