TIL 008 BํŠธ๋ฆฌ

์กฐ์„ฑํ˜„ยท2021๋…„ 1์›” 8์ผ
0

์ •๊ธ€

๋ชฉ๋ก ๋ณด๊ธฐ
9/21

BํŠธ๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋งํฌ์˜ ์ž๋ฃŒ๋ฅผ ๋ฒˆ์—ญํ•˜๊ณ  ์ •๋ฆฌํ•˜์˜€๋‹ค. ์ด๋ฏธ์ง€์™€ ์ฝ”๋“œ๊ฐ€ ํ•จ๊ป˜ ๋‚˜์™€ ์žˆ์Œ์œผ๋กœ ๋‹ค์Œ ๋งํฌ์—์„œ ์ฐธ์กฐํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
https://www.programiz.com/dsa/b-tree

c๋กœ ๊ตฌํ˜„ํ•œ bํŠธ๋ฆฌ ๋งํฌ์ด๋‹ค.
github ๋งํฌ

๐Ÿ‘‰ BํŠธ๋ฆฌ๋ž€

BํŠธ๋ฆฌ๋Š” self-balancing search tree ๋…ธ๋“œ ๋‹น ํ•œ ๊ฐœ ์ด์ƒ์˜ ํ‚ค๋ฅผ ๊ฐ€์ง์œผ๋กœ์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹์„ ๋‘˜ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

๐Ÿ‘‰ ์™œ BํŠธ๋ฆฌ์ธ๊ฐ€?

BํŠธ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ํ•˜๋“œ๋””์Šคํฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๊ธฐ์กด์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค(key)๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉด ํŠธ๋ฆฌ์˜ ๋†’์ด(height)๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ , ์ž๋ฃŒ๋ฅผ ์ฝ์–ด๋“œ๋ฆฌ๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ•„์š”๋กœ ํ•˜๊ฒŒ ๋œ๋‹ค. BํŠธ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค๋ฅผ ํ•œ ๋…ธ๋“œ์— ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ๋†’์ด๋ฅผ ์ค„์ด๊ณ  ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
๋˜ํ•œ, ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์™€ Secondary ๋ฉ”๋ชจ๋ฆฌ์˜ ์ˆ˜ํ–‰์†๋„๊ฐ€ ๋‹ค๋ฆ„์œผ๋กœ, main ๋ฉ”๋ชจ๋ฆฌ ์ž…์žฅ์—์„œ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋” ์ค„์–ด๋“ ๋‹ค.

๐Ÿ‘‰ BํŠธ๋ฆฌ ํŠน์„ฑ

๋ชจ๋“  ๋…ธ๋“œ x์—๋Š” key๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‹ด๊ฒจ์žˆ๋‹ค.
๊ฐ ๋…ธ๋“œ์—๋Š” x.leaf๊ฐ€ boolean์ด x์˜ leaf ์—ฌ๋ถ€๋ฅผ ๋‹ด๋Š”๋‹ค.
n์ฐจ์›์˜ BํŠธ๋ฆฌ๋Š” n-1๊ฐœ์˜ key๋ฅผ ๊ฐ–๋Š”๋‹ค
๋ฃจ๋ฅด๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ n๊ฐœ, ์ตœ์†Œ n/2๊ฐœ์˜ ์ž์‹์„ ๊ฐ–๋Š”๋‹ค.
๋ชจ๋“  ๊ฐ€์ง€(leaf)๋Š” ๊ฐ™์€ ๊นŠ์ด(depth)๋ฅผ ๊ฐ–๋Š”๋‹ค.
๋ฃจํŠธ๋Š” ์ตœ์†Œ 1๊ฐœ์˜ key์™€ 2๊ฐœ์˜ ์ž์‹์„ ๊ฐ–๋Š”๋‹ค.

๐Ÿ‘‰ BํŠธ๋ฆฌ ๊ธฐ๋Šฅ

1. ํƒ์ƒ‰

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰๊ณผ ๊ฐ™๋‹ค.

  • ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด, ์ฒซ ๋ฒˆ์งธ ํ‚ค ๊ฐ’๊ณผ ๋น„๊ตํ•ด ๋‚ด๋ ค๊ฐ„๋‹ค. ๋งŒ์•ฝ ํ‚ค ๊ฐ’์ด ๊ฐ™์„ ๊ฒฝ์šฐ index์™€ ๋…ธ๋“œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ๋งŒ์•ฝ k.leaf = True ๋ผ๋ฉด Null ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋งŒ์•ฝ k < ์ฒซ ๋ฒˆ์งธ ํ‚ค ๊ฐ’์ด๋ผ๋ฉด, ์ด ํ‚ค์˜ ์™ผ์ชฝ ์ž์‹๋“ค์„ ํƒ์ƒ‰ํ•ด๋‚˜๊ฐ„๋‹ค.
  • ๋งŒ์•ฝ k > ์ฒซ ๋ฒˆ์งธ ํ‚ค ๊ฐ’์ด๋ผ๋ฉด, ์ด ๋…ธ๋“œ์˜ ๋‹ค์Œ ํ‚ค๋“ค๊ณผ ๋น„๊ตํ•œ๋‹ค. ๋งŒ์•ฝ k < ๋‹ค์Œ ํ‚ค ๊ฐ’์ด๋ผ๋ฉด, ์ด ํ‚ค์˜ ์™ผ์ชฝ ์ž์‹๋“ค์„ ํƒ์ƒ‰ํ•ด๋‚˜๊ฐ„๋‹ค. ๋งˆ์ง€๋ง‰ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ด ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹๋“ค์„ ํƒ์ƒ‰ํ•ด๋‚˜๊ฐ„๋‹ค.
  • ๊ฐ’์„ ์ฐพ๊ฑฐ๋‚˜, leaf์— ๋‹ฟ์„ ๋•Œ๊นŒ์ง€ ์œ„๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
