ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ‘€ Overview

Space club ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋‹น์‹œ, ๊ฐ ํด๋Ÿฝ ๋ณ„ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๊ณต์ง€, ๋Œ“๊ธ€๋“ฑ์„ ์ž‘์„ฑํ•  ๋•Œ ๊ธˆ์น™์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ์— ์‹คํŒจํ–ˆ๋‹ค๋Š” ๋ชจ๋‹ฌ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ ์ž‘์„ฑ์— ์‹คํŒจํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ์—ˆ๋‹ค.

์ด๋•Œ, ์ž…๋ ฅ๋ฐ›๋Š” ๊ฐ’์— ๊ธˆ์น™์–ด๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์— ์žˆ์–ด์„œ Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๊ทธ๋•Œ์˜ ์ƒ๊ฐํ”„๋กœ์„ธ์Šค๋ฅผ ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.

๋˜ํ•œ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ ˆ๋ฒจ์—์„œ์˜ ๋ฌธ์ œ์ ์€ ์—†๋Š”์ง€ ๊ณ ์ณ ๋ณด๋ ค ํ•œ๋‹ค.

๊ธ€ ์ž…๋ ฅ์‹œ ๊ธˆ์น™์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ์ž‘์„ฑ ๋ถˆ๊ฐ€

๐Ÿ”ญ ์ž๋ฃŒ๊ตฌ์กฐ / ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒํ•˜๊ธฐ!

๋จผ์ € ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š”๊ฒƒ์ด ํŠน์ • ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ•ด๋‹น ๋ฌธ์ž์—ด์— ๊ธˆ์น™์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค.

๋จผ์ €, ๊ธˆ์น™์–ด๋ฅผ List ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ €์žฅํ•ด ๋†“๊ณ  ๋น„๊ต๋ฅผ ํ•œ๋‹ค๋ฉด, ๊ธˆ์น™์–ด List ํฌ๊ธฐ๊ฐ€ N์ด๊ณ , ์ž…๋ ฅ๋ฐ›๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ M์ผ๋•Œ, 

์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(MN)์ด ๋œ๋‹ค.

 

์ด๋•Œ, ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„์ง€ ๊ณ ๋ฏผํ–ˆ๋‹ค.

๋ฌธ์ž์—ด ๊ด€๋ จ ์‹œ๊ฐ„๋ณต์žก๋„..? ์•Œ๊ณ ๋ฆฌ์ฆ˜?

 

๋จผ์ € ๋จธ๋ฆฌ์†์— ๋– ์˜ค๋ฅธ๊ฑด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•™์Šต ์‹œ ํ•™์Šตํ–ˆ๋˜ KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์˜€๋‹ค.

๋‹คํ–‰ํžˆ KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์˜ˆ์ „์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•™์Šตํ•˜๋ฉฐ ์ •๋ฆฌํ•ด ๋†“์€ ๊ธ€์ด ์žˆ์–ด [์—ฌ๊ธฐ]๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค!

 

[KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•œ๊ณ„]

ํ•˜์ง€๋งŒ ์ด KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•˜๋‚˜์˜ ๊ธด ํŒจํ„ด์„ ๋Œ€๋Ÿ‰์˜ ํ…์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ์— ํšจ๊ณผ์ ์ด๋‹ค.

๋ฌธ์ž์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ํ•ด์„œ ๋– ์˜ฌ๋ ค๋ดค์ง€๋งŒ, KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 

์šฐ๋ฆฌ๊ฐ€ ๊ธˆ์น™์–ด ๊ฐœ์ˆ˜๊ฐ€ N์ผ๊ฒฝ์šฐ, N๋งˆ๋‹ค O(M+ P)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ์— (P๋Š” ๊ธˆ์น™์–ด์˜ ๊ธธ์ด) ์ „์ฒด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋Œ€๋žต์ ์œผ๋กœ O(MN)์ด ๋œ๋‹ค. โžก ํšจ๊ณผ ์—†์Œ

 

[ํ•ด๊ฒฐ์ฑ… : ๊ฒ€์ƒ‰ํ•˜์ž!]

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ฐพ์•„๋ณด์•˜๊ณ , Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์— ํšจ์œจ์ ์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ถ”๊ฐ€๋กœ, ์•„ํ˜ธ์ฝ”๋ผ์‹(Aho-Corasick) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ , ์ด๋ฒˆ์— ๊ณต์œ ํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐ŸŒณ Trie ์ž๋ฃŒ ๊ตฌ์กฐ๋ž€

ํŠธ๋ผ์ด๋Š” ํŠธ๋ฆฌ์˜ ์ผ์ข…์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. 

