[Algorithm] R-Tree

R-Tree๋Š” B-Tree์˜ ๋ณ€์ข…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.
R์€ Rectangle์˜ ์ถ•์•ฝ์ด๋‹ค.

์ด๊ฑด ์ง€๋ฆฌ์ ์ธ ์ขŒํ‘œ ํ‰๋ฉด ๊ธฐ๋ฐ˜์œผ๋กœ ๊ทผ์ ‘ํ•œ ์š”์†Œ๋“ค์„ ์ฐพ๋Š” ๊ฒƒ์— ์ตœ์ ํ™”๋˜์–ด์žˆ๋‹ค.
์‰ฝ๊ฒŒ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, "ํ˜„์žฌ ์œ„์น˜์—์„œ 50km ์ด๋‚ด์˜ ์‹๋‹น์„ ์ „๋ถ€ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์˜ค๋Š”" ๊ธฐ๋Šฅ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์— ์“ด๋‹ค.




๊ธฐ๋ณธ ์›๋ฆฌ

๊ณต๊ฐ„์— ์ตœ์†Œ ๊ฒฝ๊ณ„ ์‚ฌ๊ฐํ˜•(MBR, Minimum Bounding Rectangle)์ด๋ผ๋Š” ์‚ฌ๊ฐํ˜• ์˜์—ญ์„ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ธ์ ‘ ์˜์—ญ์„ ํŒ๋ณ„ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ MBR์€ ๋‹ค๋ฅธ MBR์— ์†ํ•˜๊ฑฐ๋‚˜ ๊ฒน์น  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ํฌํ•จ์ด๋‚˜ ๊ต์ฐจ, ์ธ์ ‘ ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฒƒ๋„ ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ ๊ฐ€๊นŒ์šด ์ƒ์„ธ ์ขŒํ‘œ ๊ฐ’์„ ์ฐพ์•„๊ฐ€๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  B-Tree์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, Tree level์€ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ค‘๊ฐ„ ๋‹จ๊ณ„์ผ ๋ฟ์ด๊ณ  ๋ชจ๋“  ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” leaf ๋…ธ๋“œ์—๋งŒ ์œ„์น˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์บ์‹œ๋ฅผ ์ž˜ ํƒ€๋Š” ํŽธ์ด๋‹ค.

B-Tree์ฒ˜๋Ÿผ ๋ฐธ๋Ÿฐ์Šค ๊ด€๋ฆฌ๋„ ๊ธฐ๋ณธ์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ์‚ฝ์ž…/์‚ญ์ œ์‹œ๋งˆ๋‹ค Split/Merge๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚œ๋‹ค.

๋ณต์žก๋„
์• ์ดˆ์— ์š”๊ตฌ์‚ฌํ•ญ ์ž์ฒด๊ฐ€ ๋น„๋Œ€ํ•˜๋‹ค๋ณด๋‹ˆ B-Tree ์ฒ˜๋Ÿผ ๋น ๋ฅธ ์„ฑ๋Šฅ (O(log N)) ๋ณด์žฅ์€ ์•ˆ๋œ๋‹ค.
ํƒ์ƒ‰ ์„ฑ๋Šฅ์€ ํ‰๊ท  O(log N), ์ตœ์•… O(N)์ด๋‹ค. ์‚ฝ์ž…๋„ ์ตœ์•… O(N)์ด๋‹ค.




๋ณ€ํ˜•

R-Tree์˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•œ ๋ณ€ํ˜• ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ R+Tree, R*ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.
์ด๋ฆ„ ์ง“๋Š” ๊ผฌ๋ผ์ง€๊ฐ€ ์™œ ์ด๋Ÿฐ๊ฑด์ง€




์‚ฌ์šฉ์‚ฌ๋ก€

๋งŽ์€ ์ขŒํ‘œ ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด R-Tree๋‚˜ R-Trer์˜ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•œ๋‹ค. GIS ๊ณ„์—ด๋“ค์€ ๊ฑฐ์˜ ๋‹ค ๊ทธ๋ ‡๋‹ค.

์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ณต๊ฐ„ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด R-Tree ํƒ€์ž… ์ธ๋ฑ์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค.
PostgreSQL์€ ๊ธฐ๋ณธ ์ธ๋ฑ์Šค ํƒ€์ž…์œผ๋กœ R-Tree๋ฅผ ์ง€์›ํ•œ๋‹ค.
MySQL์˜ Spatial Index์€ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ R-Tree ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์ขŒํ‘œ ๊ฒ€์ƒ‰ ํ™˜๊ฒฝ์ธ PostgreSQL/PostGIS๋„ R-Tree ๊ธฐ๋ฐ˜์˜ GIS ๊ตฌํ˜„์ฒด๋‹ค.


์—ญ์ฃผ
https://en.m.wikipedia.org/wiki/R-tree
https://www.postgresql.org/docs/8.1/indexes-types.html
https://gis.stackexchange.com/questions/263370/postgis-r-tree-why-does-it-exist-when-postgresql-already-implements-its-r-tree