Splay Tree

BST (์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‘” Tree.

Splaying์ด๋ผ๋Š” ๊ธฐ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋Š” ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ ‘๊ทผ์„ ํ•˜๋ฉด, ์ด๋ฅผ ๋ฃจํŠธ๋กœ ์œ„์น˜ํ•˜๋„๋ก ์žฌ๋ฐฐ์น˜ ํ•˜๋Š” ๊ธฐ๋ฒ•์˜ ํŠธ๋ฆฌ

์‚ฝ์ž…, ์‚ญ์ œ, ํƒ์ƒ‰์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(log n)

ํŠน์ง•

  • ๊ตฌํ˜„์ด ๋‹จ์ˆœ

  • ๋งŽ์ด ์ ‘๊ทผํ•œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ๋น ๋ฅธ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

  • ์ ‘๊ทผ ๋นˆ๋„๊ฐ€ ๋ถˆ๊ท ๋“ฑํ•˜๊ฑฐ๋‚˜ ๋น„ ๋žœ๋ค ํŒจํ„ด์˜ ๊ฒฝ์šฐ O(lgn)๋ณด๋‹ค ๋” ์œ ๋ฆฌํ•˜๋‹ค.

  • AVL-Tree์™€ RB-Tree์™€ ๋‹ฌ๋ฆฌ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ €์žฅ ํ•„์š” ์—†๋‹ค.

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋†’์ด๊ฐ€ ์„ ํ˜•, ์ฆ‰ O(n)์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋กœ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (k๋ฒˆ์งธ ์›์†Œ ์ฐพ๊ธฐ, ๊ตฌ๊ฐ„ ํ•ฉ, lazy Propagation, ๊ตฌ๊ฐ„ ๋’ค์ง‘๊ธฐ ๋ชจ๋‘ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.) x๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•œ๋‹ค๋ฉด, splay๋ฅผ ํ†ตํ•ด root๋กœ ์˜ฌ๋ผ์˜ค๋ฉด์„œ x๋ณด๋‹ค ์ž‘์€ ๋…ธ๋“œ๋“ค์€ Left์—, ํฐ ๋…ธ๋“œ๋“ค์€ Right์— ๋ชจ์ด๋Š” ํŠน์„ฑ์„ ์ด์šฉ

์‚ฌ์šฉ ์˜ˆ

  • ์บ์‹œ, Garbage Collector ์•Œ๊ณ ๋ฆฌ์ฆ˜

์‚ฌ์šฉ ๊ธฐ๋ฒ•

  • Splay : rotate๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ, ํƒ์ƒ‰/์‚ฝ์ž…/์‚ญ์ œํ•œ ๋…ธ๋“œ๋ฅผ root์— ์œ„์น˜ํ•  ๋•Œ ๊นŒ์ง€ rotate์‹œ์ผœ๊ฐ€๋Š” ๊ธฐ๋ฒ•

    ์ด๋„ RB Tree์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ํ• ์•„๋ฒ„์ง€ ๋…ธ๋“œ์˜ ์–ด๋Š ์ž์‹์ธ์ง€์— ๋”ฐ๋ผ ๋Œ€์นญ์ด๋‹ค.

    • Zig : ๊ธฐ์ค€ ๋…ธ๋“œ x, z์˜ ๋ถ€๋ชจ ๋…ธ๋“œ y๊ฐ€ root์ผ ๋•Œ, y๋ฅผ ๊ธฐ์ค€์œผ๋กœ rotate

    • Zig-Zig : x์˜ ํ• ์•„๋ฒ„์ง€ ๋…ธ๋“œ, z๊ฐ€ ์žˆ์„ ๋•Œ, z์— ๋Œ€ํ•ด ์ž์‹ y์˜ ๋ฐฉํ–ฅ๊ณผ y์— ๋Œ€ํ•ด x์˜ ๋ฐฉํ–ฅ์ด ๊ฐ™์„ ๋•Œ (z->y ๋ฐฉํ–ฅ == y->x ๋ฐฉํ–ฅ )

      • y๊ฐ€ z์— ์™ผ์ชฝ ์ž์‹์ผ ๋•Œ : right-rotate(z) ํ›„ right-rotate(y)

      • y๊ฐ€ z์— ์˜ค๋ฅธ์กฑ ์ž์‹์ผ๋•Œ : left-rotate(z)ํ›„ left-rotate(y)

    • Zig-Zag: x์˜ ํ• ์•„๋ฒ„์ง€ ๋…ธ๋“œ, z๊ฐ€ ์žˆ์„ ๋•Œ, z์— ๋Œ€ํ•ด ์ž์‹ y์˜ ๋ฐฉํ–ฅ๊ณผ y์— ๋Œ€ํ•ด ์ž์‹ x์˜ ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅผ ๋•Œ (z->y ๋ฐฉํ–ฅ != y->x ๋ฐฉํ–ฅ)

      • y๊ฐ€ z์— ์™ผ์ชฝ ์ž์‹์ผ ๋•Œ : right-rotate(y) ํ›„ left-rotate(y)

      • y๊ฐ€ z์— ์˜ค๋ฅธ์กฑ ์ž์‹์ผ๋•Œ : left-rotate(y)ํ›„ right-rotate(y)

๊ตฌํ˜„

node ๊ตฌ์กฐ์ฒด

์ ‘๊ทผํ•  ๋…ธ๋“œ x์— ๋Œ€ํ•ด ๊ทธ ๋ถ€๋ชจ, ํ• ์•„๋ฒ„์ง€ ๋…ธ๋“œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋”ฐ๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋˜์ง€, ๋…ธ๋“œ ๊ตฌ์กฐ์ฒด์— ๋ถ€๋ชจ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ํฌ์ธํ„ฐ๋ฅผ ์ถ”๊ฐ€ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Insert ( ์‚ฝ์ž… )

BST ๊ทœ์น™์— ๋งž๊ฒŒ ์‚ฝ์ž… ํ›„ ์‚ฝ์ž…ํ•œ ๋…ธ๋“œ๋ฅผ x(๊ธฐ์ค€)์œผ๋กœ Splay๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

Delete ( ์‚ญ์ œ )

์‚ญ์ œํ•  ๋…ธ๋“œ(x)๋ฅผ Splay๋ฅผ ํ†ตํ•ด root๋กœ ์˜ฌ๋ฆฐ ํ›„, x์˜ successor๋ฅผ root๋กœ ์žฌ์กฐ์ • ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ผ๋ฐ˜ BST์™€ ๊ฐ™์ด ํ˜„์žฌ ๋…ธ๋“œkey๊ฐ€ ์ฐพ๊ณ ์žํ•˜๋Š” key๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ, ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ฐพ๊ณ , ์ฐพ์€ ๋…ธ๋“œ์— ๋Œ€ํ•ด Splay๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฝ”๋“œ ๋ณด๊ธฐ(c++)

์‹œ๊ฐ„ ๋ณต์žก๋„

์‚ฝ์ž…/ํƒ์ƒ‰ ์‹œ ๊ฐ€์žฅ ์ž‘์€ ์ˆซ์ž๋‚˜ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋ฅผ ์ ‘๊ทผํ•œ๋‹ค๋ฉด, ํŠธ๋ฆฌ๋Š” O(n)์œผ๋กœ ์„ ํ˜•์ ์ธ ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ์ด ๋˜์ง€๋งŒ, ๋ฌด์ž‘์œ„ splay๋ฅผ ํ†ตํ•ด ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟ” ์ค„ ์ˆ˜๋„ ์žˆ๊ณ , ์ž์ฃผ ์ ‘๊ทผ ํ•˜๋Š” ๋…ธ๋“œ๋Š” O(lgn)๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ฐ O(lgn)์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Last updated