当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python NetworkX prefix_tree用法及代码示例


本文简要介绍 networkx.generators.trees.prefix_tree 的用法。

用法:

prefix_tree(paths)

从路径列表创建有向前缀树。

通常路径被说明为字符串或整数列表。

“prefix tree” 表示字符串的前缀结构。每个节点代表某个字符串的前缀。根代表空前缀,单字母前缀有子前缀,每个双字母前缀都有子前缀,从父节点对应的单字母开始,依此类推。

更一般地,前缀不需要是字符串。前缀是指序列的开始。根对于每个一个元素前缀都有子元素,并且对于以父元素的一个元素序列开头的每个两个元素前缀它们都有子元素,依此类推。

请注意,此实现使用带有属性的整数节点。每个节点都有一个属性“source”,其值为该节点对应的路径的原始元素。例如,假设paths 由一条路径组成:“can”。那么表示该路径的节点[1, 2, 3]具有“source”值“c”, “a”和“n”。

一个节点的所有后代在与该节点关联的序列/路径中都有一个公共前缀。从返回的树中,每个节点的前缀可以通过遍历树到根并沿途累积 “source” 值来构造。

根节点始终为 0 并具有 “source” 属性 None 。根是唯一度数为零的节点。 nil 节点始终为 -1 并具有 “source” 属性 "NIL" 。 nil 节点是out-degree 为零的唯一节点。

参数

paths: iterable of paths

一个可迭代的路径,它们本身就是序列。这些序列之间的匹配前缀用前缀树的节点来标识。树的一个叶子与每条路径相关联。 (相同的路径与树的同一叶相关联。)

返回

树:DiGraph

表示由 paths 生成的前缀树组成的树状结构的有向图。节点是定向的“downward”,从父节点到子节点。添加一个特殊的“synthetic” 根节点作为每个路径中第一个节点的父节点。添加一个特殊的 “synthetic” 叶节点,即 “nil” 节点 -1 ,作为代表路径中最后一个元素的所有节点的子节点。 (从技术上讲,添加这个 nil 节点使其不是树状图,而是有向无环图;移除 nil 节点使其成为树状图。)

注意

前缀树也称为 trie

例子

从具有公共前缀的字符串列表中创建前缀树:

>>> paths = ["ab", "abs", "ad"]
>>> T = nx.prefix_tree(paths)
>>> list(T.edges)
[(0, 1), (1, 2), (1, 4), (2, -1), (2, 3), (3, -1), (4, -1)]

叶节点可以作为 nil 节点的前辈获得:

>>> root, NIL = 0, -1
>>> list(T.predecessors(NIL))
[2, 3, 4]

要恢复生成前缀树的原始路径,请从节点 -1 向上遍历树到节点 0

>>> recovered = []
>>> for v in T.predecessors(NIL):
...     prefix = ""
...     while v != root:
...         prefix = str(T.nodes[v]["source"]) + prefix
...         v = next(T.predecessors(v))  # only one predecessor
...     recovered.append(prefix)
>>> sorted(recovered)
['ab', 'abs', 'ad']

相关用法


注:本文由纯净天空筛选整理自networkx.org大神的英文原创作品 networkx.generators.trees.prefix_tree。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。