【发布时间】:2016-04-13 04:14:52
【问题描述】:
我正在努力解决一个问题,我必须找到一种方法来存储程序可能遵循的所有可能路径。 以这张图片为例。
在该图像中,每个数字代表一个复杂的进程,它可能会调用其他进程来执行自身,描述了您在图像中可以看到的所有路径。
所有实线表示过程必须遵循的路径,而虚线表示可选路径。
知道执行是从左到右和从上到下开始的,必须始终牢记,如果已经构建了一个分支,则它必须被重用,并且永远不会再次构建。
在另一个图像中,例如,黄线代表在执行 37 号进程期间遵循的所有路径。
在其中您可以看到从进程 18 (18->17->16) 开始的路径是先前构建的,因此当到达进程 19 时不应重建它,因为所有这些进程都需要相当长的时间并且在已经知道它们产生的结果的情况下尝试再次构建它们是浪费时间。相反,如果发现之前已经构建了某个数量(例如进程 18),则应将其复制/附加到调用它的进程(图像中的进程 19)。所有这些都是为了一个日志,我必须在其中存储所有完整的路径,这就是为什么我提到复制/重用分支的部分,因为我稍后必须查询该日志以显示所有这些路径。
为了执行所有这些过程,目前使用了递归过程,但由于它不考虑可以重用之前构建的路径,所以整个过程需要很长时间。
你知道任何可以帮助我优化这个过程的数据结构,以便如果一个过程已经执行,它只会被重用。至于日志,如上所述,我需要存储完整的路径。
任何想法或资源都将受到高度赞赏。
谢谢
编辑 1
---------------
我可能没有说得很清楚的一件事是,我需要创建的数据结构有两个目的:
- 跟踪主进程(示例中为 37 个)在执行期间遵循的所有路径,让我有机会随时判断某个路径是否已经存在跟随,然后能够将该路径复制到应该调用它的节点(在示例中,复制整个分支:18->17->16 到进程 19。
- 通过让我有机会判断路径是否已在此数据结构中,我可以避免执行已执行的子流程以及已知的结果,从而优化整个执行流程。李>
编辑 2
---------------
关于我为什么不考虑使用Dictionary 的问题,起初我有这个想法,但后来我找不到字典可以告诉我的方法,例如,路径开始有 18 (18->17->16) 来自进程 37 和 19。你看,一个节点可以有一个或多个父节点。我怎么能用字典来表达呢?
【问题讨论】:
-
这不是一个带有主键的数据库表吗?
-
你没有指定,为什么你不能在HashMap(字典)中保存结果...?
-
我会使用一棵树(进程 n°37 为根)并在插入新节点(即进程 n°18)时快速检查它是否已经在我的树中正在建设中……
-
@PieterGeerkens 因为所有这些进程都使用编译器(在 C# 中)来评估表达式,并且只有当我找到一个数字时,我才需要查询我的数据库以检索执行由该数字标识的进程所需的数据,否则不需要查询db。
标签: c# algorithm recursion data-structures