๊ฐ ๋…ธ๋“œ๋Š” ๋ฌธ์ž ํ•˜๋‚˜์™€ ๋ฌธ์ž์—ด ์™„์„ฑ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํŠธ๋ผ์ด๋ฅผ ์–ด๋–ค ๊ฒฝ๋กœ๋กœ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋Š”์ง€์— ๋”ฐ๋ผ ๋ฌธ์ž์—ด์ด ์กฐํ•ฉ๋œ๋‹ค.

 

Tree ์ž๋ฃŒ๊ตฌ์กฐ / ์ถœ์ฒ˜ : https://www.javatpoint.com/tree

์œ„ Tree์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์ด์ง„ ๊ฒ€์ƒ‰์œผ๋กœ ํŠน์ • ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ O(logN)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

ํ•˜์ง€๋งŒ ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๋…ธ๋“œ์— ์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ M์ผ๋•Œ, ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(MlogN)์ด ๋œ๋‹ค. (์ •๋ ฌ๋œ ๋ฌธ์ž๋ฅผ ์ฐพ๊ณ , ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—)

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ Trie๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,

Trie ์ž๋ฃŒ๊ตฌ์กฐ / ์ถœ์ฒ˜ : https://en.wikipedia.org/wiki/Trie

Trie ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ 26๊ฐœ(์•ŒํŒŒ๋ฒณ)*2(๋Œ€์†Œ๋ฌธ์ž) + ์ˆซ์ž (0~9) ์ด 62๊ฐœ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ์ €์žฅํ•ด๋†“๋Š”๋‹ค๋ฉด, ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ M์ผ๋•Œ, ๊ฒ€์ƒ‰์„ O(M + K)์˜ ์‹œ๊ฐ„์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. (K๋Š” ์ž…๋ ฅ ๋ฌธ์ž์—ด์— ํฌํ•จ๋œ ๊ธˆ์น™์–ด ์ด ๊ธธ์ด)

 

์ด Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋‹ค์ˆ˜์˜ ๊ธˆ์น™์–ด๋ฅผ ํ•œ๋ฒˆ์˜ ์ž…๋ ฅ ๋ฌธ์ž์—ด ์Šค์บ”๋งŒ์œผ๋กœ ๊ฒ€์‚ฌ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค!

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ๊ธˆ์น™์–ด ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์— Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ–ˆ๋‹ค.

 

๐Ÿค” ์•„ํ˜ธ ์ฝ”๋ผ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? (Aho-Corasick Algorithm)  

์•„ํ˜ธ ์ฝ”๋ผ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ญ”์ง€ ์ฐพ์•„๋ณด๋‹ˆ, KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ผ๋Œ€์ผ ๋ฌธ์ž์—ด ํŒจํ„ด ๋งค์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์˜€๋‹ค๋ฉด, ์•„ํ˜ธ ์ฝ”๋ผ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ์ผ๋Œ€๋‹ค ๋ฌธ์ž์—ด ํŒจํ„ด๋งค์นญ์— ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์•„ํ˜ธ ์ฝ”๋ผ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ™•์žฅ์ด๋ฉฐ, ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

 

KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž์—ด๊ฐ„์˜ ๋งค์นญ์ด๋ผ๋ฉด, ์•„ํ˜ธ ์ฝ”๋ผ์‹์€ ๋ฌธ์ž์—ด๊ณผ ํŠธ๋ผ์ด ๊ฐ„์˜ ๋งค์นญ์ด๋‹ค.

 

์›๋ฆฌ๋Š”, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠธ๋ผ์ด๊ฐ€ ์žˆ์„ ๋•Œ, (S๋Š” ์ž…๋ ฅ๋ฐ›๋Š” ๋ฌธ์ž์—ด, W๊ฐ€ ๊ธˆ์น™์–ด ๋ชฉ๋ก๋“ค์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค)

์•„๋ž˜์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด S๋ฅผ ๋Œ๋ฉด์„œ ๊ธˆ์น™์–ด ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š”๋ฐ, ๋งค์นญ์— ์‹คํŒจ ํ–ˆ์„ ๊ฒฝ์šฐ ํฌ์ธํ„ฐ๋ฅผ ์‹คํŒจํ•œ ๋ฌธ์ž ์ „ ๊นŒ์ง€์˜ ์ผ์น˜ํ•œ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๊ฐ™์€ ์ง€์ ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

์ถœ์ฒ˜: https://pangtrue.tistory.com/305
ํŠธ๋ผ์ด์—์„œ ๋งค์นญ ๊ณผ์ • โ˜ ์ถœ์ฒ˜: https://pangtrue.tistory.com/305
ํŠธ๋ผ์ด์—์„œ ๋งค์นญ ์ค‘ ์‹คํŒจํ•œ ์ƒํ™ฉ โ˜ ์ถœ์ฒ˜: https://pangtrue.tistory.com/305

