Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C/C++의 AA 트리?

<시간/>

컴퓨터 과학에서 AA 트리는 정렬된 데이터를 효율적으로 저장하고 검색하기 위해 구현된 균형 트리의 한 형태로 정의됩니다. AA 트리는 항목의 효율적인 추가 및 삭제를 지원하는 이진 검색 트리의 한 형태인 레드-블랙 트리의 변형으로 취급됩니다. 레드-블랙 트리와 달리 AA 트리의 레드 노드는 오른쪽 하위 하위로만 추가할 수 있고 왼쪽 하위 하위로는 추가할 수 없습니다. 이 작업의 결과는 2-3-4 트리 대신 2-3 트리를 시뮬레이션하여 유지 관리 작업을 단순화합니다. 레드-블랙 트리의 유지 관리 알고리즘은 트리의 균형을 적절하게 유지하기 위해 7가지 다른 모양을 가정하거나 고려해야 합니다.

C/C++의 AA 트리?


반면에 AA 트리는 오른쪽 링크만 빨간색일 수 있다는 엄격한 요구 사항으로 인해 두 가지 모양만 가정하거나 고려하면 됩니다. −

C/C++의 AA 트리?


균형 회전

레드-블랙 트리는 노드당 1비트의 밸런싱 메타데이터(색상)가 필요한 반면, AA 트리는 정수 "레벨" 형태로 노드당 메타데이터의 O(log(log(N))) 비트가 필요합니다. 아래의 불변량은 AA 트리에 대해 유지됩니다. -

  • 모든 리프 노드의 레벨은 하나로 취급됩니다.

  • 모든 왼쪽 자식의 수준은 부모보다 정확히 하나 작습니다.

  • 모든 오른쪽 자식의 수준은 부모의 수준과 같거나 하나 작습니다.

  • 모든 오른쪽 손자의 수준은 조부모의 수준보다 엄격하게 낮습니다.

  • 1보다 높은 레벨의 모든 노드에는 두 개의 자식이 있습니다.

AA 트리의 균형을 조정하는 것이 절차상 적-검정 트리의 균형을 조정하는 것보다 훨씬 쉽고 간단합니다.

AA 트리의 경우 균형을 복원하는 데 "기울기"와 "분할"의 두 가지 작업만 필요합니다. Skew는 왼쪽 수평 링크로 구성된 서브트리를 오른쪽 수평 링크로 구성된 서브트리로 교체하기 위해 오른쪽 회전으로 처리됩니다. 분할의 경우 두 개 이상의 연속적인 오른쪽 수평 링크로 구성된 하위 트리를 두 개의 연속적인 오른쪽 수평 링크가 더 적은 하위 트리로 교체하는 것은 왼쪽 회전 및 레벨 증가입니다. "skew" 및 "split" 작업은 아래에 설명되어 있습니다. -

함수 왜곡은

   input: An AA tree that needs to be rebalanced is represented by a node, t.
   output: The rebalanced AA tree is represented by another node.
if nil(t) then
return nil
else if nil(left(t)) then
return t
else if level(left(t)) == level(t) then
   Exchange the pointers of horizontal left links.
   l = left(t)
left(t) := right(l)
right(l) := t
return l
else
return t
end if
end function

C/C++의 AA 트리?


기능 분할은

   input: An AA tree that needs to be rebalanced is represented by a node, t.
   output: The rebalanced AA tree is represented by another node.
if nil(t) then
return nil
else if nil(right(t)) or nil(right(right(t))) then
return t
else if level(t) == level(right(right(t))) then
We have two horizontal right links. The middle node is taken, elevate it, and return it.
      r = right(t)
right(t) := left(r)
left(r) := t
level(r) := level(r) + 1
return r
else
return t
end if
end function

C/C++의 AA 트리?

분할 -