微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

遍历数据结构中所有可能的元素

如何解决遍历数据结构中所有可能的元素

我被算法问题困扰了好几天,在这里感谢您的任何帮助。

假设我的应用程序中有一些模块可以调用其他模块(作为子模块)。类似于 Matlab Simulink 中的块。模块也可以调用一个形成一个循环。

为了简单起见,我制作了一个架构,它看起来像什么。

enter image description here

管理面板中,管理员可以激活或停用其中一些模块。激活是很容易的。只需要检查一根链条。但是对于停用它是棘手的。我们不能仅仅停用它,因为它可能被其他一些模块使用。这就是为什么必须检查所有可能的情况。 此外,必须停用该模块的所有子模块(并检查是否被其他模块使用)。

例如,假设我想停用 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 ..然后去寻找所有链并取消我初始地图中的那些。剩下的可以安全停用。但它不起作用。

还尝试将其解析为链表...但我也不知道从哪里开始以及如何完成所有可能的组合。

就像我说的,这是一个棘手的问题,任何提示都会有所帮助。

解决方法

这将是直接的蛮力方法:

  1. 列出您要禁用的模块。
  2. 列出您已经看过的模块。
  3. 将 X 添加到您要禁用的模块列表中。
  4. 找到一个您尚未查看的要禁用的模块。叫它 M。
  5. 将 M 添加到您已经看过的模块列表中。
  6. 确定如果 M 被禁用,其他模块必须被禁用。将它们全部添加到您要禁用的模块列表中,除非它们已经在列表中。
  7. 重复步骤 4-6,直到没有您尚未查看的模块。

但请注意,这里的两个列表可能不是最好的数据结构。在每个模块中有一个布尔标志可能更有效,指示您是否看过它。我只是在说明总体思路,忽略这些细节。

如果这看起来像广度优先搜索,那是因为它是。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。