Trie: 문자열 저장/탐색을 위한 트리 형태의 자료구조
장점: 문자열 탐색/삽입이 빠름
단점: 필요한 메모리가 너무 큼
구현
public class Trie {
class Node {
Map<Character, Node> childNode = new HashMap<Character, Node>();
boolean endOfWord;
}
Node = rootNode = new Node();
void insert(String str) {
Node node = this.rootNode;
for (int i = 0; i < str.length(); i++) {
node = node.childNode.computeIfAbsent(str.charAt(i), key -> new Node());
}
node.endOfWord = true;
}
boolean search(String str) {
Node node = this.rootNode;
for (int i = 0; i < str.length(); i++) {
node = node.childNode.getOrDefault(str.charAt(i), null);
if (node == null) {
return false;
}
}
return node.endOfWord;
}
접두사(prefix)와 접미사(suffix)의 개념을 활용해 모든 경우를 계산하지 않고 반복되는 연산을 줄여나가 매칭 문자열을 빠르게 점프하는 기법
과정
begin, matched = 0
부터 탐색matched
: 일치하는 문자열의 수pattern
과 parent
의 해당 글자가 일치하면 matched
카운트 증가matched
카운트와 pattern
총 길이가 일치하면 답에 추가pattern
과 parent
의 해당 글자가 일치하지 않을 때matched
가 0이면 다음칸에서 계속begin
의 위치 옮김문자열에 해싱 기법을 사용해 해시 값으로 비교하는 알고리즘
검색 과정: 지정한 수 (검색 대상 문자열 해시 값 - 맨 앞의 문자열 값 지정한 수^제곱 수) + 새로 탐색된 문자열 값
public void findString(String original, string search) {
int originalSize = original.length();
int searchSize = search.length();
int originalHash = 0;
int searchHash = 0;
int power = 1;
for (in ti = 0; i <= originalSize - searchSize; i++) {
if (i == 0) {
for (int j = 0; j < searchSize; j++) {
originalHash =+ original[searchSize - 1 - j] * power;
searchHash += search[searchSize - 1 - j] * power;
if (j < searchSize -1) {
power *= 3;
}
}
} else {
originalHash = 3 * (originalHash - original[i-1] * power) + original[searchSize - 1 + i];
}
if (originalHash == searchHash) {
boolean found = true;
for (int j = 0; j < searchSize; j++) {
if (original[i + j] != saerch[j]) {
found = false;
break;
}
}
if (found) {
return (i+1)
}
}
}
}
참고: