Aho-Corasick Multiple Pattern Matching
์ด ๊ธ์ KMP ์๊ณ ๋ฆฌ์ฆ๊ณผ Trie ์๋ฃ๊ตฌ์กฐ์ ๋ํ ์ดํด๋ฅผ ์ ํ์ผ๋ก ์๊ตฌํฉ๋๋ค.
Motivation
์ด๋ค $n$๊ธ์์ ๊ธด ํ ์คํธ $T$์ ๋ํด, ์งง์ $m$๊ธ์์ ํจํด $P$๋ฅผ ๋งค์นญํ๋ ๋ฌธ์ ๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
- ๊ฐ์ฅ Naiveํ๊ฒ $T$์ ๋ชจ๋ ์์น์ ๋ํด $m$๊ธ์๋ฅผ ๋งค์นญํด๋ณด๋ ์๊ณ ๋ฆฌ์ฆ์ $O(nm)$ ์ ๋๋ค.
- KMP ์๊ณ ๋ฆฌ์ฆ ์ (์ธ์ ๊ฐ ์์ฑํ ๊ณํ์ ์์ง๋ง ์ฐ์ ์์๋ ๋ฎ์ต๋๋ค) ์ด๋ฅผ $O(n + m)$ ์ผ๋ก ์ค์ธ ์์ฒญ๋ ์ฑ๊ณผ๋ฅผ ๋ณด์ ๋๋ค.
KMP๊ฐ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์, T[i..i+L-1]
๊ณผ P
๋ฅผ ๋งค์นญํ๋ค๊ฐ ์ค๊ฐ์ ์คํจํ๋ค๊ณ ํ ๋, Naive ๋งค์นญ์ T[i+1..i+L]
์ ์๋ํ๋ฉด์ ์์์ ์ ๋ณด๋ฅผ ์ ํ ์ด์ฉํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฌ๋, ํจํด์ด abababa
์ธ๋ฐ, ababa๊น์ง ๋ง๊ณ ์ฌ์ฏ๋ฒ์งธ b๊ฐ ํ๋ ธ๋ค๋ฉด, ์ ๋ค์ฏ๊ธ์๊น์ง ๋ง์๋ค๋ ์ ๋ณด๋ฅผ ์ต๋ํ ์ด์ฉํ๊ณ ์ถ์ต๋๋ค. ์ด๋ฅผ ์ ๋ง ๊ฐ๋ฅํ ์ต๋๋ก ์ด์ฉํ๋ ๊ฒ์ด KMP ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ, ์ ์ํคํผ๋์์ ๋งํฌ์ ํจ๊ป BowBowBow๋์ ๋ธ๋ก๊ทธ ๊ธ์ ์ฐธ๊ณ ํ๋ฉด ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์๊ฒ ๋ฐฐ์ธ ์ ์์ต๋๋ค. ์์ ์, ์ ๋ช๊ธ์๊ฐ ๋ง์์์ ์ด์ฉํด์ ์ ๋ ๋ง์๋ฆฌ๊ฐ ์๋ ์์น๋ค์ ์คํตํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์คํจํจ์ ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์ด์ , ์ด๋ฅผ ํจํด์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ๋ก ํ์ฅํ๊ณ ์ ํฉ๋๋ค. ํจํด์ด $m_1, m_2, \dots m_k$ ๊ธ์์ $P_1, \dots P_k$ ๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
Algorithm
์คํจํจ์๋ ๊ฒฐ๊ตญ ์ด๋ค prefix๊น์ง๋ ๋ง์๋ค๋ ๊ฒ์ ์๊ณ ์๋ ๋ฐ์ ์ค๋๋ฐ, ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ํจํด์ ๋ํด ๋น์ทํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ณ ์ถ์ต๋๋ค.
Prefix ์ฌ๋ฌ๊ฐ๋ฅผ ๋์์ ๊ด๋ฆฌํ๋ ๊ฒ์ Trie๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ํ๋ ๊ฐ์ ๊ณผ ํจ๊ป ๋นจ๊ฐ ๊ฐ์ ์ด ๊ทธ๋ ค์ ธ ์์ต๋๋ค. ํ๋ ๊ฐ์ ์ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ณ ์๋ Trie์ ๊ฐ์ ์ด๊ณ , ๋นจ๊ฐ ๊ฐ์ ์ Failure function์ ์๋ฏธํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด Failure function์ ์ ์ํฉ๋๋ค.
โํจํด $P$์ ๋ํด, ๊ทธ prefix $Pโ$ ๊น์ง๋ฅผ ํ์ฌ ๋งค์นญํ๋ค๊ณ ํ์. ์ด๋, $Pโ$์ ํด๋นํ๋ ๋ ธ๋์ ์คํจ-๋ ธ๋ $f(Pโ)$ ์ ์ฐพ๋๋ฐ, ์ด๋ $Pโ$์ proper suffix์ด๋ฉด์, ๋ค๋ฅธ ํจํด์ prefix ์ธ ๊ฐ์ฅ ๊น์ ๋ ธ๋์ฌ์ผ ํ๋คโ
์ด ์กฐ๊ฑด์ด ๋ฌด์จ ๋ป์ธ์ง ์๊ฐํด๋ณด๋ฉดโฆ
- $Pโ$์ ๋งค์นญํ๋ค๊ฐ ์คํจํ๋ค๊ณ ํ๊ฒ ์ต๋๋ค. ์ด์ ๋์ด์ ์ด ํจํด์ ์งํํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด์ , ๋ฌด์จ ํจํด์ ๋
ธ๋ฆด์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆผ์์ cacba๋ฅผ ํ
์คํธ
T[i..]
์๋ค๊ฐ ๋๊ณ ๋งค์นญํ๋ค๊ฐ ์คํจํ๋ค๋ฉด ํ์ฌ ์์น์์ ๋น์ฅ ๋ ธ๋ฆด ์ ์๋ ํจํด์ acba, cba, ba, a ๋ฑ์ผ๋ก ์์ํ๋ ํจํด์ ๋ ธ๋ฆด ์ ์์ต๋๋ค. - ์ด๋ค ์ค ์ด๋ค ๋ค๋ฅธ ํจํด์ prefix์ฌ์ผ ๋ ธ๋ฆฌ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ ๊ฒ์ ๋๋ค.
- ์ด๋ฌํ ๋ ธ๋๋ค์ด ์ฌ๋ฌ ๊ฐ ์๋ค๋ฉด, acba ๋ ธ๋์ cba ๋ ธ๋ ์ค์๋ acba ๋ ธ๋๋ฅผ ๋จผ์ ํ์ธํด์ผ ํฉ๋๋ค. ์ด์ ๋, acbaโฆ ๋ฅผ ๋งค์นญํ๋ค๊ฐ ์คํจํ๋ฉด cbaโฆ ํจํด์ ๊ทธ ๋ค์์ ๋ ธ๋ ค๋ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์ฆ, ํ ์คํธ๋ฅผ ์ค์บํ๋ฉด์ ํธ๋ผ์ด๋ฅผ ๋ฐ๋ผ์ ์์ง์ด๋ค๊ฐ, ํธ๋ผ์ด์์ ๋์ด์ ๊ฐ๊ณณ์ด ์์ผ๋ฉด ์ต๋ํ ๋ค๋ฅธ ๋์ ์ ๋ ธ๋ฆด ์ ์๋ ๊ณณ์ผ๋ก ์ด๋ํด์ ๊ณ์ ์๋ํ๋ค๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค.
ํธ๋ผ์ด๋ ๋น ๋ฅด๊ฒ constructํ ์ ์์ผ๋ฏ๋ก, ์ด๋ฌํ ์คํจํจ์๋ฅผ ์ด๋ป๊ฒ ๊ณ์ฐํ ์ง๋ง ๋ฐ๋ก ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์คํจํจ์๋ BFS๋ฅผ ์ด์ฉํ์ฌ, depth๊ฐ ์์ ๋ ธ๋๋ถํฐ ๊น์ ๋ ธ๋๋ก ๊ฑด์คํฉ๋๋ค.
- ์ง๊ธ ๋ ธ๋ $x$๋ฅผ ๋ณด๊ณ ์๋ค๋ฉด, ์ด $x$๋ณด๋ค ๊น์ด๊ฐ ์์ ๋ ธ๋ ์ค ๋ฐ๋์ $f(x)$ ๊ฐ ์กด์ฌํฉ๋๋ค. (proper suffix์ ๊ธธ์ด๋ ์๊ธฐ์์ ๋ณด๋ค ์งง์ผ๋ฏ๋ก)
- $x$์ ๋ฐ๋ก ์ ๋ถ๋ชจ๋
ธ๋ $p(x)$ ์, $p(x)$์์ $x$๋ก ์ค๋ edge์ ์ํ๋ฒณ (์ฆ $x$์ ๋ง์ง๋ง ๊ธ์์ ํด๋นํ๋ ์ํ๋ฒณ)์ ์๊ณ ์์ต๋๋ค. ์ด๋ฅผ
c
๋ผ๊ณ ํ๊ฒ ์ต๋๋ค. - ๋ํ, ์คํจํจ์๋ depth๊ฐ ์์ ๋
ธ๋๋ถํฐ ๊ณ์ฐํ์ผ๋ฏ๋ก $f(p(x))$ ๋ ์๊ณ ์์ต๋๋ค. ๋ง์ฝ $f(p(x))$ ์์
c
๋ฅผ ์ด์ฉํ์ฌ ์ ์งํ๋ edge๊ฐ ์๋ค๋ฉด, ์ด๋ฅผ ๋ฐ๋ผ ์ ์งํฉ๋๋ค. - ๊ทธ๋ ์ง ์๋ค๋ฉด, $f(f(p(x)))$ ์๋ค ๋๊ณ ์๋ํ๊ณ โฆ ๋ฅผ ๋ฐ๋ณตํ๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ ํธ๋ผ์ด๋ฅผ ๋ฐ๋ผ๊ฐ๋ค๊ฐ ์ด๋ค ํจํด์ ๋์ ๋ง๋๋ฉด, ๊ทธ ํจํด์ ์ฐพ์๋ค๊ณ reportํ๋ฉด ๋ฉ๋๋ค. ์ฆ ๊ฐ ๋ ธ๋๋ ํน์ ๋ด๊ฐ ์ด๋ค ํจํด์ ๋์ ์๋์ง๋ฅผ ๋ฏธ๋ฆฌ ๊ธฐ์ตํ๊ณ ์์ด์ผ ํฉ๋๋ค. ์ด ์ ๋ณด๋ ์ฌ์ค Trie์ ๋ฌธ์์ด๋ค์ ์ง์ด๋ฃ์๋ ๋ฏธ๋ฆฌ ์ก์์ค ์ ์์ผ๋ฏ๋ก ํฌ๊ฒ ๋ฌธ์ ๋ ๊ฒ์ด ์์ต๋๋ค.
์ค์บ์ ๊ณผ์ ์ pseudocode๋ก ํํํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Complexity
์ํ๋ฒณ ํฌ๊ธฐ๋ฅผ $q$, ํจํด ์ ์ฒด์ ๊ธ์์์ ์ดํฉ์ $M$, ํ ์คํธ์ ๊ธ์์๋ฅผ $n$์ด๋ผ๊ณ ํ๊ฒ ์ต๋๋ค. ์ด๋,
- Pseudocode๋ฅผ ๋ณด๋ฉด ์๋ช ํ๊ฒ ์ค์บ์ $O(n)$ ์ธ๊ฒ ๊ฐ์ง๋ง, ์ค์ ๋ก๋ $n$์ next ํจ์๊ฐ ์๋ชจํ๋ ์๊ฐ๋งํผ์ด ๊ฑธ๋ฆฝ๋๋ค.
- ํธ๋ผ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅธ๋ฐ, ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ตฌํ์ธ child pointer array ๋ฐฉ์์ ์ฐ๋ ๊ฒฝ์ฐ $O(qM)$ ์๊ฐ์ ํธ๋ผ์ด๋ฅผ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ (BFS๋ฅผ ๋๋ ค์ผ ํด์ ์ด๋งํผ์ด ์๋ชจ๋ฉ๋๋ค) $O(qM)$ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํฉ๋๋ค.
- $q$๊ฐ ํฌ๋ฉด ์ด๊ฒ์ด ๋นํจ์จ์ ์ผ ์ ์๋๋ฐ, ํธ๋ผ์ด์ ๊ฐ ๋ ธ๋์ BBST๊ฐ์๊ฑธ ์ด๋ค๊ฑฐ๋ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฐ๋ฉด ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง๋๋ค. ๋ํ์ ์ผ๋ก BBST๋ฅผ ์ฐ๋ฉด $O(M \log q)$ ์๊ฐ์ ํธ๋ผ์ด๋ฅผ ๊ตฌ์ฑํ ์ ์๊ณ , $O(M \log q)$ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๋ ๋์ , next๊ฐ $O(\log q)$ ์๊ฐ์ด ๋ค๊ฒ ๋๋ฏ๋ก ์ค์บ์ด $O(n \log q)$ ๊ฑธ๋ฆฝ๋๋ค.
๋ฐ๋ผ์, ์ข ํฉํ๋ฉด ๊ฐ๋จํ๊ฒ๋ $O(qM + n)$ ์๊ฐ๊ณผ $O(qM)$ ๊ณต๊ฐ์ ์ด์ฉํ์ฌ multiple pattern matching์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.