์œ„ ๊ฒฝ์šฐ ๋งค์นญ์ด ์‹คํŒจ ํ–ˆ์„ ๊ฒฝ์šฐ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง€์ ์„ ์ด๋™์‹œํ‚ค๋Š” fail ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํฌ์ธํ„ฐ๋ฅผ ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๊ฐ™์€ ์ง€์ ์ธ a (5๋ฒˆ ์ธ๋ฑ์Šค)๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

 

์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋”ฐ์ ธ๋ณด์ž๋ฉด, Trie๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ, ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ M์ด๊ณ , ๋ฌธ์ž์—ด์—์„œ ๋ฐœ๊ฒฌ๋œ ํŒจํ„ด(๊ธˆ์น™์–ด) ๋ฐœ์ƒ ํšŸ์ˆ˜๊ฐ€ Z์ผ๋•Œ, ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(M+Z)๊ฐ€ ๋œ๋‹ค. 

 

๐Ÿฅธ Trie ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒํ•˜๊ธฐ

์ž ๊ทธ๋Ÿผ ์ด๊ฑธ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์ž.

์ฐพ์•„๋ณด๋‹ˆ, ์ž๋ฐ”์—์„œ๋Š” Trie์— ๋Œ€ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. (Python ๊ฒฝ์šฐ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค)

์ด๊ฑธ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์œผ๋‚˜ ๋งค์šฐ ํšจ์œจ์ด ๋‚ฎ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ž˜ ๋งŒ๋“ค์–ด ๋†“์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

 

๋จผ์ € ํŒ€์›์ด ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๋‹น์‹œ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

https://github.com/npgall/concurrent-trees

 

GitHub - npgall/concurrent-trees: Concurrent Radix and Suffix Trees for Java

Concurrent Radix and Suffix Trees for Java. Contribute to npgall/concurrent-trees development by creating an account on GitHub.

github.com

์œ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Concurrent Radix Tree์™€ Concurrent Suffix Tree๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

README์™€ document๋ฅผ ๋ณด๋‹ˆ ์“ฐ๊ธฐ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” lock ๊ฑธ๊ธฐ์— thread์˜ blocking์ด ์ผ์–ด๋‚˜์ง€๋งŒ, ์ฝ๊ธฐ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” lock์„ ๊ฑธ์ง€์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.

์“ฐ๊ธฐ ์ž‘์—… ๋ฐœ์ƒ ์‹œ ์ผ์–ด๋‚˜๋Š” ์ผ / ์ถœ์ฒ˜ : https://github.com/npgall/concurrent-trees?

์ด๋ ‡๊ฒŒ Trie ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์ถ”๊ฐ€ํ• ๋•Œ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„์„œ ๋ฐ”๊ฟ”์ฃผ๊ณ , ๋™์‹œ์„ฑ๊นŒ์ง€ ๋ณด์žฅํ•ด์ค€๋‹ค๋‹ˆ ๋™์ ์œผ๋กœ ์šด์˜์ค‘์ธ ํŠธ๋ผ์ด์— ๊ธˆ์น™์–ด๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

๊ทธ๋Ÿผ Radix Tree์™€ Suffix Tree๋Š” ๋Œ€์ฒด ๋ญ˜๊นŒ?๐Ÿง

 ๐ŸŒฒ Radix Tree์— ๋Œ€ํ•ด์„œ

