如何分离列表中节点的子节点

罗斯·格里比诺

我正在研究一个特里数据结构,其中每个节点都是一个列表,其中包含一个值和对与该值对应的子节点的引用的条目,但似乎列表中的引用没有相互分开 - 所以例如,如果“the”和“sin”都在trie中,我的CONTAINS()函数将为“she”返回true,因为“s”在第一级,“h”在第二级,而“e”即使这些角色应该在不同的分支中,也处于第三级。我已经阅读了有关python引用的内容,无法弄清楚为什么会发生这种情况。

class triepair:
    value = None
    next = None

    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next

    def NEXT(self,next):
        self.next = next

    def GETNEXT(self):
        return self.next

class trienode:
    nodespace = []

    def __int__(self,nodespace=[]):
        self.nodespace = nodespace

    def APPEND(self,value):
        newnext = trienode()
        newpair = triepair(value,newnext)
        self.nodespace.append(newpair)

    def NEXT(self, value):
        for triepair in self.nodespace:
            if triepair.value == value:
                return triepair.GETNEXT()

        print("ERROR: value not found")
        return None

    def CONTAINS(self, value):
        for triepair in self.nodespace:
            if triepair.value == value:
                return True

        return False

    def INSERT(self, word):
        c = word[:1]
        rest = word[1:]

        if self.CONTAINS(c):
            if len(rest) > 0:
                nextnode = self.NEXT(c)
                nextnode.INSERT(rest)

        else:
            self.APPEND(c)
            if len(rest) > 0:
                nextnode = self.NEXT(c)
                nextnode.INSERT(rest)


    def TRACE(self, word):
        c = word[:1]
        rest = word[1:]
        if self.CONTAINS(c):
            print "found character ",c
            if self.NEXT(c) is not None and len(rest) > 0:
                self.NEXT(c).TRACE(rest)
            else:
                print "trace complete"

    def HASWORD(self, word):
        c = word[:1]
        rest = word[1:]

        if self.CONTAINS(c):
            #print str(self)," contains ",c
            if len(rest) > 0:
                return self.NEXT(c).HASWORD(rest)
            else:
                return True

        else:
            return False

class trie:
    root = trienode()

    def __init__(self):
        self.root = trienode()

    def INSERT(self,word):
        self.root.INSERT(word)

    def TRACE(self,word):
        if self.root is not None:
            self.root.TRACE(word)
        else:
            print("null trie")

    def CONTAINS(self, word):
        return self.root.HASWORD(word)
詹姆森

大声笑,这花了我一段时间来调试,但我找到了。

改变这个:

class trienode:
    nodespace = []

    def __int__(self,nodespace=[]):
        self.nodespace = nodespace

对此:

class trienode:
    nodespace = []

    def __init__(self):
        self.nodespace = []

首先,__int__这不是问题,但这只是问题的一部分。

在不知道确切原因的完整 Pythonic 细节的情况下,根nodespace正在被重用。

因此,当您在 中创建一个新的时APPEND(),它实际上并没有发生,并且您nodespace在新的“子项”中得到相同的结果。

结果,一切都是平的。所有value -> trienode对都处于同一级别,并且 trienode 引用始终指向同一事物。

总之,上述变化可以确保你有一个新的空启动nodespace,从而APPEND().NEXT().CONTAINS()等,将更加像你期望他们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获得子节点列表?

如何从节点列表中的节点获取属性?

如何从 XML 文件中获取节点和节点的子节点?

如何使用C#从当前xml节点列表中读取子节点值?

如何为节点列表获取Java中重复元素的子节点

如何在android中从Firebase获取子节点的子节点?

在节点集合中查找节点的子节点

分离的节点如何合并到git分支中?

在节点列表中查找节点

如何在 Firebase for Android 中获取根节点的子节点

如何通过引用子节点将节点从Firebase中删除?

如何获取jtree中根节点的所有子节点?

如何从Firebase中的父节点获取所有子节点?

如何在JavaFX中交换父节点的子节点?

如何分别显示不同节点组中的子节点?

如何过滤 XML 文档中的 XML 节点及其子节点?

如何在xml中读取子节点

如何获得重分支中的子节点?

悬停在子节点上时,TreeViewItem父节点和子节点IsSelected分离

如何在反应中访问 JSON 的子节点?MobileRiskList 是我们如何访问的列表?

如何从列表中不存在的xml中删除子节点

如何从节点列表中获取相应的边

如何从节点计划中获取列表?

如何从多列表中识别叶节点?

如何在 XSLT 中访问具有动态节点名称的节点的子节点

在igTree中扩展特定节点时如何扩展节点的所有子节点?

java - 如何通过节点在列表中的位置获取节点?(不是值,是整个节点)

删除列表中的节点

如何使用BeautifulSoup查找节点的子节点