데이터 구조가 "침투 적"이라는 것은 무엇을 의미합니까?


120

목록 및 스택과 같은 데이터 구조를 설명 하는 데 사용되는 침입 이라는 용어를 보았지만 그 의미는 무엇입니까?

침입 형 데이터 구조의 코드 예제를 제공 할 수 있으며 비침 입형 데이터 구조와 어떻게 다른가?

또한 왜 방해가되지 않는 (또는 방해가되지 않는) 이유는 무엇입니까? 이점은 무엇입니까? 단점은 무엇입니까?

답변:


107

침입 데이터 구조는 저장하려는 요소의 도움이 필요한 구조입니다.

다시 말하겠습니다. 데이터 구조에 무언가를 넣으면 그 "무언가"가 어떤 식 으로든 그 데이터 구조에 있다는 사실을 인식하게됩니다. 데이터 구조에 요소를 추가하면 요소가 변경됩니다.

예를 들어, 각 노드에 왼쪽 및 오른쪽 하위 트리에 대한 참조와 해당 노드의 요소 값에 대한 참조가있는 비 간섭 이진 트리를 빌드 할 수 있습니다.

또는 해당 하위 트리에 대한 참조가 값 자체에 포함되는 방해 요소를 만들 수 있습니다.

침입 데이터 구조의 예는 변경 가능한 요소의 정렬 된 목록입니다. 요소가 변경되면 목록을 다시 정렬해야하므로 목록 개체는 요소의 협력을 위해 요소의 프라이버시를 침해해야합니다. 즉. 요소는 자신이있는 목록에 대해 알고 변경 사항을 알려야합니다.

ORM 시스템은 일반적으로 큰 객체 목록에 대한 반복을 최소화하기 위해 침입 데이터 구조를 중심으로 회전합니다. 예를 들어, 데이터베이스에있는 모든 직원의 목록을 검색 한 다음 그 중 하나의 이름을 변경하고 데이터베이스에 다시 저장하려면 직원 개체가 변경 될 때 방해가되는 직원 목록을 알려줍니다. 개체는 어떤 목록에 있는지 알고 있습니다.

방해가되지 않는 목록은 알려지지 않았으며 변경된 내용과 자체적으로 변경된 방법을 파악해야합니다.


8
여전히 예제와 장단점을보고 싶지만 이것은 좋은 소개입니다.
Rudiger

포스트 코드보다는 STL이 방해가되지 않고 Boost.Intrusive는 방해가된다고 말할 것입니다 (분명히).
stonemetal

1
Intrusive Pros : 데이터를 그대로 사용할 수있는 내부 구조로 복사 할 필요가 없습니다. 단점 : 데이터가 저장 될 컨테이너를 지원하려면 데이터 캡슐화를 중단해야합니다. 데이터가 여러 컨테이너에 있어야하는 경우 까다로울 수 있습니다. 비침 입적 컨테이너 장점 : 더 나은 캡슐화로 컨테이너의 데이터를 수정할 필요가 없습니다. 단점 : 내부 노드 구조에 대한 데이터 사본이 필요합니다.
stonemetal

3
boost.org/doc/libs/1_45_0/doc/html/intrusive.html 에는 예제와 장단점에 대한 좋은 설명이 있습니다.
Tony Delroy


22

침입 컨테이너에서 데이터 자체는 컨테이너에 필요한 정보를 저장합니다. 즉, 한쪽에서는 데이터 유형이 저장 방법에 따라 특수화되어야하고 다른 쪽에서는 데이터가 저장 방법을 "알고"있으므로 약간 더 최적화 할 수 있음을 의미합니다.

비침 입성 :

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;

방해 :

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;

개인적으로 저는 투명성 때문에 침입 형 디자인을 선호합니다.


그 마지막 줄은 "투명한"이라는 단어의 사용 때문에 호기심이 많습니다. 침입 컨테이너에있는 것은 객체에 투명 하지 않기 때문 입니다.
썰매

@ArtB 데이터가 최종 애플리케이션에서 정확히 어떻게 사용되는지를 전달하는 것이 더 명확합니다. 비 침입 데이터의 경우 일반적으로 컨테이너를 파헤쳐 야하는 반면, 침입 데이터의 경우 데이터 구조에서만 볼 수 있습니다.
API-Beast

1
투명 함을 "투명하게"사용하는 것은 어떤 관점에서보아야할지에 대한 자격을 갖추어야한다고 생각합니다. 내 경험상 "투명"은 데이터가 처리되는 방식이 도메인에 보이지 않음을 나타내는 데 자주 사용됩니다 (즉, 도메인 모델링이 순수함). 이 용어가 두 가지 방법으로 사용된다면 그 용어에 가치가 있는지 궁금합니다.
썰매

2
@ArtB 오! 투명성에는 특별한 컴퓨터 과학의 의미가 있습니다! 투명한 의미는 비 -cs 컨텍스트에서 사용되는 용어처럼 "보기를 방해하지 않음"과 같이 내부를 볼 수 있다는 것을 의미합니다.
API-Beast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.