生活
前缀树 、前缀树java实现
2023-04-11 00:41  浏览:29

中文前缀树的简单实现

前缀树又称为字典树,在搜索提示,分词,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实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

发表评论
0评