SlideShare a Scribd company logo
1 of 42
Download to read offline
Aho-Corasick Algorithm
장홍준
hongjun7@korea.ac.kr
• 패턴 집합에 대한 매칭 알고리즘
패턴이 1개라면 KMP Algorithm으로 선형에 해결
하지만 KMP는 패턴 개수에 비례하여 시간복잡도가 증가
O(m+zn) (m : 패턴들의 길이 합, z : 패턴 수, n : text 크기)
Aho-Corasick은 O(m + n + k)의 시간 복잡도로 패턴 집합에
대하여 패턴 길이와 텍스트의 선형 시간에 탐색을 처리할 수
있어요.(k : 텍스트 내에 패턴의 발생 수)
Aho-Corasick
• 크게 3단계로 나눌 수 있어요.
1. 패턴 string들에 대한 Trie(트라이) 구성
2. Failure Link와 Output Link 구성
3. Matching
Aho-Corasick
• 패턴 string 각각에 대해 Trie의 노드들을 따라가다가 갈
곳이 없다면 새로운 노드를 추가하는 방식으로 구성하면
됩니다. - O(m)
• 예를 들어 패턴이 {“ab”, “c”, “a”, “acd”}라면 다음과 같은
Trie가 구성이 되겠죠. 테두리가 빨간 노드들은 그곳에서
끝나는 패턴 string이 있습니다.
• Trie 구성 끝!
1. Trie
• 방금 구성한 Trie를 이용해 Failure Link의 필요성을
알아보겠습니다.
• Text가 “acabacd”이고, 우리는 이 텍스트에 등장하는 패턴
string들을 모두 알고 싶습니다.
Text : “acabacd”
Text의 처음 문자가 a이므로
Trie에서 a에 해당하는 노드로
이동합니다.
2. Failure Link
Text : “acabacd”
다음 문자가 c이므로 Trie에서 c에 해당하는 노드로
이동합니다.
2. Failure Link
Text : “acabacd”
다음 문자가 a이므로 Trie에서 a에 해당하는 노드로 이동해야
하는데, Trie에는 그런 노드가 존재하지 않습니다.
이전에는 첫 번째 문자인 a부터 탐색을
했으니 이젠 Trie의 루트로 돌아가서
두 번째 문자인 c에서부터 다시 탐색해야
할까요?
2. Failure Link
이전까지 Trie에서 지나온 경로들을 이용해 새로 탐색을
시작할 노드의 위치를 빠르게 알 수는 없을까?
라는 물음에서 Failure Link가 등장하게 됩니다.
앞의 경우에는 c라는 노드에서 새로 탐색을
시작하면 되고, 이 노드로 연결해주는
간선을 Failure Link라고 합니다.
2. Failure Link
Failure Link는 다음과 같은 과정으로 만들 수 있습니다.
1. Trie의 루트로부터 BFS를 수행하면서 Failure Link를
만든다.
2. 현재 위치(p)와 가리키는 노드(q)에 대해서
1) p가 루트라면, q의 Failure Link는 루트이다.
2) p가 루트가 아니면, p의 실패 링크(pf)에서 q와 같은
문자로 이어지는 노드(r)가 있는지 확인한다.
(1) 그런 r이 존재한다면 qf는 r을 가리킨다.
(2) 그런 r이 존재하지 않는다면, p에 pf를 대입하고
1)로 돌아가 과정을 반복한다.
2. Failure Link
• 처음에 예시로 들었던 Trie에서 Failure Link를 구성해
보겠습니다.
• 루트에서 BFS를 수행하면서 시작해 봅시다.
2. Failure Link
• BFS 중 현재 위치 p는 Trie의 루트 노드입니다.
• 루트가 가리키는 노드 a와 c는 루트가 가리키는
노드들이므로 Failure Link가 루트입니다.
• Failure Link는 붉은선으로 표시하겠습니다.
2. Failure Link
• BFS 중 현재 위치 p는 루트가 가리키는 노드 a입니다.
• p가 가리키는 노드 b(= q)를 보겠습니다.
• p의 Failure Link가 가리키는 Trie의 루트(=pf)는 문자 b를
가리키는 노드(r)가 없습니다.
2. Failure Link
• 따라서 p에다가 pf를 대입하고 다시 생각해보겠습니다.
• 현재 위치 p는 루트가 되었습니다.
• p가 루트이므로 q의 Failure Link는 루트(=qf)입니다.
2. Failure Link
• BFS 중 현재 위치 p는 루트가 가리키는 노드 a입니다.
• p가 가리키는 노드 c(= q)를 보겠습니다.
• p의 Failure Link가 가리키는 Trie의 루트(=pf)는 문자 c를
가리키는 노드(r)가 있으므로 qf는 r을 가리킵니다.
2. Failure Link
• BFS 중 현재 위치 p는 루트가 가리키는 노드 c입니다.
• p가 가리키는 노드가 없으므로 p에 대한 작업은 끝.
2. Failure Link
• BFS 중 현재 위치 p는 루트가 가리키는 노드 c입니다.
• p가 가리키는 노드가 없으므로 p에 대한 작업은 끝.
2. Failure Link
• BFS 중 현재 위치 p는 노드 a가 가리키는 노드 c입니다.
• p가 가리키는 노드 d(= q)를 보겠습니다.
• p의 Failure Link가 가리키는 노드 c(=pf)는 문자 d를
가리키는 노드(r)가 없습니다.
2. Failure Link
• 따라서 p에다가 pf를 대입하고 다시 생각해보겠습니다.
• 현재 위치 p는 노드 c가 되었습니다.
• p의 Failure Link가 가리키는 Trie의 루트(=pf)는 문자 d를
가리키는 노드(r)가 없습니다.
2. Failure Link
• 따라서 p에다가 pf를 대입하고 다시 생각해보겠습니다.
• 현재 위치 p는 루트가 되었습니다.
• p가 루트이므로 q의 Failure Link는 루트(=qf)입니다.
2. Failure Link
• 예시로 든 패턴의 Trie와 Failure Link 최종 모습입니다.
2. Failure Link
• 패턴들 중에 다른 패턴의 substring인 string이 존재하게
되면 Text에 등장하는 모든 패턴들을 탐색하지 못 할 수가
있어요.
• 이를 막기 위하여 출력 링크(Output Link)라는 자료 구조를
추가하게 됩니다.
• 처음에 각각의 패턴 string들이 끝이 나는 정점은 그 정점을
Sucess Link로 가지게 됩니다
2. Output Link(Output Link)
• BFS 도중, 현재 정점에서 Failure link를 따라 가서 패턴이
끝이 나게 되면 여러 단계의 Failure link를 무시하고 바로 그
정점으로 Output Link를 연결해주면 됩니다.
• Failure link를 추가할 때, 같이 Failure Link를 따라간 정점이
패턴의 끝이면 그 정점으로 Output Link를 연결해주고
그렇지 않으면 그 정점의 Output Link를 가져오면 됩니다.
2. Output Link(Output Link)
• 예시로 든 패턴의 Trie, Failure Link와 Output Link(푸른
간선)의 최종 모습이에요. 노드 안에 푸른 원이 있는 것은
자기 자신을 Output Link가 가리킨다는 표시입니다.
2. Output Link(Output Link)
• Text의 글자와 Trie의 노드에서 나가는 간선의 글자와
비교하면서 일치하면 해당 정점으로 이동하게 됩니다.
• 이동하면서 Output Link가 존재하는지 확인을 계속하고
Output Link가 존재하면 패턴이 발생했음을 의미합니다.
• 비교하다가 틀리게 되면 Failure link를 따라 가서 계속
글자를 비교해 주면서 탐색을 하게 됩니다.
• Text의 각 문자를 한 번 확인하였으면 다시 확인하지 않게
되고 따라서 O(m + n + k)의 시간 복잡도로 처리가
가능하게 됩니다. (m : 패턴들의 길이 합, n : Text의 길이,
k : 텍스트 내에 패턴의 발생 수)
3. Matching
• Text가 “dabcacdfc”라고 해보겠습니다.
• 앞서 구한 걸 이용해서 이 Text에 등장하는 모든 패턴
string들을 구해볼게요.
3. Matching
Text : dabcacdfc
현재 위치(p)는 트라이의 루트 노드입니다. p에서 d로 가는
노드가 없는데, p가 루트이므로 다음 Text 원소를 보죠.
3. Matching
Text : dabcacdfc
현재 위치(p)는 트라이의 루트 노드입니다. p에서 a로 가는
노드가 있으므로 갑니다. 그런데 노드 a에서 Output Link가
존재하네요!
3. Matching
Text : dabcacdfc
Text에 존재하는 패턴 string 중 하나인 “a”를 찾았습니다.
다음 Text 원소인 b를 보겠습니다.
3. Matching
Text : dabcacdfc
현재 위치 p에서 Output Link가 존재하네요!
Text에 존재하는 패턴 string 중 하나인 “ab”를 찾았습니다.
3. Matching
Text : dabcacdfc
현재 위치 p에서 노드 c로 나가는 간선이 없으므로 p의
실패노드인 루트로 갑니다.
3. Matching
Text : dabcacdfc
현재 위치 p에서 c로 가는 간선이 있으므로 노드 c로 갑니다.
3. Matching
Text : dabcacdfc
현재 위치 p에서 Output Link가 존재하네요! Text에 존재하는
패턴 string 중 하나인 “c”를 찾았습니다.
3. Matching
Text : dabcacdfc
Text의 다음 문자인 a를 보았는데, 현재 위치 p에서는 a로
나가는 간선 없으므로 실패링크를 타고 루트로 갑니다.
3. Matching
Text : dabcacdfc
현재 위치 p에서 a로 나가는 간선이 있으므로 갑니다.
3. Matching
Text : dabcacdfc
p에 Output Link가 있네요. “a”를 찾았습니다.
3. Matching
Text : dabcacdfc
현재 위치 p에서 c로 나가는 간선이 있으므로 갑니다.
3. Matching
Text : dabcacdfc
현재 위치 p에서 d로 나가는 간선이 있으므로 갑니다.
3. Matching
Text : dabcacdfc
현재 위치 p에 Output Link가 있습니다. “acd”가 Text에
존재하네요. Text의 다음 문자 f를 보았는데 p에서 나가는
간선이 없어서 실패링크를 타고 루트로 갑니다.
3. Matching
Text : dabcacdfc
루트에서도 f로 나가는 간선이 없으므로 Text의 다음 문자 c를
봅니다. p에서 나갈 수 있는 간선이 있으므로 갑니다.
3. Matching
Text : dabcacdfc
현재 위치 p가 있는 곳에 Output Link가 있네요. “c”를
찾았습니다. Text의 다음 문자가 없으므로 매칭이 종료됩니다.
3. Matching
앞서 보여드린 예시에서는 Output Link를 여러 번 따라가는
경우가 없었습니다.
만약 어떤 노드에서 Output Link가 존재하고 그 Link를
따라갔는데, 그 노드에서 또 Output Link가 존재한다면, 다른
패턴이 존재한다는 의미입니다. Output Link가 존재하지 않을
때까지 계속 따라가주면 됩니다.
3. Matching
감사합니다.
참고 : ‘프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략 2권’, 구종만
위키피디아 – 아호 코라식 알고리즘
End

