繁体   English   中英

我有一个链接的 trie 返回 false 而不是 true。 可以修复代码中的哪些错误?

[英]I have a linked trie returning false instead of true. What errors can be fixed in the code?

我有一个没有按预期做的尝试。 它的代码如下:

class Trie:
    def __insert(node, item):
        # This is the recursive insert function.        
        if len(item) == 0:
            return None

        elif node == None:
            newnode = Trie.TrieNode(item[0])
            newnode.follows = Trie.__insert(newnode.follows, item[1:])
            return newnode

            # return Trie.TrieNode(item[0], follows=Trie.__insert(node, item[1:]))

        elif node.item == item[0]:
            node.follows = Trie.__insert(node.follows, item[1:])

        else:
            node.next = Trie.__insert(node.next, item)

    def __contains(node, item):
        # This is the recursive membership test.
        if len(item) == 0:
            return True

        elif node == None:
            return False

        elif node.item == item[0]:
            return Trie.__contains(node.follows, item[1:])

        else:
            return Trie.__contains(node.next, item)

    class TrieNode:
        def __init__(self, item, next=None, follows=None):
            self.item = item
            self.next = next
            self.follows = follows

        def __str__(self):
            return "TrieNode(" + str(self.item) + ")"

    def __init__(self):
        self.start = None

    def insert(self, item):
        sentinel = item + "$"
        self.start = Trie.__insert(self.start, sentinel)

    def __contains__(self, item):
        sentinel = item + "$"
        return Trie.__contains(self.start, sentinel)


def main():
    t = Trie()
    t.insert("cow")
    t.insert("cat")
    # t.insert("rat")
    # t.insert("rabbit")
    # t.insert("dog")

    print("cow" in t)

if __name__ == "__main__":
    main()

以下是代码规则:

对于 __insert function:

  1. 如果键为空(即键中没有单元),则返回None作为空节点。
  2. 如果节点为None则使用密钥的下一个单元创建一个新节点,并将密钥的 rest 插入并添加到follows链接。
  3. 如果密钥的第一个单元与当前节点的单元匹配,则将密钥的 rest 插入到节点的follows链接中。
  4. 否则,将密钥插入节点的next链接。

对于 __contains function:

  1. 如果 key 的长度为 0,则返回True报告成功。
  2. 如果我们正在查看的节点是None然后通过返回False报告失败。
  3. 如果密钥的第一个单元与当前节点中的单元匹配,则检查从follows节点开始的密钥的 rest 的成员关系。
  4. 否则,从 trie 中的next节点开始检查密钥的成员资格。

插入一项即可; 例如,如果里面只有cat ,它会在检查cat时给出True

不过,这是一个不同的故事,有多个字符串。 主要的 function 给出了False ,而不是True ,因为它应该。 我想知道这是否与__insert__contains函数有关。 有什么办法可以解决吗?

item不为空时,您的__insert方法应始终返回一个节点。 然而,如果该node不是 None,它返回 None。 但在那种情况下应该返回node

所以在这个方法的最后添加return node

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM