如何解决遍历数据结构中所有可能的元素
我被算法问题困扰了好几天,在这里感谢您的任何帮助。
假设我的应用程序中有一些模块可以调用其他模块(作为子模块)。类似于 Matlab Simulink 中的块。模块也可以调用每一个形成一个循环。
为了简单起见,我制作了一个架构,它看起来像什么。
在管理面板中,管理员可以激活或停用其中一些模块。激活是很容易的。只需要检查一根链条。但是对于停用它是棘手的。我们不能仅仅停用它,因为它可能被其他一些模块使用。这就是为什么必须检查所有可能的情况。 此外,必须停用该模块的所有子模块(并检查是否被其他模块使用)。
例如,假设我想停用 X(及其子模块 A-B-C-E)
X 在 D 里面:
D - X
和内部:
Z - N
哪个调用
D - X
同时 X 调用应该停用的整个链:
X - A - B - C - E
再次,整个链 (X-A-B-C-E) 必须停用,但我们必须先检查 X-A-B-C-E 是否在其他地方使用。
我使用 C++,但任何伪代码都会有所帮助。
到目前为止我已经尝试过在地图中设置第一个 X-A-B-C-E ..然后去寻找所有链并取消我初始地图中的那些。剩下的可以安全停用。但它不起作用。
还尝试将其解析为链表...但我也不知道从哪里开始以及如何完成所有可能的组合。
解决方法
这将是直接的蛮力方法:
- 列出您要禁用的模块。
- 列出您已经看过的模块。
- 将 X 添加到您要禁用的模块列表中。
- 找到一个您尚未查看的要禁用的模块。叫它 M。
- 将 M 添加到您已经看过的模块列表中。
- 确定如果 M 被禁用,其他模块必须被禁用。将它们全部添加到您要禁用的模块列表中,除非它们已经在列表中。
- 重复步骤 4-6,直到没有您尚未查看的模块。
但请注意,这里的两个列表可能不是最好的数据结构。在每个模块中有一个布尔标志可能更有效,指示您是否看过它。我只是在说明总体思路,忽略这些细节。
如果这看起来像广度优先搜索,那是因为它是。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。