More Related Content

What's hot

なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?ichirin2501
 
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介T. Suwa
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기CONNECT FOUNDATION
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Inc.
 
レコメンド研究のあれこれ
レコメンド研究のあれこれレコメンド研究のあれこれ
レコメンド研究のあれこれMasahiro Sato
 
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Inc.
 
全部Excelでやろうとして後悔するデータ分析
全部Excelでやろうとして後悔するデータ分析全部Excelでやろうとして後悔するデータ分析
全部Excelでやろうとして後悔するデータ分析__john_smith__
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Inc.
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 

What's hot (20)

Code jp2015 cpuの話
Code jp2015 cpuの話Code jp2015 cpuの話
Code jp2015 cpuの話
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説
 
Lockfree list
Lockfree listLockfree list
Lockfree list
 
レコメンド研究のあれこれ
レコメンド研究のあれこれレコメンド研究のあれこれ
レコメンド研究のあれこれ
 
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
 
蟻本輪講 データ構造
蟻本輪講 データ構造蟻本輪講 データ構造
蟻本輪講 データ構造
 
全部Excelでやろうとして後悔するデータ分析
全部Excelでやろうとして後悔するデータ分析全部Excelでやろうとして後悔するデータ分析
全部Excelでやろうとして後悔するデータ分析
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
 
