2017-12-11 3 views
0

우리는 메모리에 B + 트리를 구현하고 키는 내부 노드에 있고 키 데이터 쌍은 리프 노드에 있다고 가정합니다. B + tree가 fan-out f 인 경우 B + tree는 log_f N의 높이를 가지며 여기서 N은 키의 수입니다. 반면 해당 BST의 높이는 log_2 N입니다. 우리가 아무 것도하지 않으면 디스크 읽기 및 쓰기, B + 트리 검색 성능 이진 검색 트리 검색 성능보다 좋을 수 있습니까? 방법? 각 내부 노드의 B + 트리의 경우 BST에 대해 1을 선택한 경우 F 대신 여러 가지를 결정했습니다.B + 트리 검색은 리프 노드의 모든 키 - 데이터가 메모리에있는 바이너리 검색 트리 검색보다 잘 수행 할 수 있습니까?

+1

거의 없습니다. B + 나무의 매력은 디스크 액세스가 너무 느리기 때문에 디스크 탐색을 줄이는 것입니다. 내가 순진한 BST보다 성능이 뛰어나다는 것을 알 수있는 유일한 방법은 캐시 친숙 함 때문이지만 가능성은 희박하며,이 경우 BST는 더 나은 할당 전략으로 더 많은 최적화를 사용할 수 있습니다. –

+0

B + 트리가 완전히 구현 된 메모리라면 BST보다 성능이 좋은 이유를 알 수 없습니다. 하지만 B + 트리가 캐시 친숙성을 갖고 BST가 그렇지 않은 이유는 무엇입니까? – burcak

+1

내부 F 키를 벡터 나 전염성있는 것으로 넣을 수 있기 때문에 구현에 따라 BST –

답변

0

적어도 캐시와 비교할 때 주 메모리는 디스크 드라이브와 많은 특성을 가지고 있습니다. 캐시는 캐시보다 훨씬 높은 대역폭을 가지지 만 대기 시간은 훨씬 길습니다. 최소 읽기 크기가 상당히 크며 읽기가 예측 가능한 경우 (예 : 인접한 주소에서 여러 개의 캐시 행을 읽은 경우) 상당히 높은 대역폭을 제공합니다. 이와 같이, 동일한 일반 종류의 최적화 (비록 세부 사항은 종종 조금씩 다르지만)로부터 이익을 얻습니다.

B- 트리 (B * 및 B + 트리와 같은 변형)는 디스크 드라이브에서 지원되는 액세스 패턴과 잘 작동하도록 명시 적으로 설계되었습니다. 어쨌든 상당히 많은 양의 데이터를 읽어야하기 때문에 읽어야하는 메모리에서 얻는 양을 최대화하기 위해 데이터를 압축 할 수도 있습니다. 두 경우 모두 예측 가능한 패턴 (특히 연속적인 주소에서 연속적인 읽기 횟수)에서 최소 판독 값의 여러 배를 읽음으로써 상당한 대역폭 이득을 자주 얻게됩니다. 따라서 한 페이지의 크기를 한 번에 읽을 수있는 최소 크기보다 더 크게 늘리는 것이 좋습니다.

마찬가지로 두 경우 모두 우리가 정말로 신경을 쓰는 데이터를 찾기 전에 트리의 여러 노드 레이어를 통해 내림차순으로 계획 할 수 있습니다. 디스크에서 읽을 때와 마찬가지로 우리가 읽은 데이터의 키 밀도를 최대화하여 실제로 우리가 관심있는 데이터를 찾을 때까지 이점을 얻습니다. 일반적인 이진 트리로 :

template <class T, class U> 
struct node { 
    T key; 
    U data; 
    node *left; 
    node *right; 
}; 

... 우리는 우리가 실제 사용이없는 데이터 항목의 수를 읽는 끝낸다. 관련 데이터를 얻고 자하는/원하는 키를 찾았을 때만입니다. 공정에서, 우리는 노드 구조 만 상당히 약간의 수정과 함께,뿐만 아니라 이진 트리와 함께이 작업을 수행 할 수 있습니다

template <class T, class U> 
struct node { 
    T key; 
    U *data; 
    node *left; 
    node *right; 
}; 

이제 노드는 데이터가 아닌 데이터 자체에 대한 포인터 만 포함되어 있습니다. data이 작 으면 아무 것도 수행하지 않지만 큰 경우 많은 작업을 수행 할 수 있습니다.

요약 : CPU의 관점에서, 메인 메모리로부터의 읽기는 디스크로부터의 읽기와 동일한 기본 특성을 갖는다. 디스크는 이러한 동일한 특성의 극단적 인 버전을 보여줍니다. 따라서 B- 트리 (및 변형)의 설계를 이끌어 낸 설계 고려 사항의 대부분은 이제 주 메모리에 저장된 데이터와 유사하게 적용됩니다.

B- 트리는 잘 작동하며 메모리 내장 스토리지로 사용될 때 상당한 이점을 제공합니다.

+0

에 해당하지 않을 수 있습니다. 답장을 보내 주셔서 감사합니다. 그러나 루트를 제외한 B + 트리에서는 내부 노드가 3 개 이상의 하위 노드를 가질 수 있으며 각 노드가 이미 데이터를 유지한다고 가정합니다. 따라서 우리는 데이터에 대한 포인터가 필요 없습니다. 데이터도 메모리에 있습니다. 그 경우에는 B + 트리가 Binary 검색 트리보다 여전히 좋을지 궁금합니다. – burcak