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 ์ด๋ฏธ์ง€๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

AVL ํŠธ๋ฆฌ์˜ 4๊ฐ€์ง€ ๋กœํ…Œ์ด์…˜ ์˜ˆ์ œ (์ถœ์ฒ˜: https://en.wikipedia.org/wiki/AVL_tree)

๋กœํ…Œ์ด์…˜ ์˜ˆ์ œ ๊ทธ๋ฆผ์ด ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•ด์„œ ์œ„ 4๊ฐ€์ง€ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์„ค๋ช…์ด ์ž˜ ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋กœํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ค๋ช…์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์„ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”~

 

์ถ”๊ฐ€๋กœ AVL ํŠธ๋ฆฌ์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋™์ž‘์€ ์ตœ์•…์˜ ์ƒํ™ฉ์—์„œ๋„ O(log N) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋ณด์ด๋ฉฐ ๊ฒ€์ƒ‰ ๋˜ํ•œ O(log N) ์œผ๋กœ ๋น ๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.