グレブナー基底を食べよう
グレブナー基底を食べようグレブナー基底を食べよう
グレブナー基底を食べよう
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 

More from Hongjun Jang

Teamwork in programming contests
Teamwork in programming contestsTeamwork in programming contests
Teamwork in programming contestsHongjun Jang
 
ALPS & AlKor Intro Slides
ALPS & AlKor Intro SlidesALPS & AlKor Intro Slides
ALPS & AlKor Intro SlidesHongjun Jang
 
Problem Solving GuideBook
Problem Solving GuideBookProblem Solving GuideBook
Problem Solving GuideBookHongjun Jang
 
Sqrt decomposition
Sqrt decompositionSqrt decomposition
Sqrt decompositionHongjun Jang
 
COCI 2006/2007 contest #1 solution
COCI 2006/2007 contest #1 solutionCOCI 2006/2007 contest #1 solution
COCI 2006/2007 contest #1 solutionHongjun Jang
 
4. dynamic programming(1)
4. dynamic programming(1)4. dynamic programming(1)
4. dynamic programming(1)Hongjun Jang
 
3. basic data structures(2)
3. basic data structures(2)3. basic data structures(2)
3. basic data structures(2)Hongjun Jang
 
2. basic data structures(1)
2. basic data structures(1)2. basic data structures(1)
2. basic data structures(1)Hongjun Jang
 
