C#数据结构以分层的方式存储项目,一旦建立了分支,它便允许我检索它并将其添加为另一个分支的一部分
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#数据结构以分层的方式存储项目,一旦建立了分支,它便允许我检索它并将其添加为另一个分支的一部分,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3612字,纯文字阅读大概需要6分钟。
内容图文
我在一个难题中挣扎,必须找到一种方法来存储程序可能遵循的所有可能路径.
以这张图片为例.
在该图像中,每个数字代表一个复杂的过程,该过程可能会调用其他过程来执行自身,描述了您可以在图像中看到的所有路径.
所有实线表示过程必须遵循的路径,而虚线表示可选的路径.
知道执行是从左到右,从上到下开始的,因此必须始终牢记,如果已经构建了分支,则必须重用它,而再也不能重新构建它.
在此另一幅图像中,例如,黄线表示在执行过程编号37期间遵循的所有路径.
在其中,您可以看到先前已建立从流程18(18-> 17-> 16)开始的路径,因此当到达流程19时,不应重新构建它,因为所有这些流程都需要花费一些时间,并且在已经知道它们产生的结果的情况下尝试重新构建它们将是浪费时间.相反,如果发现某个特定数字先前已构建(例如,过程18),则应将其复制/附加到调用它的过程(图像中的过程19).所有这些都是针对必须在其中存储所有路径的完整日志,这就是为什么我提到复制/重用分支的部分,因为稍后我将不得不查询该日志以显示所有这些路径.
当前要执行所有这些过程,需要使用递归过程,但是由于它不认为它可以重用以前构建的路径,因此整个过程很费时.
您是否知道任何可以帮助我优化此流程的数据结构,以便如果某个流程已经执行,则仅重用它.至于日志,如上所述,我需要存储完整的路径.
任何想法或资源将不胜感激.
谢谢
编辑1
—————————-
也许我没有弄清楚的一件事是,我需要创建的数据结构有两个目的:
>为了跟踪执行过程中主流程(示例中为37)的所有路径,使我有机会随时知道是否已遵循某个路径,然后能够将该路径复制到节点应当调用它(在示例中,将整个分支:18-> 17-> 16复制到进程19.
>通过让我有机会知道该数据结构中是否已经存在路径,我可以避免执行已执行的子流程以及已知的结果,从而优化了整个执行过程.
编辑2
—————————-
关于我为什么不考虑使用字典的问题,起初我有这个想法,但是后来我找不到字典可以告诉我的方法,例如,路径以18(18- (> 17-> 16)来自过程37和19.您会看到,一个节点可以有一个或多个父节点.如何用字典来表达呢?
解决方法:
我相信这是您要查找的数据结构:
var paths = new Dictionary<int, HashSet<int>>()
{
{ 37, new HashSet<int>() { 18, 33, 34, 35, 36, } },
{ 18, new HashSet<int>() { 17, } },
{ 33, new HashSet<int>() { } },
{ 34, new HashSet<int>() { 19, 17, 15, } },
{ 35, new HashSet<int>() { 17, } },
{ 36, new HashSet<int>() { } },
{ 17, new HashSet<int>() { 16, } },
{ 19, new HashSet<int>() { 12, 18, } },
{ 15, new HashSet<int>() { 14, } },
{ 16, new HashSet<int>() { } },
{ 12, new HashSet<int>() { 11, } },
{ 14, new HashSet<int>() { } },
{ 11, new HashSet<int>() { } },
};
这是将路径添加到路径的代码:
public bool TryAddPath(Dictionary<int, HashSet<int>> paths, int x, int y)
{
if (!paths.ContainsKey(x))
{
paths[x] = new HashSet<int>() { };
}
if (!paths[x].Contains(y))
{
paths[x].Add(y);
if (!paths.ContainsKey(y))
{
paths[y] = new HashSet<int>() { };
}
return true;
}
return false;
}
上面的数据结构可以通过以下方式构建:
var paths = new Dictionary<int, HashSet<int>>();
var results = new bool[]
{
TryAddPath(paths, 37, 18),
TryAddPath(paths, 37, 33),
TryAddPath(paths, 37, 34),
TryAddPath(paths, 37, 35),
TryAddPath(paths, 37, 36),
TryAddPath(paths, 18, 17),
TryAddPath(paths, 17, 16),
TryAddPath(paths, 34, 19),
TryAddPath(paths, 34, 17),
TryAddPath(paths, 34, 15),
TryAddPath(paths, 19, 12),
TryAddPath(paths, 19, 18),
TryAddPath(paths, 12, 11),
TryAddPath(paths, 18, 17),
TryAddPath(paths, 17, 16),
TryAddPath(paths, 17, 16),
TryAddPath(paths, 15, 14),
TryAddPath(paths, 35, 17),
TryAddPath(paths, 17, 16),
};
这将返回数组{true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,true,true,false,},该数组显示了不需要进行处理.
为了获得回溯列表的方法,请执行以下操作:
ILookup<int?, int> parents =
paths
.Keys
.AsEnumerable()
.SelectMany(
k => paths[k].Select(x => (int?)x).DefaultIfEmpty(),
(k, v) => new { k, v })
.ToLookup(x => x.v, x => x.k);
现在我可以问父母[17],我得到{18,34,35,}返回.我什至可以做parents [null],然后返回{33,36,16,14,11,},它显示了叶子的节点.
内容总结
以上是互联网集市为您收集整理的C#数据结构以分层的方式存储项目,一旦建立了分支,它便允许我检索它并将其添加为另一个分支的一部分全部内容,希望文章能够帮你解决C#数据结构以分层的方式存储项目,一旦建立了分支,它便允许我检索它并将其添加为另一个分支的一部分所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。