中文前缀树的简单实现
前缀树又称为字典树,在搜索提示,分词,httprouter等领域都有广泛使用。其原理就像查字典一样,比如要从字典中查 tea,首先翻到以 t 开头的那几页,然后从那几页里找到第二个字母是 e 的,在此范围内找到第三个字母是 a 并且没有后续字母的单词。
我们可以这样实现一棵前缀树,每个节点都是完整的索引。这样实现起来非常简单,但正如上图可看出的,仅索引4个单词就消耗了大量的空间。这还是纯英文字母的情况,如果是中文,那每个节点几万个字节,可以说是相当浪费了。
为了节省空间,我们可以用链表节点替代上面的数组节点,这样只是额外消耗了一点指针的空间,相比数组节点能省下很多空间。但这样每次进入一个节点就要从头开始一个一个地搜相匹配的字符,然后再跳到下一个节点。是一种时间换空间的操作。
前缀树的操作
前缀树是N叉树的一种形式,常用于存储字符串,树中每一个节点表示一个字符。
前缀树重要的存在价值是搜索速度,典型的利用空间换时间,时间复杂度为O(n),n是树的深度。
上图中存储了四个单词:am、bad、be、so,位于叶子节点,叶子节点一定为词,但词不一定位于叶子节点。除了存储词的节点外,其余节点称为前缀。如ba,在树中并不是一个词,但他是bad词的前缀,前缀的重要作用就是减少存储空间,具有相同前缀的不同单词,只需存储差异部分,大大减少了空间的存储。
我所喜欢的数据结构:
Trie常见的操作:
这个题目实在是翻译不出来啊!题意:插入多个单词(apple、app)给每一个词赋值apple=3、app=2,当输入前缀ap时,返回以ap为前缀的所有单词值的和。
一段文字内替换所有以
Trie中存储的单词
的单词
步骤:
步骤:
在给定的数组中两两项异或,找出***的异或值。
一个数的大小如何判断?从高位向低位走,先遇到不为0的数***(1000 、0100),若高位相同继续向低位走(1000 、 1100)。
思路:
由于存储的节点只有0、1所以修改TrieNode结构
构造Trie
遍历查找***异或值
给定矩阵,判断输入的单词是否在矩阵中。
思路:
在给出的单词组中,找出可以组成回文的两个单词组。
LeetCode
数据结构--前缀树(字典树)
Trie ,又称前缀树或字典树,是一棵有根树,其每个节点包含以下字段:
我们从字典树的根开始,插入字符串。对于当前字符对应的子节点,有两种情况:
重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾。
我们从字典树的根开始,查找前缀。对于当前字符对应的子节点,有两种情况:
重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符。
若搜索到了前缀的末尾,就说明字典树中存在该前缀。此外,若前缀末尾对应节点的 isEnd 为真,则说明字典树中存在该字符串。
关于前缀树和前缀树java实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。