[ํ์ ํธ๋ฆฌ] ํ ์ด๋ ์ดํดํ๋ B-ํธ๋ฆฌ
B-ํธ๋ฆฌ๋?
B-ํธ๋ฆฌ(B-tree)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ผ ์์คํ ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ์ ์ผ์ข ์ผ๋ก,
์ด์ง ํธ๋ฆฌ๋ฅผ ํ์ฅํด ํ๋์ ๋ ธ๋์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
์ฐจ์๊ฐ p์ธ B-ํธ๋ฆฌ์ ํน์ฑ
1)์ ์ด๋ ๋ ธ๋์ ๋ฐ์ ์ฑ์์ผ ํ๋ค.
์ฆ, root์ leaf๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ ธ๋์ pointer ์ = ์๋ธํธ๋ฆฌ ์ = ์ต์
leaf๊ฐ ์๋ ๋ ธ๋: pointer ์ - 1 ๊ฐ = ์๋ธํธ๋ฆฌ ์ - 1๊ฐ
(์๋ B-ํธ๋ฆฌ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, key์ ๊ฐ์๋ (pointer ๊ฐ์ - 1)์ผ ์ ๋ฐ์ ์๋ค. pointer ์ฌ์ด์ฌ์ด์ key๊ฐ ๋ค์ด๊ฐ๋ฏ๋ก!)
B-ํธ๋ฆฌ ๊ธฐ๋ณธ ๊ตฌ์กฐ
B-ํธ๋ฆฌ์ ๊ฒ์
๋ด๊ฐ ์ฐพ๊ณ ์ ํ๋ Key ๊ฐ์ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
์๋ฅผ๋ค์ด, key ๊ฐ์ด 42์ธ key๋ฅผ ์ฐพ๋๋ค๊ณ ํ๋ฉด, pointer๋ฅผ ๋ฐ๋ผ ์กฐ๊ฑด์ ๋ง๊ฒ ์ด๋ํ๋ฉฐ ๊ฒ์์ ํ๋ค.
ํด๋นํ๋ ๋ธ๋ก ๋ด์์๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฏ๋ก ์์ฐจ ํ์์ ํ๋ค.
B-ํธ๋ฆฌ์ ์ฝ์
- ์๋ก์ด Key๋ leaf ๋ ธ๋์ ์ฝ์ ํ๋ค
- ๋ ธ๋์ ์๋ก์ด key๊ฐ ๋ค์ด๊ฐ ๋น ๊ณต๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋จ์ํ leaf ๋ ธ๋์ ์ฝ์ ํ๋ค.
- ๋น ๊ณต๊ฐ์ด ์๋ ๊ฒฝ์ฐ, ์ฆ overflow๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ๋ถํ (split)ํ ํ ์ฝ์ ํ๋ค.
๋ถํ (split)
์ฝ์ ํ key ๊ฐ์ ๋ ธ๋์ ๋ฃ์์ ๋, ์ด key์ ๊ฐ์๋ฅผ M์ด๋ผ๊ณ ํ์.(์๋ ๊ทธ๋ฆผ์์ 10, 20, 30์ด๋ฏ๋ก ์ด ๊ฐ์ M = 3)
1. ⌈M / 2⌉ ๋ฒ์งธ์ key ๊ฐ์ ๋ถ๋ชจ ๋ ธ๋๋ก ์ด๋ํ๋ค. (๋ง์ฝ, ๋ถ๋ชจ ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์๋ก ๋ง๋ค์ด ์ค๋ค.)
(์๋ ๊ทธ๋ฆผ์์ 20์ ๋ถ๋ชจ ๋ ธ๋๋ก ์ฌ๋ ค์ค๋ค!)
2. ๋๋จธ์ง key ๊ฐ๋ค์ ์ ๋ฐ์ฉ ๋๋์ด ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋๋ค.
์ญ์ ๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผrun
์ง์ ์ฝ์ ์ ํด๋ณด์!
์ฃผ์ด์ง ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ฐจ์๊ฐ 3์ธ 3์ B-ํธ๋ฆฌ์ด๋ฏ๋ก, ์์ ๋ดค๋ B-ํธ๋ฆฌ์ ํน์ฑ์ ๋ณต์ตํ ๊ฒธ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ณด์.
p=3 ์ด๋ฏ๋ก,
์ฐจ์๊ฐ 3์ธ B-ํธ๋ฆฌ์ ํน์ฑ
1)์ ์ด๋ ๋ ธ๋์ ๋ฐ์ ์ฑ์์ผ ํ๋ค.
์ฆ, root์ leaf๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ ธ๋์ pointer ์ = ์๋ธํธ๋ฆฌ ์ = ์ต์ 2๊ฐ (
leaf๊ฐ ์๋ ๋ ธ๋: pointer ์ - 1 ๊ฐ = ์๋ธํธ๋ฆฌ ์ - 1๊ฐ
(์๋ B-ํธ๋ฆฌ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, key์ ๊ฐ์๋ (pointer ๊ฐ์ - 1)์ผ ์ ๋ฐ์ ์๋ค. pointer ์ฌ์ด์ฌ์ด์ key๊ฐ ๋ค์ด๊ฐ๋ฏ๋ก!)
(1) 22๋ฅผ ์ฝ์ (ํ๋์ ์ ์ ๋ฐ๋ผ๊ฐ๋ณด์)
22๊ฐ ๋ค์ด๊ฐ ์๋ฆฌ๊ฐ ๋น์ด์์ผ๋ฏ๋ก ๋จ์ํ๊ฒ ์ฝ์ ํ๋ค.
[20, ] -> [20, 22]
(2) 59๋ฅผ ์ฝ์
59๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํ๋๋, 59๊ฐ ๋ค์ด๊ฐ leaf ๋ ธ๋์๋ ์ด๋ฏธ 50,58๋ก ๊ฝ ์ฐจ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถํ (split)์ ํด์ค ๋!
[50, 58, 59]
1) ํ์ฌ ์ด key ๊ฐ์ด 3๊ฐ์ด๋ฏ๋ก, ⌈M / 2⌉ ๋ฒ์งธ = ⌈3 / 2⌉ = 2 ๋ฒ์งธ ๊ฐ, ์ฆ 58์ ๋ถ๋ชจ ๋ ธ๋๋ก ์ฌ๋ ค์ค๋ค.
=> ๋ถ๋ชจ ๋ ธ๋๋ [60, ] ์์ [58, 60] ์ด ๋๊ฒ ์ฃ ?
2) 50๊ณผ 59๋ ๊ฐ๊ฐ [58 ,60] ์ค 58์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์๋ธํธ๋ฆฌ๊ฐ ๋๋ค.
3) 54๋ฅผ ์ฝ์
์กฐ๊ธ ๋ ์ด๋ ต๋ค. ๋ถํ ์ด ๋ ๋ฒ ์ด์ ๋์ค๋ ์ ํ! ์ด๊ฒ๊น์ง ์ดํดํ๋ฉด ์ฝ์ ์ ๊ฑฐ์ ๋ค ์ดํดํ๋ค๊ณ ๋ด๋๋๋ฏ๋ก ๋์ ํด๋ณด์.
์, ์ฐ์ 54๋ฅผ ๋ฃ์ leaf ๋ ธ๋๋ฅผ ์ฐพ์๊ฐ ๋ดค๋๋ [50, 57]๋ก ๊ฝ ์ฐจ์๋ค.
๊ทธ๋ ๊ธฐ์ ๋ถํ ์ ํด์ค๋ค.
[50, 54, 57]
1) ํ์ฌ ์ด key ๊ฐ์ด 3๊ฐ์ด๋ฏ๋ก, ⌈M / 2⌉ ๋ฒ์งธ = ⌈3 / 2⌉ = 2 ๋ฒ์งธ ๊ฐ, ์ฆ 54๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ก ์ฌ๋ ค์ค๋ค.
2) ๋ถ๋ชจ ๋ ธ๋๊ฐ [58, 60]์ผ๋ก ๊ฝ ์ฐจ ์์ผ๋ฏ๋ก ์ญ์ ๋ถํ ์ ์์ํ๋ค.
[54, 58, 60]
2-1) ํ์ฌ ์ด key ๊ฐ์ด 3๊ฐ์ด๋ฏ๋ก, ⌈M / 2⌉ ๋ฒ์งธ = ⌈3 / 2⌉ = 2 ๋ฒ์งธ ๊ฐ, ์ฆ 58๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ก ์ฌ๋ ค์ค๋ค.
2-2) ๋ถ๋ชจ ๋ ธ๋๊ฐ [19, 43]์ผ๋ก ๊ฝ ์ฐจ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ ๋ถํ ์ ํด์ค์ผ ํ๋ค!
[19, 43, 58]
3-1) ํ์ฌ ์ด key ๊ฐ์ด 3๊ฐ์ด๋ฏ๋ก, ⌈M / 2⌉ ๋ฒ์งธ = ⌈3 / 2⌉ = 2 ๋ฒ์งธ ๊ฐ, ์ฆ 43์ ๋ถ๋ชจ ๋ ธ๋๋ก ์ฌ๋ ค์ค๋ค.
3-2) ๋ถ๋ชจ ๋ ธ๋์ธ [69, ]์ ๋น ์๋ฆฌ๊ฐ ์์ผ๋ฏ๋ก ๋จ์ ์ฝ์ ํด์ค๋ค.
[69, ] => [43, 69]
3-3) 19์ 58๋ ๊ฐ๊ฐ [43 ,69] ์ค 43์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์๋ธํธ๋ฆฌ๊ฐ ๋๋ค. [19, ] ์ [58, ] ์ด ๋๊ฒ ์ฃ ?
3-4) 54์ 60์ [58, ]์ ๊ฐ๊ฐ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๊ฐ ๋๋ค. [54, ]์ [60, ] ์ด ๋๋ค.
3-5) 50๊ณผ 57์ [54, ]์ ๊ฐ๊ฐ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๊ฐ ๋๋ค. [50, ]์ [57, ] ์ด ๋๋ค.
๊ฐ ๋ ธ๋์ pointer๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ณณ์ ๊ทธ๋๋ ๊ฐ๋ฆฌํค๋๋ก ์ ์งํด์ค๋ค.
๊ฒฐ๊ตญ overflow๊ฐ ๋ฐ์ํ๋ฉด ๋ถํ ํ๋ ๊ณผ์ ์ ๋ฐ๋ณต์ด๋ค. ์ง์ ๊ทธ๋ ค๋ณด๋ฉด์ ํ๋ค ๋ณด๋ฉด ์ด๋ ต์ง ์๋ค.
B - ํธ๋ฆฌ์ ์ญ์
1) ์ญ์ ํ ํค๊ฐ leaf ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
ํํ ํค ๊ฐ๊ณผ ์๋ฆฌ ๊ตํ ํ leaf ๋ ธ๋์์ ์ญ์
(์ ํ ํค๋ ๊ตํํ ์ง ๋๋ ํํํค๋ ๊ตํํ ์ง๋ ์ ํ๋ ์ฌ๋ ๋ง์์ด๋ค. ์ฐ๋ฆฐ ํํํค์ ๊ตํ์ผ๋ก ์ ํ์!
์ ํ ํค๋ ํด๋น key๋ณด๋ค ํธ๋ฆฌ์์ ์ผ์ชฝ์ ์๋ key ๊ฐ์ค ๊ฐ์ฅ ํฐ ๊ฐ, ์ฆ, ๋๋ณด๋ค ์์ ๊ฐ ์ค์ ์ต๋๊ฐ
ํํ ํค๋ ํด๋น key๋ณด๋ค ํธ๋ฆฌ์์ ์ค๋ฅธ์ชฝ์ ์๋ key ๊ฐ์ค ๊ฐ์ฅ ์์ ๊ฐ, ์ฆ ๋๋ณด๋ค ํฐ ๊ฐ ์ค์ ์ต์๊ฐ ์ ๋งํ๋ค.)
2) ์ญ์ ํ ํค๊ฐ leaf ๋ ธ๋์ธ ๊ฒฝ์ฐ
๋จ์ ์ญ์
๋๋
leaf ๋ ธ๋์์ underflow ๋ฐ์ํ ๊ฒฝ์ฐ์ (leaf ๋ ธ๋์ key ๊ฐ์๊ฐ ์ต์
์ฌ๋ถ๋ฐฐ(redistrubution) ๋๋ ํฉ๋ณ(merge) ํ์
์ฌ๋ถ๋ฐฐ - ํ์ ๋ ธ๋๊ฐ ์ต์ key ๊ฐ์ ๋ณด๋ค ๋ง์ key๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ
ํ์ ๋ ธ๋์ key -> ๋ถ๋ชจ ๋ ธ๋-> ๋ถ๋ชจ ๋ ธ๋์ ์๋ ํค ๊ฐ์ underflow ๋ฐ์ํ ๋ ธ๋๋ก ์ด๋, ๋ถ๋ชจ ๋ ธ๋์ ํ์ ๋ ธ๋์ key๊ฐ ์์นํจ.
ํฉ๋ณ - ์ฌ๋ถ๋ฐฐ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ (ํ์ ๋ ธ๋๋ ์ต์ key ๊ฐ์๋ฅผ ๊ฐ๋ ๋ฐ ์์ด์ ์ฌ์ ์ด ๋ง๋ ์น ์์ ๊ฒฝ์ฐ)
ํ์ ๋ ธ๋ + ๋ถ๋ชจ ๋ ธ๋์ key + underflow ๋ ธ๋๋ฅผ ํฉ์ณ ํ๋์ ๋ ธ๋๋ก ํฉ๋ณ
์ญ์ ๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผrun!
์ง์ ์ญ์ ๋ฅผ ํด๋ณด์.
1) 16 ์ญ์
16์ leaf ๋ ธ๋์ key๊ฐ์ด ์๋ ์ค๊ฐ ๋ ธ๋์ ์์ผ๋ฏ๋ก, ํํ ํค์ธ 18๊ณผ ๊ตํ ํ์ ์ญ์ ํ๋ค.
์ ๊ทธ๋ฐ๋ฐ ํํ ํค์ ๊ตํํ ํ leaf ๋ ธ๋์์ 16์ ์ญ์ ํ๋๋ underflow๊ฐ ๋ฐ์ํ๋ค.
(16์ด ์๋ ๋ ธ๋์ key์ ๊ฐ์๊ฐ 0์ด ๋๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ)
๊ทธ๋ ๋ค๋ฉด ์ฌ๋ถ๋ฐฐ๋ฅผ ์๋ํด๋ณธ๋ค. ํ์ ๋ ธ๋ํํ ๊ฐ์ ํํธ์ด ๋๋ค๋ฉด ๊ฟ์จ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค! ๋ง์น ํฅ๋ถ์ ๋๋ถ์ฒ๋ผ..
๊ทธ๋ฐ๋ฐ.. ํ์ ๋ ธ๋์ธ j๊ฐ 15๋ฅผ ๋น๋ ค์ฃผ๋ฉด j๋ underflow๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ฌ๋ถ๋ฐฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
(๋๋ถ ํ๋ j ๋ ํํธ์ด ์ข์ง ์์๋ค)
๊ทธ๋ ๋ค๋ฉด ๋ง์ง๋ง์ผ๋ก ํฉ๋ณ์ ์๋ํ๋ค.
๋ถ๋ชจ ๋ ธ๋์ key ๊ฐ์ธ 18๊ณผ ํ์ ๋ ธ๋, underflow๊ฐ ๋ฐ์ํ ๋ ธ๋๋ฅผ ํฉ๋ณํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ถ๋ชจ ๋ ธ๋์ 18์ด ํฉ๋ณ๋๋ฉด์ ์๋ ๋ถ๋ชจ ๋ ธ๋ d์์ underflow๊ฐ ๋ฐ์ํ๋ค. (18์ด ์๋ ๋ถ๋ชจ ๋ ธ๋์ key ๊ฐ์๊ฐ 0)
์ด ์ญ์ ์ฌ๋ถ๋ฐฐ๋ฅผ ์๋ํด๋ณด๊ณ , ์๋๋ฉด ํฉ๋ณ์ ์งํํ๋ค.
d์ ํ์ ๋ ธ๋ e๊ฐ 26์ ์ฃผ๊ฒ๋๋ฉด ์ญ์ ์ต์ key ๊ฐ์๋ฅผ ๊ฐ์ง ๋ชปํ๋ฏ๋ก, ํฉ๋ณ์ ์งํํ๋ค.
์ฐ๋ฆฌ๋ ์ญ์ ๋ฅผ ์ํ ๋ชจ๋ ๊ณผ์ ์ ์ดํดํ๋ค.
B-ํธ๋ฆฌ์ ์ฝ์ ๊ณผ ์ญ์ ๋ฅผ ์งํํ๋ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๋ฐ๊ฒฌํ ์ ์๋ค.
- B-ํธ๋ฆฌ๋ leaf leveld์ ๊ณ์ ์ ์ง๋๋ฉด์,
- ๋ ธ๋๊ฐ ๋์ด๋๋ฉด root ๋ฐฉํฅ ์ชฝ์ผ๋ก ๋์ด๋๊ณ
- ์ค์ด๋ค๋ฉด root ๋ถํฐ ์ค์ด๋ ๋ค.
์๊ฐ ๋ณต์ก๋
Red-Black ํธ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํญ์ ์ข, ์ฐ ์์ ๋ ธ๋ ๊ฐ์์ ๋ฐธ๋ฐ์ค๋ฅผ ์ ์งํ๋ฏ๋ก ํญ์ ์๊ฐ ๋ณต์ก๋ O(logN)์ ๋ณด์ฅํ๋ค.
๋ฐฐ์ด, ์ด์ง ํ์ ํธ๋ฆฌ, Red-Black ํธ๋ฆฌ, B-ํธ๋ฆฌ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋น๊ตํด๋ณด๋ฉด,
๋ฐฐ์ด์ ์ต์ ์ ๊ฒฝ์ฐ O(n)
์ด์ง ํ์ ํธ๋ฆฌ๋ ํ๊ท ์ ์ผ๋ก O(log n), ์ต์ ์ ๊ฒฝ์ฐ O(n) ํ ์ค๋ก ์ญ ๋๊ฐ๋ ๊ฒฝ์ฐ..
Red-Black ํธ๋ฆฌ์ B-Tree๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ O(log n )
B-Tree์ Red-Black Tree์ ์ฐจ์ด (์ ๋ณด ์ถ์ฒ: https://steady-coding.tistory.com/558)
์ฐ์ , B-Tree๋ ํธ๋ฆฌ์ ๋์ด๊ฐ ์๋์ ์ผ๋ก ์์ ์ ๋ฐ์ ์๋ค. ํ ๋ ธ๋์ ์ฌ๋ฌ ๊ฐ์ key๊ฐ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ!
B-Tree์ ๊ฐ ๋ ธ๋๋ ๋ฐฐ์ด๋ก์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฐจ๋ก๋๋ก ์ ์ฅ์ด ๋์ด ์๋ค๊ณ ํ๋ค.
๊ฐ์ ๋ ธ๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ค๋ผ๋ฆฌ ๊ตณ์ด ์์ ๋ ธ๋์ฒ๋ผ ์ฐธ์กฐ ํฌ์ธํฐ ๊ฐ์ผ๋ก ์ ๊ทผํ ํ์๊ฐ ์๋ค.
์ฆ, ๊ฐ์ ๋ ธ๋ ์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋๋ ํฌ์ธํฐ ์ ๊ทผ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ค์ ๋ฉ๋ชจ๋ฆฌ ๋์คํฌ์์ ๋ฐ๋ก ๋ค์ ์ธ๋ฑ์ค์ ์ ๊ทผ์ ํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ฉด RedBlack-Tree๋ ๊ฐ ๋ ธ๋๋ง๋ค ๋ฌด์กฐ๊ฑด ํ๋์ ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ฒ ๋๋ฏ๋ก ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ๋ ๋ฌด์กฐ๊ฑด ์ฐธ์กฐ ํฌ์ธํฐ๋ก ์ ๊ทผํ๋ค.