我有一组彼此具有各种依赖关系的元素。这些依赖关系可能很严格,例如。 a
取决于b
和c
;或者某些元素可能有替代品,例如。 s
取决于t
或u
。没有循环依赖。
我正在尝试使用依赖项信息做两件事:
(实际上2给出1是微不足道的,因为我可以生成所有排列并在资源允许的情况下检查它们。虽然可能有更好的算法。)
是否有适用于具有替代依赖关系的元素的算法?我发现很多只能说明严格的依赖关系,但我不知道足够的术语来缩小我的搜索范围。
答案 0 :(得分:1)
我们假设您的元素列在 L 中。然后,对于 L 中的每个元素 e ,您将验证是否已解析所有直接依赖项。要验证每个元素 e ,您可以浏览 e 依赖关系列表 D 并确保所有元素 d 在 L 中找到strong> D 。为了解决替代方案的问题,现在将每个 d 视为其自身的替代依赖项列表。
for each d in e.D
d_ok = false
for each alt_d in d
if alt_d in L: d_ok = true, break
if not d_ok: return false
return true
要列出满足依赖关系的所有可能集合,您可以使用置换索引迭代所有可能不同顺序中的所有alt_d
。您可以事先生成这些索引,因为您知道 L 的每个元素的替代数量。您可以在以下代码中使用的MATLAB中查看ndgrid
,假设元素 a 有三个依赖项, b 有两个:
[idx_a, idx_b] = ndgrid(1:3, 1:2);
idx = [idx_a(:), idx_b(:)];
有关如何使用此类预先计算的索引的参考,与您要在其中实现的语言无关。
答案 1 :(得分:0)
对于非严格依赖,如果它只有两个选择,例如。 s取决于t或u(不再),您可以将其视为2SAT-problem并解决它。