AVL ํธ๋ฆฌ ํน์ง ๋ฐ ๋กํ ์ด์ ๊ธฐ์ค
AVL ํธ๋ฆฌ๋ ์ด์งํ์ํธ๋ฆฌ(Binary Search Tree, BST)์ ํ ์ข ๋ฅ์ ๋๋ค.
์ด์ง ํ์ ํธ๋ฆฌ(BST)๋ ์ด์งํธ๋ฆฌ(Binary Tree)์ ํ ์ข ๋ฅ์ด์ฃ .
๋ฐ๋ผ์ AVL ํธ๋ฆฌ๋ ์ด์งํธ๋ฆฌ์ ์ด์งํ์ํธ๋ฆฌ์ ํน์ง๋ค์ ๋ชจ๋ ๊ฐ๊ณ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ทธ ํน์ง๋ค์ด ๋ฌด์์ผ๊น์?
- ์ด์งํธ๋ฆฌ(Binary Tree)์ ํน์ง
a. ๊ฐ ๋ ธ๋๋ ์ต๋ 2๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
b. ์์ ๋ ธ๋๋ ๋ณดํต ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ตฌ๋ถํ๋ค -> left child, right child
c. ๊ฐ ๋ ธ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. (๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋์ด๋ ๋น์ฐํ ๋ง์ด๋ค)
- ์ด์งํ์ํธ๋ฆฌ(Binary Search Tree, BST)์ ํน์ง
a. ์ด์งํธ๋ฆฌ์ด๋ฏ๋ก ์ด์งํธ๋ฆฌ์ ํน์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๊ณ ์๋ค.
b. ๊ฐ ๋ ธ๋์ ๊ฐ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฐ๋ค ๋ณด๋ค ํฌ๊ณ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฐ๋ค ๋ณด๋ค ์๋ค.
c. ๋ฐ๋ผ์ ์ด์งํ์ํธ๋ฆฌ๋ ์ ๋ ฌ๋ ์ด์งํธ๋ฆฌ(sorted binary tree)๋ผ๊ณ ๋ ํ๋ค.
์, ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก ์๋์ ๊ฐ์ ํน์ง์ ๊ฐ๋ ํธ๋ฆฌ๋ฅผ AVL ํธ๋ฆฌ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- AVL ํธ๋ฆฌ์ ํน์ง
a. ์ด๋ค ๋ ธ๋๋ผ๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด ์ฐจ์ด๊ฐ 1๋ณด๋ค ํฌ์ง ์๋ค. (์ต๋ ๋์ด ์ฐจ์ด๋ 1 ์ด๋ค.)
=> Binary Tree์ด๋ฉด์ ์ต๋ ๋์ด ์ฐจ์ด๊ฐ 1์ด๋ผ๋ ๋ง์ height = O(log N) ์ด๋ผ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
b. ๋ง์ฝ ํน์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ์ ๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด ์ฐจ์ด๊ฐ 1๋ณด๋ค ์ปค์ง๋ ๋ ธ๋๊ฐ ์๊ธด๋ค๋ฉด, re-balancing์ ํตํด a ๊ท์น์ ์ด๊ธ๋์ง ์๋๋ก ํ๋ค.
=> ์ด ๋ง์ AVL ํธ๋ฆฌ๋ ์๊ฐ ๊ท ํ ์ด์ง ํ์ ํธ๋ฆฌ(self-balancing BST) ๋ผ๋ ๋ง๊ณผ ๊ฐ๋ค.
c. ๊ท ํ ํธ๋ฆฌ(balanced tree)์ด๋ค. (์ข๋ ์ ํํ๋ ๋์ด ๊ท ํ ํธ๋ฆฌ์ด๋ค.)
=> ๊ท ํ ํธ๋ฆฌ๋ ์๋ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ ํธ๋ฆฌ์ด๋ค.
i. ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด ์ฐจ์ด๊ฐ ์ต๋ 1์ด๋ค.
ii. ์ผ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๊ท ํ ํธ๋ฆฌ์ด๋ค.
iii. ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๊ท ํ ํธ๋ฆฌ์ด๋ค.
d. ๊ฐ ๋ ธ๋๋ ๊ท ํ๊ฐ(๊ท ํ์ธ์, balance factor)์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด ๊ท ํ๊ฐ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด์์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋์ด๋ฅผ ๋บ ๊ฐ์ด๋ค. ์ด ๊ฐ์ ํญ์ {-1, 0, 1 } ์ ์ค ํ๋์ ๊ฐ์ด์ด์ผ ํ๋ค.
e. ๊ท ํ๊ฐ(๊ท ํ์ธ์, balance factor)์ด ๋ง์ด๋์ค(-)์ด๋ฉด left-heavy, ํ๋ฌ์ค(+) ๊ฐ์ ๊ฐ์ง๋ฉด right-heavy ๋ผ๊ณ ํ๋ค.
f. pivot ๋ ธ๋๋ ์๋ก์ด ๋ ธ๋๊ฐ ์ถ๊ฐ๋์์ ๋ ๊ท ํ๊ฐ์ ๋ณ๋์ด ๋ฐ์ํ์ฌ unbalanced ๋ ๋ ธ๋๋ค ์ค ์ ๊ท๋ ธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ๋งํ๋ค.
์, ์์ ๊ฐ์ ํน์ง์ ๊ฐ๊ณ ์๋ AVL ํธ๋ฆฌ์ ๋ ธ๋๋ฅผ ์ถ๊ฐ ๋๋ ์ญ์ ๋ฅผ ํ๊ฒ๋๋ฉด ์ค์ค๋ก ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ํธ๋ฆฌ์ ํ์ (rotation)์ ํ์๋ก ํ ์๋ ์์ต๋๋ค. ๋ ธ๋๊ฐ ์ถ๊ฐ ๋๋ ์ญ์ ๋๋ฉด์ ์ผ๋ถ ๋ ธ๋๋ค์ ๊ท ํ๊ฐ์ ๋ณ๋์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ๋ ํฌ๊ฒ 2๊ฐ์ง(single rotation๊ณผ double rotation) ์ข ๋ ์ธ๋ถํํ๋ฉด ์๋์ ๊ฐ์ด 4๊ฐ์ง๋ก ๋๋ ์ ์์ต๋๋ค.
- ์ผ์ผ (Left - Left) : ๋ถ๋ชจ ๋
ธ๋์ pivot ๋
ธ๋์ ๊ท ํ๊ฐ์ด ๋ชจ๋ left-heavy์ธ ๊ฒฝ์ฐ
=> Single Right rotation (์ค๋ฅธ์ชฝ์ผ๋ก 1ํ์ ) - ์ค์ค (Right - Right) : ๋ถ๋ชจ ๋
ธ๋์ pivot ๋
ธ๋์ ๊ท ํ๊ฐ์ด ๋ชจ๋ right-heavy์ธ ๊ฒฝ์ฐ
=> Single Left rotation (์ผ์ชฝ์ผ๋ก 1ํ์ ) - ์ผ์ค (Left - Right) : ๋ถ๋ชจ ๋
ธ๋์ pivot ๋
ธ๋์ ๊ท ํ๊ฐ์ด ๊ฐ๊ฐ right-heavy, left-heavy, ์ธ ๊ฒฝ์ฐ
=> Double Left-Right rotation (์ผ์ชฝ์ผ๋ก ํ๋ฒ, ์ค๋ฅธ์ชฝ์ผ๋ก ํ๋ฒ ์ด ๋ ๋ฒ์ ํ์ ) - ์ค์ผ(Right - Left) : ๋ถ๋ชจ ๋
ธ๋์ pivot ๋
ธ๋์ ๊ท ํ๊ฐ์ด ๊ฐ๊ฐ left-heavy, right-heavy์ธ ๊ฒฝ์ฐ
=> Double Right-Left rotation (์ค๋ฅธ์ชฝ์ผ๋ก ํ๋ฒ, ์ผ์ชฝ์ผ๋ก ํ๋ฒ ์ด ๋ ๋ฒ์ ํ์ )
๊ฐ๊ฐ์ ๋กํ ์ด์ ์ ๋ํ ๊ทธ๋ฆผ์ wiki์ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ๋์์์ด gif ์ด๋ฏธ์ง๋ฅผ ์ฒจ๋ถํฉ๋๋ค.
๋กํ ์ด์ ์์ ๊ทธ๋ฆผ์ด ๋๋ฌด ๊ฐ๋จํด์ ์ 4๊ฐ์ง ์ผ์ด์ค์ ๋ํด ์ค๋ช ์ด ์ ๋ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋กํ ์ด์ ์ ๋ํ ์ถ๊ฐ ์ค๋ช ์ ๋ค์ ํฌ์คํ ์ ๊ธฐ๋ค๋ ค์ฃผ์ธ์~
์ถ๊ฐ๋ก AVL ํธ๋ฆฌ์ ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๋์์ ์ต์ ์ ์ํฉ์์๋ O(log N) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ณด์ด๋ฉฐ ๊ฒ์ ๋ํ O(log N) ์ผ๋ก ๋น ๋ฅธ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
'๐ป Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ์์กด์ฑ ์ฃผ์ (DI) (0) | 2020.12.10 |
---|---|
[์๋ฃ๊ตฌ์กฐ] AVL ํธ๋ฆฌ ํ์ ํ๊ธฐ (rotation of AVL tree) (1) | 2020.12.04 |
[AWS] ES์ ์ฐ๋๋ ํค๋ฐ๋ ์๋ฌ (Unable to find saved objects) (0) | 2020.11.28 |
[5๋ถ์ฝ๋ฉ] ์คํ๋ง ๋ถํธ์ ์ค์จ๊ฑฐ v3.x ์ฐ๋ํ๊ธฐ (0) | 2020.11.26 |
[๋ชฝ๊ณ DB] ๊ธฐ๋ณธ ์ ๋ช ๋ น์ด (0) | 2020.11.24 |