トライトライプレフィックスツリー
-
またトライ、トライ木、木、ハッシュツリーのバリエーションとして知られています。統計のための代表的なアプリケーションは、ソートと文字列の多くを保存し、それは多くの場合、テキスト検索エンジンシステムの単語頻度統計のために使用されています。利点は以下のとおりです。クエリ時間を短縮するために、文字列の共通のプレフィックスを使用し、不要な文字列比較を最小限に抑えるために、高効率の問い合わせツリーバイHaxi
-
文字を含まないルートノードは、ルートノード以外の各ノードは、文字の外側に含まれ、そのノードに対応する接続文字列を通る経路上のノードにルートノードから、各ノードのすべての子ノードを含みます文字は同じではありません
-
注意:トライのために、実際には、かなりの時間のオーバーヘッドがあります。比較的大きな空間がトライを消費するので、それは余分な時間がかかるメモリの軸受空間(TreeMapの、ハッシュマップまたはアレイ)へのポインタ(各ノードはポインタの数を有することになります)
-
ノード包装:
private class Node{ public boolean isWord; public TreeMap<Character,Node> next; public Node(boolean isWord) { this.isWord = isWord; next = new TreeMap<>(); } public Node() { this(false); } }
-
追加:
//向树中添加一个新的单词word public void add(String word) { Node cur = root; for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); if(cur.next.get(c)==null) { cur.next.put(c,new Node()); } cur = cur.next.get(c); } if(!cur.isWord){ cur.isWord = true; size++; } }
-
含みます
//查询单词是否存在在树中 public boolean contains(String word){ Node cur = root; for (int i = 0; i <word.length() ; i++) { char c = word.charAt(i); if(cur.next.get(c)==null) return false; cur = cur.next.get(c); } return cur.isWord; }
-
プレフィックス検索
//前缀搜索 public boolean isPrefix(String prefix) { Node cur = root; for (int i = 0; i < prefix.length(); i++) { char c = prefix.charAt(i); if(cur.next.get(c) == null) return false; cur = cur.next.get(c); } return true; }
-
全体のコード
package 数据结构.Trie; import jdk.nashorn.api.tree.ReturnTree; import java.util.TreeMap; public class Trie { private class Node{ public boolean isWord; public TreeMap<Character,Node> next; public Node(boolean isWord) { this.isWord = isWord; next = new TreeMap<>(); } public Node() { this(false); } } private Node root; private int size; public Trie(){ root = new Node(); size = 0; } //获得树中单词数量 public int getSize() { return size; } //向树中添加一个新的单词word public void add(String word) { Node cur = root; for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); if(cur.next.get(c)==null) { cur.next.put(c,new Node()); } cur = cur.next.get(c); } if(!cur.isWord){ cur.isWord = true; size++; } } //查询单词是否存在在树中 public boolean contains(String word){ Node cur = root; for (int i = 0; i <word.length() ; i++) { char c = word.charAt(i); if(cur.next.get(c)==null) return false; cur = cur.next.get(c); } return cur.isWord; } //前缀搜索 public boolean isPrefix(String prefix) { Node cur = root; for (int i = 0; i < prefix.length(); i++) { char c = prefix.charAt(i); if(cur.next.get(c) == null) return false; cur = cur.next.get(c); } return true; } }