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


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.