2016 고려대학교 신입생 프로그래밍 경시대회 해법
2016 고려대학교 신입생 프로그래밍 경시대회 해법2016 고려대학교 신입생 프로그래밍 경시대회 해법
2016 고려대학교 신입생 프로그래밍 경시대회 해법Hongjun Jang
 
Baekjoon Online Judge 1492번 풀이
Baekjoon Online Judge 1492번 풀이Baekjoon Online Judge 1492번 풀이
Baekjoon Online Judge 1492번 풀이Hongjun Jang
 

More from Hongjun Jang (12)

Teamwork in programming contests
Teamwork in programming contestsTeamwork in programming contests
Teamwork in programming contests
 
ALPS & AlKor Intro Slides
ALPS & AlKor Intro SlidesALPS & AlKor Intro Slides
ALPS & AlKor Intro Slides
 
Problem Solving GuideBook
Problem Solving GuideBookProblem Solving GuideBook
Problem Solving GuideBook
 
Network flow
Network flowNetwork flow
Network flow
 
Sqrt decomposition
Sqrt decompositionSqrt decomposition
Sqrt decomposition
 
COCI 2006/2007 contest #1 solution
COCI 2006/2007 contest #1 solutionCOCI 2006/2007 contest #1 solution
COCI 2006/2007 contest #1 solution
 
4. dynamic programming(1)
4. dynamic programming(1)4. dynamic programming(1)
4. dynamic programming(1)
 
3. basic data structures(2)
3. basic data structures(2)3. basic data structures(2)
3. basic data structures(2)
 
1. alps c c++
1. alps c c++1. alps c c++
1. alps c c++
 
2. basic data structures(1)
2. basic data structures(1)2. basic data structures(1)
2. basic data structures(1)
 
2016 고려대학교 신입생 프로그래밍 경시대회 해법
2016 고려대학교 신입생 프로그래밍 경시대회 해법2016 고려대학교 신입생 프로그래밍 경시대회 해법
2016 고려대학교 신입생 프로그래밍 경시대회 해법
 
Baekjoon Online Judge 1492번 풀이
Baekjoon Online Judge 1492번 풀이Baekjoon Online Judge 1492번 풀이
Baekjoon Online Judge 1492번 풀이
 

Aho-Corasick Algorithm(아호 코라식 알고리즘)

  • 2. • 패턴 집합에 대한 매칭 알고리즘 패턴이 1개라면 KMP Algorithm으로 선형에 해결 하지만 KMP는 패턴 개수에 비례하여 시간복잡도가 증가 O(m+zn) (m : 패턴들의 길이 합, z : 패턴 수, n : text 크기) Aho-Corasick은 O(m + n + k)의 시간 복잡도로 패턴 집합에 대하여 패턴 길이와 텍스트의 선형 시간에 탐색을 처리할 수 있어요.(k : 텍스트 내에 패턴의 발생 수) Aho-Corasick
  • 3. • 크게 3단계로 나눌 수 있어요. 1. 패턴 string들에 대한 Trie(트라이) 구성 2. Failure Link와 Output Link 구성 3. Matching Aho-Corasick
  • 4. • 패턴 string 각각에 대해 Trie의 노드들을 따라가다가 갈 곳이 없다면 새로운 노드를 추가하는 방식으로 구성하면 됩니다. - O(m) • 예를 들어 패턴이 {“ab”, “c”, “a”, “acd”}라면 다음과 같은 Trie가 구성이 되겠죠. 테두리가 빨간 노드들은 그곳에서 끝나는 패턴 string이 있습니다. • Trie 구성 끝! 1. Trie
  • 5. • 방금 구성한 Trie를 이용해 Failure Link의 필요성을 알아보겠습니다. • Text가 “acabacd”이고, 우리는 이 텍스트에 등장하는 패턴 string들을 모두 알고 싶습니다. Text : “acabacd” Text의 처음 문자가 a이므로 Trie에서 a에 해당하는 노드로 이동합니다. 2. Failure Link
  • 6. Text : “acabacd” 다음 문자가 c이므로 Trie에서 c에 해당하는 노드로 이동합니다. 2. Failure Link
  • 7. Text : “acabacd” 다음 문자가 a이므로 Trie에서 a에 해당하는 노드로 이동해야 하는데, Trie에는 그런 노드가 존재하지 않습니다. 이전에는 첫 번째 문자인 a부터 탐색을 했으니 이젠 Trie의 루트로 돌아가서 두 번째 문자인 c에서부터 다시 탐색해야 할까요? 2. Failure Link
  • 8. 이전까지 Trie에서 지나온 경로들을 이용해 새로 탐색을 시작할 노드의 위치를 빠르게 알 수는 없을까? 라는 물음에서 Failure Link가 등장하게 됩니다. 앞의 경우에는 c라는 노드에서 새로 탐색을 시작하면 되고, 이 노드로 연결해주는 간선을 Failure Link라고 합니다. 2. Failure Link
  • 9. Failure Link는 다음과 같은 과정으로 만들 수 있습니다. 1. Trie의 루트로부터 BFS를 수행하면서 Failure Link를 만든다. 2. 현재 위치(p)와 가리키는 노드(q)에 대해서 1) p가 루트라면, q의 Failure Link는 루트이다. 2) p가 루트가 아니면, p의 실패 링크(pf)에서 q와 같은 문자로 이어지는 노드(r)가 있는지 확인한다. (1) 그런 r이 존재한다면 qf는 r을 가리킨다. (2) 그런 r이 존재하지 않는다면, p에 pf를 대입하고 1)로 돌아가 과정을 반복한다. 2. Failure Link
  • 10. • 처음에 예시로 들었던 Trie에서 Failure Link를 구성해 보겠습니다. • 루트에서 BFS를 수행하면서 시작해 봅시다. 2. Failure Link
  • 11. • BFS 중 현재 위치 p는 Trie의 루트 노드입니다. • 루트가 가리키는 노드 a와 c는 루트가 가리키는 노드들이므로 Failure Link가 루트입니다. • Failure Link는 붉은선으로 표시하겠습니다. 2. Failure Link
  • 12. • BFS 중 현재 위치 p는 루트가 가리키는 노드 a입니다. • p가 가리키는 노드 b(= q)를 보겠습니다. • p의 Failure Link가 가리키는 Trie의 루트(=pf)는 문자 b를 가리키는 노드(r)가 없습니다. 2. Failure Link
  • 13. • 따라서 p에다가 pf를 대입하고 다시 생각해보겠습니다. • 현재 위치 p는 루트가 되었습니다. • p가 루트이므로 q의 Failure Link는 루트(=qf)입니다. 2. Failure Link
  • 14. • BFS 중 현재 위치 p는 루트가 가리키는 노드 a입니다. • p가 가리키는 노드 c(= q)를 보겠습니다. • p의 Failure Link가 가리키는 Trie의 루트(=pf)는 문자 c를 가리키는 노드(r)가 있으므로 qf는 r을 가리킵니다. 2. Failure Link
  • 15. • BFS 중 현재 위치 p는 루트가 가리키는 노드 c입니다. • p가 가리키는 노드가 없으므로 p에 대한 작업은 끝. 2. Failure Link
  • 16. • BFS 중 현재 위치 p는 루트가 가리키는 노드 c입니다. • p가 가리키는 노드가 없으므로 p에 대한 작업은 끝. 2. Failure Link
  • 17. • BFS 중 현재 위치 p는 노드 a가 가리키는 노드 c입니다. • p가 가리키는 노드 d(= q)를 보겠습니다. • p의 Failure Link가 가리키는 노드 c(=pf)는 문자 d를 가리키는 노드(r)가 없습니다. 2. Failure Link
  • 18. • 따라서 p에다가 pf를 대입하고 다시 생각해보겠습니다. • 현재 위치 p는 노드 c가 되었습니다. • p의 Failure Link가 가리키는 Trie의 루트(=pf)는 문자 d를 가리키는 노드(r)가 없습니다. 2. Failure Link
  • 19. • 따라서 p에다가 pf를 대입하고 다시 생각해보겠습니다. • 현재 위치 p는 루트가 되었습니다. • p가 루트이므로 q의 Failure Link는 루트(=qf)입니다. 2. Failure Link
  • 20. • 예시로 든 패턴의 Trie와 Failure Link 최종 모습입니다. 2. Failure Link
  • 21. • 패턴들 중에 다른 패턴의 substring인 string이 존재하게 되면 Text에 등장하는 모든 패턴들을 탐색하지 못 할 수가 있어요. • 이를 막기 위하여 출력 링크(Output Link)라는 자료 구조를 추가하게 됩니다. • 처음에 각각의 패턴 string들이 끝이 나는 정점은 그 정점을 Sucess Link로 가지게 됩니다 2. Output Link(Output Link)
  • 22. • BFS 도중, 현재 정점에서 Failure link를 따라 가서 패턴이 끝이 나게 되면 여러 단계의 Failure link를 무시하고 바로 그 정점으로 Output Link를 연결해주면 됩니다. • Failure link를 추가할 때, 같이 Failure Link를 따라간 정점이 패턴의 끝이면 그 정점으로 Output Link를 연결해주고 그렇지 않으면 그 정점의 Output Link를 가져오면 됩니다. 2. Output Link(Output Link)
  • 23. • 예시로 든 패턴의 Trie, Failure Link와 Output Link(푸른 간선)의 최종 모습이에요. 노드 안에 푸른 원이 있는 것은 자기 자신을 Output Link가 가리킨다는 표시입니다. 2. Output Link(Output Link)
  • 24. • Text의 글자와 Trie의 노드에서 나가는 간선의 글자와 비교하면서 일치하면 해당 정점으로 이동하게 됩니다. • 이동하면서 Output Link가 존재하는지 확인을 계속하고 Output Link가 존재하면 패턴이 발생했음을 의미합니다. • 비교하다가 틀리게 되면 Failure link를 따라 가서 계속 글자를 비교해 주면서 탐색을 하게 됩니다. • Text의 각 문자를 한 번 확인하였으면 다시 확인하지 않게 되고 따라서 O(m + n + k)의 시간 복잡도로 처리가 가능하게 됩니다. (m : 패턴들의 길이 합, n : Text의 길이, k : 텍스트 내에 패턴의 발생 수) 3. Matching
  • 25. • Text가 “dabcacdfc”라고 해보겠습니다. • 앞서 구한 걸 이용해서 이 Text에 등장하는 모든 패턴 string들을 구해볼게요. 3. Matching
  • 26. Text : dabcacdfc 현재 위치(p)는 트라이의 루트 노드입니다. p에서 d로 가는 노드가 없는데, p가 루트이므로 다음 Text 원소를 보죠. 3. Matching
  • 27. Text : dabcacdfc 현재 위치(p)는 트라이의 루트 노드입니다. p에서 a로 가는 노드가 있으므로 갑니다. 그런데 노드 a에서 Output Link가 존재하네요! 3. Matching
  • 28. Text : dabcacdfc Text에 존재하는 패턴 string 중 하나인 “a”를 찾았습니다. 다음 Text 원소인 b를 보겠습니다. 3. Matching
  • 29. Text : dabcacdfc 현재 위치 p에서 Output Link가 존재하네요! Text에 존재하는 패턴 string 중 하나인 “ab”를 찾았습니다. 3. Matching
  • 30. Text : dabcacdfc 현재 위치 p에서 노드 c로 나가는 간선이 없으므로 p의 실패노드인 루트로 갑니다. 3. Matching
  • 31. Text : dabcacdfc 현재 위치 p에서 c로 가는 간선이 있으므로 노드 c로 갑니다. 3. Matching
  • 32. Text : dabcacdfc 현재 위치 p에서 Output Link가 존재하네요! Text에 존재하는 패턴 string 중 하나인 “c”를 찾았습니다. 3. Matching
  • 33. Text : dabcacdfc Text의 다음 문자인 a를 보았는데, 현재 위치 p에서는 a로 나가는 간선 없으므로 실패링크를 타고 루트로 갑니다. 3. Matching
  • 34. Text : dabcacdfc 현재 위치 p에서 a로 나가는 간선이 있으므로 갑니다. 3. Matching
  • 35. Text : dabcacdfc p에 Output Link가 있네요. “a”를 찾았습니다. 3. Matching
  • 36. Text : dabcacdfc 현재 위치 p에서 c로 나가는 간선이 있으므로 갑니다. 3. Matching
  • 37. Text : dabcacdfc 현재 위치 p에서 d로 나가는 간선이 있으므로 갑니다. 3. Matching
  • 38. Text : dabcacdfc 현재 위치 p에 Output Link가 있습니다. “acd”가 Text에 존재하네요. Text의 다음 문자 f를 보았는데 p에서 나가는 간선이 없어서 실패링크를 타고 루트로 갑니다. 3. Matching
  • 39. Text : dabcacdfc 루트에서도 f로 나가는 간선이 없으므로 Text의 다음 문자 c를 봅니다. p에서 나갈 수 있는 간선이 있으므로 갑니다. 3. Matching
  • 40. Text : dabcacdfc 현재 위치 p가 있는 곳에 Output Link가 있네요. “c”를 찾았습니다. Text의 다음 문자가 없으므로 매칭이 종료됩니다. 3. Matching
  • 41. 앞서 보여드린 예시에서는 Output Link를 여러 번 따라가는 경우가 없었습니다. 만약 어떤 노드에서 Output Link가 존재하고 그 Link를 따라갔는데, 그 노드에서 또 Output Link가 존재한다면, 다른 패턴이 존재한다는 의미입니다. Output Link가 존재하지 않을 때까지 계속 따라가주면 됩니다. 3. Matching
  • 42. 감사합니다. 참고 : ‘프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략 2권’, 구종만 위키피디아 – 아호 코라식 알고리즘 End