트 리(사전 트 리)소개 및 자바 구현
트 리 트 리 는 접두사 트 리 나 사전 트 리 라 고도 부 르 며 관련 배열 을 저장 하 는 질서 있 는 트 리 입 니 다.키 는 보통 문자열 입 니 다.이 진 트 리 와 달리 키 는 노드 에 직접 저장 되 는 것 이 아니 라 노드 가 트 리 에 있 는 위치 에 의 해 결정 된다.한 노드 의 모든 자손 은 같은 접 두 사 를 가지 고 있 습 니 다.즉,이 노드 에 대응 하 는 문자열 이 고 뿌리 노드 는 빈 문자열 에 대응 합 니 다.
그것 의 주요 특징 은 다음 과 같다.
루트 노드 는 문 자 를 포함 하지 않 습 니 다.루트 노드 를 제외 한 모든 노드 는 하나의 문자 만 포함 합 니 다.
루트 노드 에서 특정한 노드 까지 경로 에 있 는 문 자 를 연결 하여 이 노드 에 대응 하 는 문자열 입 니 다.
각 노드 의 모든 하위 노드 에 포 함 된 문 자 는 같 지 않다.
다음은 전형 적 인 트 리 입 니 다.
Trie 의 출처 는 Retrieval 입 니 다.접두사 와 주파수 통계 에 자주 사 용 됩 니 다.누군가가 말 하려 고 할 수도 있 습 니 다.단어의 주파수 통 계 는 간단 합 니 다.하나의 hash 또는 하나의 더미 로 해결 할 수 있 지만 문제 가 생 겼 습 니 다.만약 에 메모리 가 제한 되 어 있다 면 요?이렇게 놀아 도 돼 요?그래서 여기 서 우 리 는 trie 트 리 로 공간 을 압축 할 수 있 습 니 다.공공 접 두 사 는 모두 하나의 노드 로 저장 되 기 때 문 입 니 다.
1.정의
여기 에는 간소 화 를 위해 소문 자 26 개 만 고려 했다.
먼저 노드 의 정의:
public class TrieNode {
public TrieNode[] children;
public char data;
public int freq;
public TrieNode() {
// 26
children = new TrieNode[26];
freq = 0;
}
}
그리고 트 리 의 정의:
public class TrieTree {
private TrieNode root;
public TrieTree(){
root=new TrieNode();
}
...
}
2.삽입26 갈래 나무 이기 때문에 charArray[index]-'a'를 통과 할 수 있 습 니 다.문자 가 어느 아이 에 게 있어 야 하 는 지 알 게 되 었 습 니 다.
public void insert(String word){
if(TextUtils.isEmpty(word)){
return;
}
insertNode(root,word.toCharArray(),0);
}
private static void insertNode(TrieNode rootNode,char[]charArray,int index){
int k=charArray[index]-'a';
if(k<0||k>25){
throw new RuntimeException("charArray[index] is not a alphabet!");
}
if(rootNode.children[k]==null){
rootNode.children[k]=new TrieNode();
rootNode.children[k].data=charArray[index];
}
if(index==charArray.length-1){
rootNode.children[k].freq++;
return;
}else{
insertNode(rootNode.children[k],charArray,index+1);
}
}
3.노드 제거제거 작업 에서 단어의 주파 수 를 줄 여야 합 니 다.
public void remove(String word){
if(TextUtils.isEmpty(word)){
return;
}
remove(root,word.toCharArray(),0);
}
private static void remove(TrieNode rootNode,char[]charArray,int index){
int k=charArray[index]-'a';
if(k<0||k>25){
throw new RuntimeException("charArray[index] is not a alphabet!");
}
if(rootNode.children[k]==null){
//it means we cannot find the word in this tree
return;
}
if(index==charArray.length-1&&rootNode.children[k].freq >0){
rootNode.children[k].freq--;
}
remove(rootNode.children[k],charArray,index+1);
}
4.검색 빈도
public int getFreq(String word){
if(TextUtils.isEmpty(word)){
return 0;
}
return getFreq(root,word.toCharArray(),0);
}
private static int getFreq(TrieNode rootNode,char[]charArray,int index){
int k=charArray[index]-'a';
if(k<0||k>25){
throw new RuntimeException("charArray[index] is not a alphabet!");
}
//it means the word is not in the tree
if(rootNode.children[k]==null){
return 0;
}
if(index==charArray.length-1){
return rootNode.children[k].freq;
}
return getFreq(rootNode.children[k],charArray,index+1);
}
5.테스트테스트 코드 는 다음 과 같 습 니 다:
public static void test(){
TrieTree trieTree=new TrieTree();
String sourceStr="Democratic presumptive nominee Hillary Clintons campaign posed pounced on Trumps assertion that British term monetary turmoil might benefit his business venture in Scotland";
//String sourceStr="the that";
sourceStr=sourceStr.toLowerCase();
String[]strArray=sourceStr.split(" ");
for(String str:strArray){
trieTree.insert(str);
}
String sourceStr2="Every president is tested by world events But Donald Trump thinks about how is his golf resort can profit from that";
sourceStr2=sourceStr2.toLowerCase();
String[]strArray2=sourceStr2.split(" ");
for(String str:strArray2){
trieTree.insert(str);
}
BinaryTree.print("frequence of 'that':"+trieTree.getFreq("that"));
BinaryTree.print("
frequence of 'donald':"+trieTree.getFreq("donald"));
trieTree.remove("that");
BinaryTree.print("
after remove 'that' once,freq of 'that':"+trieTree.getFreq("that"));
trieTree.remove("that");
BinaryTree.print("
after remove 'that' twice,freq of 'that':"+trieTree.getFreq("that"));
trieTree.remove("donald");
BinaryTree.print("
after remove 'donald' once,freq of 'donald':"+trieTree.getFreq("donald"));
BinaryTree.reallyStartPrint();
}
테스트 결 과 는 다음 과 같다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.