BtreeSearch(x,k)
i=1
while i<= n[x] and k >= keyi[x]: # n[x] means number of keys in x node
	do i = i + 1
if k= keyi[x]:
	return (x, i)
if leaf[x]:
	return Null
else
	return BtreeSearch(ci[x], k)

2. ์‚ฝ์ž…

BํŠธ๋ฆฌ์˜ ์‚ฝ์ž…์€ ๋‘ ๊ฐ€์ง€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
1) ์‚ฝ์ž…ํ•  ์œ„์น˜๊นŒ์ง€์˜ ํƒ์ƒ‰ํ•œ ๋’ค ์‚ฝ์ž…
2) ํ•„์š”ํ•œ ๊ฒฝ์šฐ์˜ ๋…ธ๋“œ ๋ถ„ํ• 

  • ๋งŒ์•ฝ ํŠธ๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด, ๋ฃจํŠธ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ‚ค๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  • ๋…ธ๋“œ์˜ ํ‚ค ๊ฐฏ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
  • ์‚ฝ์ž…๋  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  • ๋งŒ์•ฝ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋“ ์ฐจ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์Šคํ…๋“ค์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ์ผ๋‹จ ์˜ค๋ฆ„์ฐจ์ˆœ์— ๋”ฐ๋ผ ์‚ฝ์ž…์„ ํ•œ๋‹ค.
    • ์ด์ œ, ์ด์ œ ๋…ธ๋“œ ์ˆ˜๊ฐ€ limit์„ ๋„˜๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„(median)์„ ๊ธฐ์ค€์„ ๋ถ„ํ• ์‹œํ‚จ๋‹ค.
    • ์ค‘๊ฐ„ ํ‚ค๋ฅผ ๋ถ€๋ชจ์˜ ํ‚ค๋กœ ๋ณด๋‚ธ๋‹ค. ์™ผ์ชฝ ํ‚ค๋“ค์€ ์™ผ์ชฝ ์ž์‹์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํ‚ค๋“ค์€ ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
    • (๋ถ€๋ชจ๋กœ ๋ณด๋‚ธ ํ‚ค์— ์˜ํ•ด ๋ถ€๋ชจ๋„ limit์„ ๋„˜๊น€๋‹ค๋ฉด ๊ฐ™์€ ์Šคํ…์ด ์‹คํ–‰๋œ๋‹ค.)
  • ๋งŒ์•ฝ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง ์ฐจ์ง€ ์•Š์•˜๋‹ค๋ฉด, ์˜ค๋ฆ„์ฐจ์ˆœ์— ๋”ฐ๋ผ ์‚ฝ์ž…ํ•œ๋‹ค.

3. ์‚ญ์ œ

BํŠธ๋ฆฌ์˜ ์‚ญ์ œ๋Š” ์„ธ ๊ฐ€์ง€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
1) ์‚ญ์ œํ•  ํ‚ค๋ฅผ ํƒ์ƒ‰
2) ํ‚ค ์‚ญ์ œ
3) BํŠธ๋ฆฌ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค. ์ด๋•Œ ๋…ธ๋“œ๊ฐ€ ์ตœ์†Œ์˜ ํ‚ค ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•˜๋Š” underflow๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Case#1: leaf์—์„œ ์‚ญ์ œ ๋  ๋•Œ

  • ์‚ญ์ œ ํ›„์—๋„ ํ‚ค๊ฐ€ ์ตœ์†Œ ๊ฐฏ์ˆ˜ ์ด์ƒ์œผ๋กœ ๋‚จ์„ ๋•Œ -> OK.
  • ์‚ญ์ œ ํ›„์— ํ‚ค๊ฐ€ ์ตœ์†Œ ๊ฐฏ์ˆ˜ ์•„๋ž˜ ์ผ ๋•Œ -> ๋‹ค์Œ ์Šคํ… ์‹คํ–‰
    • ์™ผ์ชฝ ํ˜•์ œ(sibling) ๋…ธ๋“œ๊ฐ€ ํ‚ค๋ฅผ ๋‚˜๋ˆ ์ฃผ์–ด๋„ ์ตœ์†Œ ๊ฐฏ์ˆ˜ ์ด์ƒ์ผ ๋•Œ -> ์™ผ์ชฝ ํ˜•์ œ ๋…ธ๋“œ์— ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ํ‚ค๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ๋ณด๋‚ด๊ณ , ์›๋ž˜ ์žˆ๋˜ ๋ถ€๋ชจ ํ‚ค๋กœ ๋‚ด ๋ถ€์กฑํ•œ ํ‚ค๋ฅผ ์ฑ„์šด๋‹ค.
    • ์™ผ์ชฝ ํ˜•์ œ๊ฐ€ ์ค„ ์ˆ˜ ์—†๊ณ , ์˜ค๋ฅธ์ชฝ ํ˜•์ œ ๋…ธ๋“œ๊ฐ€ ํ‚ค๋ฅผ ๋‚˜๋ˆ ์ค„ ์ˆ˜ ์žˆ์„ ๋•Œ -> ์˜ค๋ฅธ์ชฝ ํ˜•์ œ ๋…ธ๋“œ์— ๊ฐ€์žฅ ์™ผ์ชฝ ํ‚ค๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ๋ณด๋‚ด๊ณ  ์›๋ž˜ ์žˆ๋˜ ๋ถ€๋ชจ ํ‚ค๋กœ ๋‚ด ๋ถ€์กฑํ•œ ํ‚ค๋ฅผ ์ฑ„์šด๋‹ค.
    • ๋‘˜ ๋‹ค ํ‚ค๋ฅผ ๋‚˜๋ˆ  ์ค„ ์ˆ˜ ์—†์„ ๋•Œ-> ์™ผ์ชฝ ๋ถ€๋ชจ ํ‚ค๋ฅผ ์™ผ์ชฝ ์ž๋…€ ํ‚ค ๊ฐ’๊ณผ ํ•ฉ์ณ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

Case#2: ํŠธ๋ฆฌ ๋‚ด๋ถ€์—์„œ ์‚ญ์ œ ๋  ๋•Œ
inorder predecessor = ๋‚ด ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ ํฐ ํ‚ค
inorder successor = ๋‚ด ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ํ‚ค

  • ๋งŒ์•ฝ ์™ผ์ชฝ ์ž์‹์ด ๋” ์ž์‹์ด ๋งŽ๊ณ  inorder predecessor๋กœ ์‚ญ์ œ๋œ ํ‚ค๊ฐ€ ๋Œ€์ฒด๋˜์–ด๋„ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ตœ์†Œ ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ€์งˆ ๋•Œ -> OK.
  • ๋งŒ์•ฝ ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ๋” ์ž์‹์ด ๋งŽ๊ณ  inorder successor๋กœ ์‚ญ์ œ๋œ ํ‚ค๊ฐ€ ๋Œ€์ฒด๋˜์–ด๋„ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ตœ์†Œ ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ€์งˆ ๋•Œ -> OK.
  • ๋‘˜ ๋‹ค ์ค„ ์ˆ˜ ์—†์„ ๋•Œ -> ์™ผ์ชฝ ์ž์‹๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹์„ ํ•ฉ์นœ๋‹ค.
    • ์ž์‹๋“ค์„ ํ•ฉ์นœํ›„ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ตœ์†Œํ•œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ• ๋•Œ case#1 ์„ ์‹คํ–‰ํ•ด ์ฑ„์›Œ์ค€๋‹ค.

Case#3: ํŠธ๋ฆฌ์˜ ๋†’์ด(height)๊ฐ€ ์ถ•์†Œ ๋  ๋•Œ

  • ๋งŒ์•ฝ case#2 ์ฒ˜๋Ÿผ ํŠธ๋ฆฌ ๋‚ด๋ถ€์—์„œ ์‚ญ์ œ๊ฐ€ ์ผ์–ด๋‚ฌ์ง€๋งŒ ์ž์‹๋“ค์ด ํ‚ค๋ฅผ ์˜ฌ๋ ค ์ค„ ์ˆ˜ ์—†์–ด์„œ, case#1์œผ๋กœ ๋“ค์–ด๊ฐ”์ง€๋งŒ ํ˜•์ œ ๋…ธ๋“œ๋“ค๋„ ํ‚ค๋ฅผ ๋‚˜๋ˆ  ์ค„ ์ˆ˜ ์—†์„ ๋•Œ๋Š”, ์–ด๋””์„œ๋„ ํ‚ค๋ฅผ ๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์—†์–ด์„œ ๋†’์ด์˜ ์ถ•์†Œ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.
  • ์ด ๋•Œ๋Š”, ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ํ•ฉ์ณ์ฃผ๊ณ , ์ž์‹๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค.
profile
Jazzing๐Ÿ‘จโ€๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€