当前位置: 首页 > 知识库问答 >
问题:

如果Trie结构中的另一个单词没有使用某个单词的节点,则删除该单词的节点

楚博雅
2023-03-14

当从trie中删除一个单词时,如果该单词的节点没有被用于另一个单词,我会尝试删除该单词的节点。

所以我不想在删除一个单词时仅仅标记一个节点。真正应该删除未使用的节点。

class Trie(object):
    def __init__(self):
        self.children = {}
        self.end = "#"

    def append_word(self, word: str):
        node = self.children
        for c in word:
            node = node.setdefault(c, {})
        node[self.end] = self.end
    def delete(self, word):
        node = self
        parent = self
        for char in word:
            if char in node.children:
                parent = node
                node = node.children[char]
            else:
                return False
        if not node.children:
            del parent.children[char]
            del node
            return True
        else:
            node.end = "#"
            return True

我在这里漏掉了什么?

我像这样从另一个类的trie实例调用函数:

self.trie.delete(user_input)

共有1个答案

陆雅志
2023-03-14

您的尝试的问题与以下两点有关:

>

  • 您的append_word方法显示节点没有属性。它们是字典。具有children属性的唯一对象是trie实例,而且只有一个这样的实例。结构的其余部分是以属性开始的嵌套字典

    对于parent,您只保留最后一个父级,而不是所有祖先。要做到这一点,您需要回溯可能的多个祖先,直到您遇到一个仍在使用另一个单词的祖先。因此,实际上您需要一个祖先列表,而不仅仅是一个引用。

    以下是更正后的实现:

    def delete(self, word):
        node = self.children
        stack = []
        for char in word:
            if char not in node:  # Word is not in the Trie
                return False
            stack.append(node)  # Collect as ancestor
            node = node[char]
        if self.end not in node:  # End-of-word marker is missing, so word is not in Trie
            return False
        del node[self.end]   # Remove end-of-word marker
        for char in reversed(word):  # Backtrack in reversed order
            if len(node):  # Still in use for another word?
                break
            node = stack.pop()
            del node[char]
        return True
    

  •  类似资料:
    • 在我的数据框架中,有一列名为“teams”。它包括城市和球队名称。我想把这个城市拉进另一个纵队。这是数据帧:数据帧示例 我可以使用正则表达式轻松提取列: 然而,在“名称”栏中,对于纽约尼克斯队,它只给了我“New”的值,我想得到“New York”: 结果 那么,我该怎么做呢?如果单元格有2个单词,我该如何从开头只提取一个单词?如果单元格有3个单词,我该如何使用正则表达式从中提取2个单词?

    • 我想从文件。 示例: 我想给我们一种动态命令,因为我不必每次为每个用户手动输入。 我试过了 但这并没有达到预期的效果。

    • 我有一个需要清理的字符向量。具体来说,我想删除“投票”之前的数字请注意,数字有一个逗号分隔千,因此更容易将其视为字符串。 我知道gsub("*.投票",",文本)将删除所有内容,但如何删除数字?另外,我如何将重复的空间折叠成一个空间? 谢谢你的帮助! 示例数据:

    • 如果我有一个字符串“word3 word2 word3 word4 word5 word3 word7 word8 word9 word10” 我想找到所有的“word3”,使其在“word5”的3个单词之内,我将得到与“word3”第二次和第三次出现的匹配 我会使用什么正则表达式或逻辑?我有两种方法,但它们对我来说效率太低了。

    • 之前: Lorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eusmod tempor incidunt ut labore et dolore magna aliqua. 之后: elit,sed do eusmod tempor incidunt ut labore et dolore magna aliqua. 唯一的

    • 问题内容: 我有一个像这样的词,它由两个简单的词组合而成,没有空格。 我想知道哪种Lucene Analyzer可以将这种单词标记为两个单独的单词? 问题答案: 有一个看作为在Solr的说明 该过滤器使用组成词的词典将复合词拆分或分解为单个词。每个输入令牌均不变地传递。如果还可以将其分解为子字,则每个子字也将在同一逻辑位置添加到流中。 在:“ Donaudampfschiff dummkopf”中