急于版本范围的依赖有关问题的算法
急求一个急于版本范围的依赖问题的算法
有很多个组件,组件之间会有依赖关系,依赖关系是一个版本范围的依赖,比如:
对同一个组件类型,只能选择其中一个版本。 那假设我现在确定了我要组件A,版本1和组件D,版本1。 我需要确定出组件B和C分别用哪个版本。
考虑,依赖会有很多层,但是不会有循环依赖。
请描述详细算法,谢谢了!
------解决方案--------------------
类似的问题解决过
首先描述出组件之间的依赖关系,无非是并或或
Depend(A) = (B1 or B2 or B3) and (C1 or C2 or C3)
Depend(D) = (B2 or B3) and (C1 or C2)
解决问题
Solve(A and D)
每一个depend都会生成一个字典型的版本集
for A:
B(1,2,3)
C(1,2,3)
for D:
B(2,3)
C(1,2)
如果集与集之间的关系是and则合并集合,同键值之间取交集,如果关系是or则保持之作为分支继续往下搜
得到
for (A and D)
B(2,3)
C(1,2)
问题转化为
Solve((B2 or B3) and (C1 or C2))
如此。
对于or分支,我会每个都解开,看起来有点恐怖,但是实际不会太夸张,因为只是组件依赖,数据不可能到很离谱的程度。
------解决方案--------------------
每个分支是指每个or,不是组合
比如
Solve((B2 or B3) and (C1 or C2))
分支有b2,b3,c1,c2单独去求他们的集,不是组合到一块
如果有冲突的情况,可设置一个冲突集列表
Conflict(B2,C1)
Conflict(B3,C2)
...
对正在解决的问题维持一个当前集冲突,尝试往里面加入时检查,比如加入b2后,
{C1}
加入C2后
{C1,B3}
如果要回溯到某一步,则要根据当时一部的集重新构造冲突集。
还有最重要的一点:缓存结果,不要每次都去算就行了。
有很多个组件,组件之间会有依赖关系,依赖关系是一个版本范围的依赖,比如:
组件 A, 版本 1 依赖: 组件 B, 版本 1~3; 和 组件 C, 版本 2~3
组件 D, 版本 1 依赖: 组件 B, 版本 2~4; 和 组件 C, 版本 1~2
对同一个组件类型,只能选择其中一个版本。 那假设我现在确定了我要组件A,版本1和组件D,版本1。 我需要确定出组件B和C分别用哪个版本。
考虑,依赖会有很多层,但是不会有循环依赖。
请描述详细算法,谢谢了!
算法
------解决方案--------------------
类似的问题解决过
首先描述出组件之间的依赖关系,无非是并或或
Depend(A) = (B1 or B2 or B3) and (C1 or C2 or C3)
Depend(D) = (B2 or B3) and (C1 or C2)
解决问题
Solve(A and D)
每一个depend都会生成一个字典型的版本集
for A:
B(1,2,3)
C(1,2,3)
for D:
B(2,3)
C(1,2)
如果集与集之间的关系是and则合并集合,同键值之间取交集,如果关系是or则保持之作为分支继续往下搜
得到
for (A and D)
B(2,3)
C(1,2)
问题转化为
Solve((B2 or B3) and (C1 or C2))
如此。
对于or分支,我会每个都解开,看起来有点恐怖,但是实际不会太夸张,因为只是组件依赖,数据不可能到很离谱的程度。
------解决方案--------------------
每个分支是指每个or,不是组合
比如
Solve((B2 or B3) and (C1 or C2))
分支有b2,b3,c1,c2单独去求他们的集,不是组合到一块
如果有冲突的情况,可设置一个冲突集列表
Conflict(B2,C1)
Conflict(B3,C2)
...
对正在解决的问题维持一个当前集冲突,尝试往里面加入时检查,比如加入b2后,
{C1}
加入C2后
{C1,B3}
如果要回溯到某一步,则要根据当时一部的集重新构造冲突集。
还有最重要的一点:缓存结果,不要每次都去算就行了。