21

바이너리 검색을 사용하는 정렬 된 배열에 비해 바이너리 검색 트리의 이점은 무엇입니까? 수학적 분석을 통해 차이점을 알 수는 없으므로 저수준 구현 오버 헤드에 차이가 있어야한다고 가정합니다. 평균 사례 실행 시간의 분석은 아래와 같습니다.바이너리 검색 대 바이너리 검색 트리

정렬 된 배열 이진 검색
검색 : O (로그 (N))
삽입 : O (로그 (N))
삭제 (우리는 여기서 요소가 삽입 찾을 이진 검색을 실행) O를 (로그 (N)) (우리가 삭제할 수있는 요소)

이진 검색 트리
검색 찾는 이진 검색을 실행 : O (N 로그())
삽입 : O (N 로그())
삭제 : O (log (n))

이진 검색 tre 위에 나열된 연산에 대해 O (n)의 최악의 경우가 있습니다 (트리가 균형을 이루지 않는 경우). 따라서 이진 검색을 사용하는 정렬 된 배열보다 실제로 좋지 않은 것처럼 보입니다.

또한 O (nlog (n))의 비용이 들기 전에 배열을 미리 정렬해야한다고 가정하지 않습니다. 이진 트리에 대해 할 것처럼 요소를 배열에 하나씩 삽입합니다. . 내가 볼 수 BST의 유일한 장점은 중위, 예약 주문, postorder 같은 순회의 다른 유형을 지원한다는 것입니다.

+6

이진 검색 배열에서 삽입 및 삭제는 O (n)이고 찾기 만 O (log (n))입니다. –

+0

예를 들어, 배열 대신 링크 된리스트라면, 삽입/삭제는'O (log n)'을 취할 것입니다. 그러나 배열을 위해서는 그렇지 않습니다. – Bhaskar

+2

@Bhaskar, 다른 잘못된 설명인데, 연결된 목록에서 조회하는 것은 O (n)입니다. – Blindy

답변

24

삽입을위한 공간을 만들기 위해 데이터를으로 물리적으로 옮겨야하거나, 삭제 된 항목을 숨기기 위해 실제로 데이터를 이동해야하기 때문에 분석이 잘못되었습니다. 정렬 및 삭제 모두 O (n)입니다.

오. 완전히 불균형 이진 탐색 트리에 대한 최악의 경우는 O (logn)가 아니라 O (n)입니다.

6

중 하나를 쿼리 에 이익의 대부분이 아니다.을 구성

그러나 정렬 된 트리는 한 번에 하나씩 요소를 추가 할 때 정렬 된 배열을 만드는 것보다 훨씬 빠릅니다. 따라서 변환 할 필요가 없습니다. 완료되면 배열로 이동합니다.

+9

삽입 또는 삭제를 지원할 필요가없는 경우 (예 : 데이터 세트를 한 번 빌드하면), 정렬 된 배열은 이진 검색 트리보다 꽤 빠른 상수 계수로 더 빨라질 것입니다. 배열에 공간 오버 헤드가 없으며 데이터가 압축되어 있고 포인터를 추적 할 필요가 없을 때 캐시가 훨씬 잘 작동합니다. –

+0

그래, 내가 말했듯이 꽤 축복이야. – Mehrdad

+3

당신이 말한 것을 제외하면, 메흐 다드. Rob Neuhaus가 말한 것과는 정반대로, 정렬 된 배열은 트리에 비해 큰 상수 계수 이점을 갖습니다. 롭이 맞습니다. – davidmw

2

또한 균형 이진 검색 트리를 유지 관리하기위한 표준 알고리즘이 있음에 유의하십시오. 그들은 이진 나무의 결핍을 제거하고 다른 모든 강점을 유지합니다. 복잡하기는하지만 이진 트리를 먼저 배워야합니다.

그 외에도 big-O는 같을 수 있지만 상수는 항상 그런 것은 아닙니다. 데이터를 올바르게 저장하면 이진 트리를 사용하여 여러 수준에서 캐싱을 매우 잘 활용할 수 있습니다. 결과적으로 많은 쿼리 작업을 수행하는 경우 대부분의 작업이 CPU 캐시 내에 있으므로 작업 속도가 크게 향상됩니다. 나무를 구조화하는 방법에주의를 기울이는 경우 특히 그렇습니다. 트리의 영리한 레이아웃이 성능을 크게 향상시킬 수있는 방법의 예는 http://blogs.msdn.com/b/devdev/archive/2007/06/12/cache-oblivious-data-structures.aspx을 참조하십시오. 이진 검색을하는 배열은 그런 트릭을 사용하는 것을 허용하지 않습니다.

+1

이진 트리 노드가 캐시 내부에 놓이는 방법을 자세히 설명해 주시겠습니까? 비 순차 메모리에 대한 포인터를 사용합니다. 즉, 공간적 지역성 및 데이터 캐시 누락이 없음을 의미합니다. 또한 링크에서 "정적 인 레코드 목록이 있으며 특정 키를 사용하여 레코드를 찾고 싶습니다.이 문제는 일반적으로 배열 및 이진 검색 또는 이진 검색 트리를 통해 해결됩니다. 이러한 접근 방식 중 음산한 캐시 동작이 나타납니다. " 네가 잘못했다고 하던데. '데이터를 올바르게 저장하면 이진 트리를 사용합니다. '에서 어떤 종류의 정확성을 지정하십시오. –

관련 문제