在尝试找到最长路径的同时消除有向无环图中的无关边

2024-04-23

我问了一个question https://stackoverflow.com/q/8685598/35690关于在可变数量的集合中查找没有重复字符的子序列。解决方案是创建每对字母的矩阵,丢弃每组中未出现的字母,然后找到最长路径 http://en.wikipedia.org/wiki/Longest_path_problem在有向无环图中。但是,我不想要最长的路径,我想要几个最长的路径(例如,如果它生成长度为 10、10、9、8、8、3、3、2 和 1 的子序列,我可能想要仅显示前 5 个子序列)。

因此,由于我不仅仅寻找最长的路径,为了生成结果子序列,而不是使用维基百科文章中描述的最长路径算法,我使用了一种简单的算法,它只是生成所有的列表可能的子序列。这会生成类似于结果的集合一个答案 https://stackoverflow.com/a/8686019/35690对于我之前的问题。

问题是我想减少它生成的子序列的数量。

例如,如果我有以下集合:

A = AB12034
B = BA01234
C = AB01234

...我的算法目前将得出每组中出现的以下对:

A - 1     B - 1     1 - 2     2 - 3     0 - 3     3 - 4
    2         2         3         4         4
    3         3         4
    4         4
    0         0

这在技术上是正确的,但我想消除其中一些对。例如,请注意2总是在之后1。因此,我想消除A2 and B2对(即A and B永远不应该直接跳到2...他们应该总是经历1第一的)。还,1不应该跳转到除此之外的任何数字2, since 2总是紧随其后发生。此外,请注意如何0总是发生在B and 3,所以我想消除这对B3(再次,B应该总是经过0在它跳转到之前3,因为所有集合的这三个字母的位置为:B < 0 < 3).

需要明确的是,当前的算法将得出这些子序列:(我只包括那些以A为简洁起见):

A1234
A124  *
A134  *
A14   *
A234  *
A24   *
A34   *
A4    *
A034
A04   *

...以及所有标有*应该被消除。

生成所需子序列的(正确)对将是:

A - 1     B - 1     1 - 2     2 - 3     0 - 3     3 - 4
    0         0                           

...子序列的完整列表将是:

A1234
A034
B1234
B034
1234
234
034
34

换句话说,我试图从这个有向无环图出发:

To this:

我应该使用什么样的算法/逻辑来消除这些无关的对(即图形边缘)?或者您认为我首先生成对的逻辑应该改变吗?


此外,请注意 0 总是出现在 B 和 3 之间,因此我想消除 B3 对(同样,B 在跳转到 3 之前应该始终经过 0,因为所有集合都将这三个字母的位置设为: B

嗯,好吧,如果n0 < n1 < n2保留所有集合,然后删除所有集合(n0, n2)对?这可以通过以下方式实现(在pseudoPython中):

for(edge in node):
    if(len(LongestPath(node, edge.Node)) > 1):
        RemovePair(node, edge.Node)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在尝试找到最长路径的同时消除有向无环图中的无关边 的相关文章

随机推荐