我有一个__max_depth
和一个__max_splits
参数,我想生成一个随机树,以便每个"节点"我可以执行某项操作(例如生成随机数)。
然而,我几乎陷入困境,因为我无法理解嵌套循环中哪一个首先出现:for depth in range(0, __max_depth)
还是for split in range(0, __max_splits)
?
我想到的基本上是一条可以像这样完全遍历树的路径(在这种情况下,深度为3,分割为2):
- root -> node 1a -> node 2aa -> node 3aaa
-> node 3aab
-> node 2ab -> node 3aba
-> node 3abb
-> node 1b -> node 2ba -> node 3bba
-> node 3bab
-> node 2bb -> node 3bba
-> node 3bbb
我也希望能够理解我在树中的位置,更具体地说,我在树中的深度(因为depth % 2 == 0
我喜欢做某些操作,因为a depth % 2 == 1
其他人。)
有关如何在纯Python中实现它的任何建议?我很失落。
编辑:我尝试做的是生成随机游走。我想从自定义点(我的根)开始遍历几乎无限的有向网络(图形),并保存我给出路径时分析的节点的所有信息。 随机游走所覆盖区域的大小由两个参数决定(区域的高度为max_depth,宽度为max_split)。
答案 0 :(得分:1)
你可以从递归结构开始吗? 这是一个极简主义示例,其中有一个类来表示一个节点,可以让您跟踪,但您也可以使用字典或命名元组的集合来组织数据:
SELECT
您可以将子项添加到根目录,并将树增长到所需的深度。
我会让你思考,搜索,弄清楚如何穿越你的树,跟踪深度等......
答案 1 :(得分:1)
对我来说,你想要达到的目标并不完全清楚,但听起来你正在做一些家庭作业或锻炼。所以我不会给你程序代码。但是一个如何自己实现它的概念。
一种 - 简单方法是使用递归。定义生成节点的函数。这个节点只不过是一个项目列表 - 叶子或嵌套节点。
如果调用此函数,则向该函数传递两个参数:首先是树的预期深度,第二个是节点应该具有的叶子,分支或“分裂”的数量。
该函数应包含创建列表的代码。如果 - 且仅当 - 树的深度为零,则返回一个充满随机数的列表。您可以使用def walk(treeNode, maxDepth, maxSpread, currentPath = "", cache = None):
if cache is None:
cache = {}
for i in range(maxSpread):
leaf = treeNode.getLeaf(i)
# do something with leaf, generate /value/
cache[currentPath] = value
if maxDepth >= 1:
walk(leaf, maxDepth - 1, maxSpread, path + "|" + str(i), cache)
模块来实现这一目标。但是,如果所需深度大于零,请填写此列表,而不是使用数字,而是填充节点!要让节点从该函数内再次调用您的函数,因为此函数正在生成节点。 (这称为“递归”。)但是调用深度减1的函数:这样每个函数调用都会导致更多的函数调用(深度减小)。这样,当您下到树中时,您将根据需要自动生成节点。
在开始实施之前,您可能希望首先更详细地了解递归。请先详细了解一下,我觉得网上有很多关于这方面的资料。
并且 - 对于记录 - 我认为最终你需要大约十行代码。
编辑:我仍然不完全理解你想要做什么,但认为这是一个起点:
cache
此处{{1}}存储了您想要跟踪的一些值。该方法继续通过树状网络。如果你想随机化它,你需要以随机的方式选择节点,而不是像我的例子那样一个接一个。