【问题标题】:Python - Tree SearchPython - 树搜索
【发布时间】:2017-02-13 16:05:42
【问题描述】:

我正在寻找python中最有效的树搜索实现。 我给树搜索一个长度为 n 的序列,它应该检测是否已经创建了分支,或者如果不是这样,则生成分支。

例子:

i1:序列1[0.89,0.43,0.28]

      0.89   check
       |
      0.43   check
       |
      0.28   check(last branch, last number of sequence == found)

i2:序列2[0.89,0.43,0.99]

      0.89   check
       |
      0.43   check
       |                                           |
      0.28   missing(Creating new branch)         0.99

考虑序列中的顺序很重要。

目标是跟踪大量序列(可见、不可见)。

有人有想法吗?

【问题讨论】:

  • heapq 可能会有所帮助。它适用于有序列表以实现二叉树。

标签: python sequence tree-search


【解决方案1】:

您可以为此使用无限嵌套的collections.defaultdict。下面的函数将创建一个defaultdict,当请求的值不存在时,它会再次调用相同的函数,创建另一个defaultdict,无穷无尽。

import collections
nested = lambda: collections.defaultdict(nested)
dic = nested()

现在,您可以将序列添加到嵌套的 defaultdict 中。您可以循环执行此操作,也可以递归执行此操作,或者直接使用reduce

s1 = [0.89,0.43,0.28]
s2 = [0.89,0.43,0.99]

from functools import reduce # Python 3
reduce(lambda d, x: d[x], s1, dic)
reduce(lambda d, x: d[x], s2, dic)

之后,dic 看起来像这样:(实际上,它看起来有点不同,但这只是因为defaultdict 还打印了创建它的函数。)

{0.89: {0.43: {0.28: {}, 0.99: {}}}}

如果“序列的顺序很重要”是指添加序列的顺序,而不是序列的顺序,则必须改用collections.OrderedDict .在这种情况下,添加新元素会稍微复杂一些,但不会太多。

dic = collections.OrderedDict()

def putall(d, s):
    for x in s:
        if x not in d:
            d[x] = collections.OrderedDict()
        d = d[x]

putall(dic, s1)
putall(dic, s2)

【讨论】:

  • 嗨 Tobias,很好的解决方案。如何查看是否由于输入序列中包含新值而创建了新的 defaultdict?以及如何删除现有的默认字典?
  • @abcdef123e 使用默认字典,您无法真正找出答案(除了对更新前后的状态进行深入比较)。但是使用第二种方法,您可以在执行if x not in d 分支时轻松地将bool 标志设置为True,并在最后返回它。关于删除元素/分支:del dic[a][b][c] 应该可以正常工作。
  • OrderedDict 解决方案如果考虑序列中的顺序会非常好。我需要这样的东西,但能够跟踪序列的顺序,以便该函数能够说“我之前已经准确地看到过这个序列 x 次。”。有没有人知道如何做到这一点?
  • @abcdef123e 它确实跟踪序列中的顺序。第一个元素是顶级字典中的键,字典中的第二个元素是该键的值,依此类推。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2022-01-24
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2021-07-03
  • 2019-04-17
相关资源
最近更新 更多