이 영역을 누르면 첫 페이지로 이동
컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

페이지 맨 위로 올라가기

컴퓨터와 수학, 몽상 조금

컴퓨터공학, 딥러닝, 수학 등을 다룹니다.

9. AVL 트리

  • 2020.10.15 13:23
  • 학부 수업/알고리즘
반응형

AVL 트리는 모든 내부노드 $v$에 대해, $v$의 좌우 자식들의 높이 차이가 1을 넘지 않는 이진 탐색 트리이다.
AVL 트리의 부트리 역시 AVL 트리이며, 높이 정보는 각 내부 노드에 저장된다.

AVL 트리의 높이균형 속성 덕분에, $n$개의 원소를 저장하는 AVL 트리의 높이는 $O(\log n)$이 보장된다. (이진 탐색 트리는 최악의 경우 $O(n)$)

AVL 트리에서의 삽입/삭제

AVL 트리에서 원소의 삭제와 삽입은 이진 탐색 트리와 유사하나, 삽입 혹은 삭제로 인해 AVL 트리의 높이균형 속성이 파괴될 수 있으므로 이를 복원해주는 작업이 추가된다.

삽입

def insertItem(k, e):
    w = treeSearch(root(), k)
    if isInternal(w):
        raise Exception("Key Already Exists!")
    w.elem = e
    w.key = k
    expandExternal(w)
    searchAndFixAfterInsertion(w) # 이 부분이 추가된다.
    return 
def searchAndFixAfterInsertion(w):
    z = w
    while !isRoot(z):
        z = w.parent() # 루트까지 거슬러 올라가다가
        if !rightBalance(z): # 처음 만난 밸런스 깨진 노드가 z가 된다.
            break
    if isRoot(z) and rightBalance(z): # 만약 루트까지 전부 정상이면 리턴
        return
    y = higherChild(z) # y는 z의 높은 자식
    x = higherChild(y) # x는 y의 높은 자식
    restructure(x, y, z) # 균형을 복구한다. 하위 트리의 균형이 복구되면 루트까지 모든 균형이 복구된다.
    return
def reconstructure(x,y,z):
    a,b,c,t0,t1,t2,t3 = inorder(x,y,z) # x,y,z의 중위순회 순서와, x,y,z를 제외한 나머지 4개의 부트리
    swap(z, b) # 루트를 b로 바꾸고
    a.left = t0
    a.right = t1
    c.left = t2
    c.right =t3
    b.left = a
    b.right = c
    return b

삭제

def removeElement(k):
    w = treeSearch(root(), k)
    if isExternal(w):
        raise Exception("No Such Key!")
    e = w.elem
    z = leftChild(w)
    if !isExternal(z):
        z = rightChild(w)
    if isExternal(z): # 자식 중 외부노드 존재
        zs = reduceExternal(z) # 그냥 지우기
    else:
        y = inOrderSucc(w) # 중위순회 후계자 탐색
        z = leftChild(y)
        w.key = y.key
        w.elem = y.elem
        zs = reduceExternal(z)
    searchAndFixAfterRemoval(zs) # 균형 복구
    return e
def searchAndFixAfterRemoval(w):
    z = w
    while !isRoot(z):
        z = w.parent() # 루트까지 거슬러 올라가다가
        if !rightBalance(z): # 처음 만난 밸런스 깨진 노드가 z가 된다.
            break
    if isRoot(z) and rightBalance(z): # 만약 루트까지 전부 정상이면 리턴
        return
    y = higherChild(z)
    if (y.left.height == y.right.height): # y 의 두 자식의 높이가 같으면
        if isLeft(y): # y랑 같은 쪽을 자식으로
            x = y.left
        else:
            x = y.right
    else:
        x = higherChild(y)
    b = reconstructure(x,y,z)
    if isRoot(w):
        return
    else:
        searchAndFixAfterRemoval(w.parent()) #루트까지 재귀 반복

AVL 트리의 성능

AVL 트리를 이용하여 구현된 원소 $n$개의 사전은 $O(n)$ 공간과 $O(\log n)$ 높이를 가진다.

  • 3 노드를 개조하는 reconstructure 작업은 $O(1)$ 시간
  • findElement는 $O(\log n)$ 시간
  • insertItem, removeElement는 $O(\log n)$ 시간이 소요된다.
    • 초기의 treeSearch에 $O(\log n)$
    • 균형 복구에 $O(\log n)$
반응형

'학부 수업 > 알고리즘' 카테고리의 다른 글

11. 해시테이블의 충돌 해결  (0) 2020.11.05
10. 해시테이블 (Hash Table)  (0) 2020.11.05
8. 이진 탐색 트리 (Binary Search Tree)  (0) 2020.10.13
7. 사전 ADT (Dictionary ADT)  (0) 2020.10.08
6. 비교 기반 정렬 알고리즘(Comparison-based Sorting)  (0) 2020.09.29

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 11. 해시테이블의 충돌 해결

    11. 해시테이블의 충돌 해결

    2020.11.05
  • 10. 해시테이블 (Hash Table)

    10. 해시테이블 (Hash Table)

    2020.11.05
  • 8. 이진 탐색 트리 (Binary Search Tree)

    8. 이진 탐색 트리 (Binary Search Tree)

    2020.10.13
  • 7. 사전 ADT (Dictionary ADT)

    7. 사전 ADT (Dictionary ADT)

    2020.10.08
다른 글 더 둘러보기

정보

컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

  • 컴퓨터와 수학, 몽상 조금의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (276)
    • Tech Trend (3)
    • Deep Learning (77)
      • 공부 노트 (21)
      • 논문 리뷰 (44)
      • 논문 스키밍 (1)
      • 영상처리 (11)
    • Engineering (3)
      • Tips (2)
      • Experiences (1)
    • Blog (42)
      • 회고 & 계획 (16)
      • 내 이야기 (8)
      • 리뷰 (3)
      • 군대에 간 공돌이 (9)
      • ML엔지니어 취업 도전기 (1)
      • 여행 (4)
    • 학부 수업 (141)
      • 머신러닝 (16)
      • C프로그래밍 (8)
      • 자료구조 (11)
      • 알고리즘 (17)
      • 디지털시스템 (25)
      • 컴퓨터구조 (11)
      • 확률과 통계 (21)
      • 선형대수학 (14)
      • 이산수학 (18)
      • 데이터시각화 (0)
    • 강의 (9)
      • 딥러닝 기초 (7)
      • Python (2)

공지사항

인기 글

정보

백지오의 컴퓨터와 수학, 몽상 조금

컴퓨터와 수학, 몽상 조금

백지오

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
반응형

나의 외부 링크

  • profile
  • github
  • linkedin

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. © 백지오. Designed by Fraccino.

티스토리툴바