트 리(사전 트 리)소개 및 자바 구현

간단 한 소개
트 리 트 리 는 접두사 트 리 나 사전 트 리 라 고도 부 르 며 관련 배열 을 저장 하 는 질서 있 는 트 리 입 니 다.키 는 보통 문자열 입 니 다.이 진 트 리 와 달리 키 는 노드 에 직접 저장 되 는 것 이 아니 라 노드 가 트 리 에 있 는 위치 에 의 해 결정 된다.한 노드 의 모든 자손 은 같은 접 두 사 를 가지 고 있 습 니 다.즉,이 노드 에 대응 하 는 문자열 이 고 뿌리 노드 는 빈 문자열 에 대응 합 니 다.
그것 의 주요 특징 은 다음 과 같다.
루트 노드 는 문 자 를 포함 하지 않 습 니 다.루트 노드 를 제외 한 모든 노드 는 하나의 문자 만 포함 합 니 다.
루트 노드 에서 특정한 노드 까지 경로 에 있 는 문 자 를 연결 하여 이 노드 에 대응 하 는 문자열 입 니 다.
각 노드 의 모든 하위 노드 에 포 함 된 문 자 는 같 지 않다.
다음은 전형 적 인 트 리 입 니 다.

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(); }
테스트 결 과 는 다음 과 같다.

총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기