algorithm/theory

트라이(Trie), 아호코라식

qkqhxla1 2016. 9. 26. 20:29

문자열 변수를 비교할땐 문자열의 길이가 있으므로 정수등과 다르게 오래걸린다. 


예로 어떤 한 문자열 a가 있고 문자열 b가 있다고 하자. a가 b문자열 안에 들어있는지 확인하는데는 


너무 오래걸린다. 이를 해결하기 위해 문자열 특화 자료 구조의 대표적인 예가 트라이다.


문제점은 필요로 하는 공간이 너무 크다는 점. 그래서 트라이로 접미사 트리를 만들수 있지만


사용하기가 어렵다고 한다.(접미사가 필요하면 앞에 글중 하나인 접미사 배열 부분을 주로 쓴다.) 


문자열 집함 s={"BE","BET","BUS","TEA","TEN"}; 이 있다고 할때 이걸 트라이에 저장하면 아래처럼 된다.


이처럼 접두사 뒤에 글자를 덧붙여 다른 접두사를 얻을 수 있을때 두 노드는 부모 자식 관계로 연결된다.


노드의 깊이가 늘어날수록 문자열의 길이도 1씩 늘어난다. 아래는 이를 구현한 트라이 소스코드다.


처음 단어부터 시작하는게 있어야 true를 반환한다.



위의 트라이가 시작점에서 시작하는 접두사만 찾을수 있는것에 반해 아호코라식 알고리즘은 kmp


처럼 시작점에서 시작하는것과 상관없이 찾을수 있다.


HELLOWORLD에서 -> HELLO를 찾는다. trie = true, 아호코라식 = true


HELLOWORLD에서 -> WORLD를 찾는다. trie = false. 아호코라식 = true


아호 코라식 알고리즘은 긴 문서에서 많은 문자열을 동시에 찾아야 하는 곳에서 유용하다고 한다.


종만북에서 소스를 가져왔다.


main에서 문자열 "HERSHISHE"를 넣고 "SHE"를 0번, HE를 1번, HERS를 2번, HIS를 3번 패턴으로


놓고 검색한 결과이다. 


패턴 1(HE)는 "HERSHISHE"의 인덱스 1에서 끝난다.


패턴 2(HERS)는 "HERSHISHE"의 인덱스 3에서 끝난다.


~~