摘要:壓縮前綴樹其實就是將所有只有一個子節點的節點合并成一個,以減少沒有意義的類似鏈表式的鏈接。然后我們開始遍歷這個前綴樹。
Implement Trie
哈希表法 復雜度Implement a trie with insert, search, and startsWith methods.
Note: You may assume that all inputs are consist of lowercase letters a-z.
時間 插入和查詢都是O(K) K是詞的長度 空間 O(NK) N是字典里詞的個數
思路前綴樹的具體講解請戳這篇博客。這里我們實現樹節點時使用了哈希表來映射字母和子節點的關系。
insert():對于插入操作,我們遍歷字符串同時,根據上一個節點的哈希表來找到下一個節點,直到哈希表中沒有相應的字母,我們就新建一個節點。然后從這個新建節點開始,用同樣的方法把剩余的字母添加完。記住最后一個字母要添加葉子節點的標記,表明這個詞到此已經完整了。
search():對于搜索操作,我們也是遍歷字符串,然后根據每個節點的哈希表找到路徑,最后返回該字符串最后一個字母所在節點。如果中途有找不到路徑的情況就直接返回null,如果找到了最后的節點,如果它也是葉子結點的話,就說明找到了。
startWith():使用和search(),一樣的方法,只是我們返回的節點不用判斷是否是葉子節點。只要找到就行。
class TrieNode { // Initialize your data structure here. HashMap后續 Follow Upchildren = new HashMap (); boolean isLeaf = false; char c; public TrieNode(){} public TrieNode(char c) { this.c = c; } } public class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } // Inserts a word into the trie. public void insert(String word) { HashMap children = root.children; for(int i = 0; i < word.length(); i++){ TrieNode next; // 如果已有該字母的節點,則轉向該節點 if(children.containsKey(word.charAt(i))){ next = children.get(word.charAt(i)); } else { // 如果沒有該字母的節點,就新建一個節點 next = new TrieNode(word.charAt(i)); children.put(word.charAt(i), next); } children = next.children; if(i == word.length() - 1){ next.isLeaf = true; } } } // Returns if the word is in the trie. public boolean search(String word) { TrieNode res = searchNode(word); if(res != null && res.isLeaf){ return true; } else { return false; } } // Returns if there is any word in the trie // that starts with the given prefix. public boolean startsWith(String prefix) { return searchNode(prefix) != null; } private TrieNode searchNode(String word){ HashMap children = root.children; TrieNode next = null; for(int i = 0; i < word.length(); i++){ if(children.containsKey(word.charAt(i))){ next = children.get(word.charAt(i)); children = next.children; } else { return null; } } return next; } } // Your Trie object will be instantiated and called as such: // Trie trie = new Trie(); // trie.insert("somestring"); // trie.search("key");
Q:給定一個標準前綴樹,請寫一段程序將其壓縮。
A:壓縮前綴樹其實就是將所有只有一個子節點的節點合并成一個,以減少沒有意義的類似鏈表式的鏈接。
首先我們先將TrieNode稍微改一下。讓它能存字符串而不只是字母。
class TrieNode { // Initialize your data structure here. HashMapchildren = new HashMap (); boolean isLeaf = false; String str; public TrieNode(){} public TrieNode(char c) { this.str = String.valueOf(c); } }
然后我們開始遍歷這個前綴樹。
public void compressTrie(Trie t){ compress(t.getRoot()); } private void compress(TrieNode n){ if(n == null) return; if(n.children.size()==1){ TrieNode next = n.children.get(n.children.keySet().iterator().next()); n.str = n.str + next.str; n.children = next.children; compress(next); } else { for(String key: n.children.keySet()){ compress(n.children.get(key)); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64494.html
摘要:首先,我們應該了解字典樹的性質和結構,就會很容易實現要求的三個相似的功能插入,查找,前綴查找。既然叫做字典樹,它一定具有順序存放個字母的性質。所以,在字典樹的里面,添加,和三個參數。 Problem Implement a trie with insert, search, and startsWith methods. Notice You may assume that all i...
摘要:前言前綴樹是一種很常用的數據結構,例如我們常用的數據庫索引。而關于前綴樹的介紹,由于中國有關于前綴樹的教程,我就不班門弄斧了,我的答案也是參考教程的思路去解答,希望可以給大家一個參考。下面是原題目實現一個前綴樹,包含和這三個操作。 前言 前綴樹是一種很常用的數據結構,例如我們常用的數據庫索引。而關于前綴樹的介紹,由于LeetCode中國有關于前綴樹的教程,我就不班門弄斧了,我的答案也是...
摘要:我們可以先用待查單詞建立一個字典樹,這樣我們在從矩陣中某個點開始深度優先搜索時,可以直接用字典樹判斷當前組成的字符串是否是某個單詞的前綴。字典樹同樣也提供接口,所以同樣可以用于判斷是否已經搜索到這個詞了。 Word Search I 更新的思路與解法請訪問:https://yanjia.me/zh/2018/11/... Given a 2D board and a word, f...
摘要:很容易看出,前綴最壞情況下的查找也快過二叉搜索樹。這種壓縮后的被喚作前綴壓縮,或直接叫前綴樹,字典樹。最長公共前綴和的最長公共前綴是,遍歷字典樹到字母時,此時這些單詞的公共前綴是。 引子 前綴Trie, 又叫字符Tire, trie來自單詞retrieval, 一開始念作tree,后來改念try, 畢竟它與樹是不一樣的東西。網上許多文章都搞混了trie與樹。 trie是通過邊來儲存字符...
摘要:是以太坊存儲數據的核心數據結構,它是由和結合的一種樹形結構,理解有助于我們更好的理解以太坊的數據存儲。所以就有了樹壓縮前綴樹,后面會介紹到,也被稱為,中文名稱默克爾樹,主要用于數據集較大時的文件校驗。 ??MPT(Merkle Patricia Tries)是以太坊存儲數據的核心數據結構,它是由Merkle Tree和Patricia Tree結合的一種樹形結構,理解MPT有助于我們更...
閱讀 3616·2021-11-22 09:34
閱讀 3186·2021-11-15 11:38
閱讀 3039·2021-10-27 14:16
閱讀 1233·2021-10-18 13:35
閱讀 2424·2021-09-30 09:48
閱讀 3429·2021-09-29 09:34
閱讀 1626·2019-08-30 15:54
閱讀 1818·2019-08-26 11:57