Trie vs Radix Tree (์ถœ์ฒ˜ : https://www.youtube.com/watch?v=E8ZGt2i3xkw)

Radix Tree๋Š” ์œ„ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ, ๊ณตํ†ต ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๋“ค์„ ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋กœ ์••์ถ•ํ•ด ์ €์žฅํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์œจ์„ ์ค„์ธ๋‹ค.

Node์˜ ๊นŠ์ด๊ฐ€ ์–•์•„์ง€๊ธฐ์—, ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๊ฐ€ ์งง์•„์ง€๊ณ  ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.

 

์œ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฐ€๋ณด๋ฉด, Radix Tree๋„ Radix Tree, Reveresed Radix Tree, Inverted Radix Tree๋กœ ๋‚˜๋‰˜๋Š”๋ฐ

์‚ฌ์šฉ ์˜ˆ์‹œ์™€ document๋ฅผ ๋ณด๊ณ  ์–ด๋Š ๊ฒฝ์šฐ์— ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Radix Tree๋Š” key์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํŠน์ • ํ‚ค๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์ฐพ์„๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Reversed Radix Tree๋Š” ๋ฐ˜๋Œ€๋กœ ์–ด๋–ค ํ‚ค๋กœ ๋๋‚˜๋Š”์ง€ ์•Œ๊ณ ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Inverted Radix Tree๋Š” ์™ธ๋ถ€ ๋ฌธ์„œ์—์„œ ํฌํ•จ๋œ ํŠน์ • ํ‚ค์›Œ๋“œ๋ฅผ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ž…๋ ฅ ๋ฐ›์€ ๋ฌธ์ž์—ด์— ํฌํ•จ๋œ ๊ธˆ์น™์–ด๋“ค์„ ์ฐพ์œผ๋ ค ํ•œ๋‹ค๋ฉด, Inverted Radix Tree๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. (docs์— ์ž˜ ์˜ˆ์‹œ๊ฐ€ ๋‚˜์™€์žˆ๋‹ค)

 

 ๐ŸŒฒ Suffix Tree์— ๋Œ€ํ•ด์„œ

์ถœ์ฒ˜ : https://github.com/npgall/concurrent-trees/blob/master/documentation/ConcurrentSuffixTreeUsage.md

Suffix Tree๋Š” ์œ„์™€๊ฐ™์ด ๋‹จ์–ด์˜ ๋ชจ๋“  ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Radix Tree์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (๋‹จ์ )

 

๊ทธ๋Ÿฌ๋ฉด ์™œ ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๋‹จ์–ด์˜ ๊ฒฝ์šฐ์˜์ˆ˜(์ ‘๋ฏธ์‚ฌ)๋ฅผ ์ €์žฅํ• ๊นŒ?

์ด์œ ๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ์‹œ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ๊ธฐ๋ณธ Radix Tree ์ž๋ฃŒ๊ตฌ์กฐ์ƒ ์œ„ TOAST ๋ฌธ์ž์—ด์—์„œ TO, TOA๋กœ๋ฅผ TOAST๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, OA, OAS ๊ฐ™์€ ๋ฌธ์ž๋กœ๋Š” TOAST๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋ฅผ Suffix Tree๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ Suffix Tree๋Š”  ํŠน์ • ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ๋ฌธ์ž๋“ค์„ ๊ตฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (์žฅ์ )

 

 

๐Ÿง ํŒ€์›์ด ์งœ ๋†“์€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๊ณ ์ณ๋ณด์ž!

private final InvertedRadixTree<String> TRIE = new ConcurrentInvertedRadixTree<>(new DefaultCharSequenceNodeFactory());

์œ„ InvertedRadixTree์— ๊ธˆ์น™์–ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋“œ์‹œ PostConstruct๋ฅผ ๋ฉ”์„œ๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์—…๋กœ๋“œ ํ›„ → ๋ฌธ์ž์—ด ์ž…๋ ฅ์‹œ containํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

 

์•„๋ž˜ ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด, DefaultCharSequenceNodeFactory๋Š” suffix tree ์‚ฌ์šฉ์‹œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ ๋†’ํ˜€ ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. 

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” Inverted Radix Tree๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ถ”์ฒœ๋˜๋Š” SmartArrayBasedNodeFactory๋กœ ๋ฐ”๊ฟ”์ฃผ์ž.

 

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํŒ€ ๋‚ด ๊ทœ์น™์œผ๋กœ ํ•™์Šตํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ๋…ธ์…˜์œผ๋กœ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”๋ฅผ ์ง„ํ–‰ํ•ด ํŒ€์›๋“ค์—๊ฒŒ ์‚ฌ์šฉํ•œ ์˜๋„๋ฅผ ๋‚ฉ๋“์‹œํ‚ค๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

๐Ÿค›๐Ÿป ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ตœ์„ ์ผ๊นŒ..?

์ง€๊ธˆ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์ด๋Š” List์™€ ๋น„๊ตํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์•„ํ˜ธ ์ฝ”๋ผ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹์ง€ ์•Š์„๊นŒ?

 

2ํŽธ์—์„œ ๊ณ„์†

๋งํฌ : ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป๊ธˆ์น™์–ด ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ๋ถ„์„ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด์ž! - (2) ์‹ค์ œ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ด๋ณด์ž!

 

Reference

์•„ํ˜ธ ์ฝ”๋ผ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : https://pangtrue.tistory.com/305

ํŠธ๋ผ์ด ์ž๋ฃŒ๊ตฌ์กฐ : https://www.youtube.com/watch?v=TohdsR58i3Q

Suffix Tree / Radix Tree:

https://www.youtube.com/watch?v=N70NPX6xgsA

https://cd4761.blogspot.com/2017/02/suffix-tree.html

https://comdolidol-i.tistory.com/149#%EC%A0%91%EB%AF%B8%EC%82%AC%20%ED%8A%B8%EB%9D%BC%EC%9D%B4(Suffix%20trie)-1

 

 

 
 
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday