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]:
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์ผ๋ก ๋ค์ด๊ฐ์ง๋ง ํ์ ๋
ธ๋๋ค๋ ํค๋ฅผ ๋๋ ์ค ์ ์์ ๋๋, ์ด๋์๋ ํค๋ฅผ ๊ฐ์ ธ ์ฌ ์ ์์ด์ ๋์ด์ ์ถ์๊ฐ ์ผ์ด๋๋ค.
- ์ด ๋๋, ๋ถ๋ชจ ๋
ธ๋์ ํ์ ๋
ธ๋๋ฅผ ํฉ์ณ์ฃผ๊ณ , ์์๋ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฃ์ด์ค๋ค.