查找具有最少元素的闭环子集

时间:2017-07-31 23:14:59

标签: algorithm search

这是我正在努力解决的问题。我有一套"喜欢"定义一个喜欢另一个人的人的元素。例如,一个元素将拥有信息" John喜欢Jane"。另一个可能有"简喜欢约瑟夫"等等。我想知道确定

的最佳算法是什么
  1. 一起形成闭环的最少元素数量。在上面的例子中,如果我们有另一个元素"约瑟夫喜欢John"那么这3个元素将形成一个闭环
  2. 元素列表可能很大
  3. 我在看旅行推销员算法。但它并没有为我提供形成闭环的最少数量的节点

    感谢您的帮助

2 个答案:

答案 0 :(得分:0)

从第一个人开始。

跟随他们喜欢的人群,将每个人存储在一个阵列中。一旦你找到一个重复的人,这意味着你已经到了一个循环,要找到这个循环的长度,你会发现该人的两个出现在personarr[X]personarr[Y]并且做Y - X.存储该循环的长度以及其中的任何成员。

现在,确保保留personarr[]你将转移到第二个人身上。如果它们不在数组中,则将它们添加到它并重复第一步,否则转移到第三人。每当您找到新循环时,都会更新“最佳循环”信息。

答案 1 :(得分:0)

首先,您需要意识到,在最糟糕的情况下,您拥有至少一次遍历整个元素列表。

显示此图的示例是具有3n+2个顶点的图形,其中第一个3n顶点的每个三元组形成一个三角形,而最后2个顶点彼此“相似”。您必须找到这两个元素才能看到您要查找的元素数量最少为2,而在最坏的情况下,您最后会找到它们,就像您正在寻找密钥一样。< / p>

在您意识到这一点之后,您的问题基本上成为在未加权的有向图中找到最小周期的问题。我现在能想到的最好的解决方案是从每个节点运行BFS,找到自己的最短周期,然后取所有结果的最小值。运行时复杂度为O(V^2)

我进行了快速搜索并找到this post,其中我刚才所说的建议是有人声称这是最好的方法。还有一个答案暗示使用DFS的另一种方式,它采用O(V+E),但是从E=O(V^2)起,它在最坏的情况下不会渐近地改进任何东西。