๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

12-1๊ฐ•. ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ(1)

by devshin.kr 2020. 11. 17.
728x90

๋ฌธ์ œ ์ƒํ™ฉ : ํ˜„์‹ค์„ธ๊ณ„์—์„œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ ฌ๋œ Binary Search Tree๋Š” ์ฐพ๊ธฐ ํž˜๋“ค๋‹ค. ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ทน๋‹จ์ ์œผ๋กœ ์น˜์šฐ์นœ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ณด์™„ ๋ฐฉ๋ฒ• : ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ(Red-Black Tree)๋Š” ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค.

์™„๋ฒฝํ•˜๊ฒŒ ํŠธ๋ฆฌ์˜ ๊ท ํ˜•์„ ๋งž์ถœ ์ˆ˜๋Š” ์—†์œผ๋‚˜, ์–ด๋Š์ •๋„ ๋ณด์™„์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

INSERT, DELETE ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์ ˆํ•˜๊ฒŒ ์ˆ˜์ •ํ–ˆ๋‹ค.

 

 

  • ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ

๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ

- ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์ผ์ข…

- ๊ท ํ˜• ์žกํžŒ ํŠธ๋ฆฌ : ๋†’์ด๊ฐ€ O(log2n)

- SEARCH, INSERT, DELETE ์—ฐ์‚ฐ์„ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ O(log2n) ์‹œ๊ฐ„์— ์ง€์›ํ•œ๋‹ค.

 

- ๊ฐ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ‚ค(key), ์™ผ์ชฝ์ž์‹(left), ์˜ค๋ฅธ์ชฝ ์ž์‹(right), ๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ๋…ธ๋“œ(p)์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.

- ์ž์‹๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, NIL ๋…ธ๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ํŠน์ˆ˜ํ•œ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

- ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋ฆฌํ”„๋…ธ๋“œ๋Š” NIL๋…ธ๋“œ์ด๋‹ค.

- ๋ฃจํŠธ์˜ ๋ถ€๋ชจ๋„ NIL๋…ธ๋“œ๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

- ๋…ธ๋“œ๋“ค์€ ๋‚ด๋ถ€๋…ธ๋“œ์™€ NIL๋…ธ๋“œ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

(NIL๋…ธ๋“œ๋Š” ๊ฐ€์ƒ์ ์ธ ๋…ธ๋“œ์ž„. ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.)

 

 

๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ (๊ฒ€์ •์ƒ‰ ๋…ธ๋“œ : black, ํ•˜์–€์ƒ‰ ๋…ธ๋“œ : red)
๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ

- ๋‹ค์Œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ

   1. ๊ฐ ๋…ธ๋“œ๋Š” red ํ˜น์€ black์ด๊ณ ,

   2. ๋ฃจํŠธ๋…ธ๋“œ๋Š” black์ด๊ณ ,

   3. ๋ชจ๋“  ๋ฆฌํ”„๋…ธ๋“œ(์ฆ‰, NIL๋…ธ๋“œ)๋Š” black์ด๊ณ ,

   4. red๋…ธ๋“œ์˜ ์ž์‹๋…ธ๋“œ๋“ค์€ ์ „๋ถ€ black์ด๊ณ (์ฆ‰, red๋…ธ๋“œ๋Š” ์—ฐ์†๋˜์–ด ๋“ฑ์žฅํ•˜์ง€ ์•Š๊ณ ),

   5. ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ๊ทธ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์ž์†์ธ ๋ฆฌํ”„๋…ธ๋“œ์— ์ด๋ฅด๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์—๋Š” ๋™์ผํ•œ ๊ฐฏ์ˆ˜์˜ black๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

 

- ๋†’์ด๊ฐ€ h์ธ ๋ธ”๋ž™-๋†’์ด๋Š” bh >= h/2 ์ด๋‹ค.

   - ์กฐ๊ฑด4์— ์˜ํ•ด ๋ ˆ๋“œ๋…ธ๋“œ๋Š” ์—ฐ์†๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹น์—ฐํ•˜๋‹ค.

- ๋…ธ๋“œ x๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์ž„์ด์˜ ๋ถ€ํŠธ๋ฆฌ๋Š” ์ ์–ด๋„ 2^(bh(x)) -1๊ฐœ์˜ ๋‚ด๋ถ€๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค.(์ˆ˜ํ•™์ ๊ท€๋‚ฉ๋ฒ•)

- n๊ฐœ์˜ ๋‚ด๋ถ€๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” 2log2(n+1) ์ดํ•˜์ด๋‹ค.

   - n >= 2^(bh) -1 >= 2^(h/2) -1 ์ด๋ฏ€๋กœ, ์—ฌ๊ธฐ์—์„œ bh์™€ h๋Š” ๊ฐ๊ฐ ๋ฃจํŠธ๋…ธ๋“œ์˜ ๋ธ”๋ž™-๋†’์ด์™€ ๋†’์ด

 

 

  • ๋ ˆ๋“œ๋ธ”๋ž™ํŠธ๋ฆฌ์˜ SEARCH, INSERT, DELETE

SEARCH ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Binary Search Tree์™€ ์™„๋ฒฝํžˆ ๋™์ผํ•˜๋‹ค.

INSERT์™€ DELETE๋ฅผ ๋ฐฐ์›Œ ๋ณผ ๊ฑด๋ฐ, Left and Right Rotation์ด๋ผ๋Š” ์‚ฌ์ „์ง€์‹์ด ํ•„์š”ํ•˜๋‹ค.

 

  • Left and Right Rotation

  - ์‹œ๊ฐ„๋ณต์žก๋„ O(1)

  - ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ์œ ์ง€

 

LEFT-ROTATE(T, x)	// T : Tree, x : node
{
	y <- right[x]	// Set y
    right[x] <- left[y]	// Turn y's left subtree into x's right subtree
    p[left[y]] <- x
    p[y] <- p[x]	// Link x's parent to y. x์˜ ๋ถ€๋ชจ๊ฐ€ y์˜ ๋ถ€๋ชจ
    if p[x] == nil[T] // ํ˜„์žฌ x์˜ ๋ถ€๋ชจ๊ฐ€ nil์ด๋ผ๋ฉด,
    	then root[T] <- y	// y๊ฐ€ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๊ฐ€ ๋œ๋‹ค
        else if x == left[p[x]]	// x์˜ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•œ๋‹ค๋ฉด,
        	then left[p[x]] <- y	// y๊ฐ€ x์˜ ์™ผ์ชฝ์ž์‹์ด๋‹ค
           	else right[p[x]] <- y	// y๊ฐ€ x์˜ ์ƒˆ๋กœ์šด ์˜ค๋ฅธ์ชฝ ์ž์‹์ด๋ผ๋ฉด,
    left[y] <- x	// Put x on y's left. x๊ฐ€ y์˜ ์™ผ์ชฝ์ž์‹์ด๋‹ค
    p[x] <- y	// x์˜ ๋ถ€๋ชจ๊ฐ€ y๊ฐ€ ๋œ๋‹ค
}

y = right[x] != NIL์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๋ฃจํŠธ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋„ NIL์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๋Œ“๊ธ€