这是我正在努力解决的问题。我有一套"喜欢"定义一个喜欢另一个人的人的元素。例如,一个元素将拥有信息" John喜欢Jane"。另一个可能有"简喜欢约瑟夫"等等。我想知道确定
的最佳算法是什么我在看旅行推销员算法。但它并没有为我提供形成闭环的最少数量的节点
感谢您的帮助
答案 0 :(得分:0)
从第一个人开始。
跟随他们喜欢的人群,将每个人存储在一个阵列中。一旦你找到一个重复的人,这意味着你已经到了一个循环,要找到这个循环的长度,你会发现该人的两个出现在personarr[X]
和personarr[Y]
并且做Y - X.存储该循环的长度以及其中的任何成员。
现在,确保保留personarr[]
你将转移到第二个人身上。如果它们不在数组中,则将它们添加到它并重复第一步,否则转移到第三人。每当您找到新循环时,都会更新“最佳循环”信息。
答案 1 :(得分:0)
首先,您需要意识到,在最糟糕的情况下,您拥有至少一次遍历整个元素列表。
显示此图的示例是具有个顶点的图形,其中第一个顶点的每个三元组形成一个三角形,而最后个顶点彼此“相似”。您必须找到这两个元素才能看到您要查找的元素数量最少为,而在最坏的情况下,您最后会找到它们,就像您正在寻找密钥一样。< / p>
在您意识到这一点之后,您的问题基本上成为在未加权的有向图中找到最小周期的问题。我现在能想到的最好的解决方案是从每个节点运行BFS,找到自己的最短周期,然后取所有结果的最小值。运行时复杂度为。
我进行了快速搜索并找到this post,其中我刚才所说的建议是有人声称这是最好的方法。还有一个答案暗示使用DFS的另一种方式,它采用,但是从起,它在最坏的情况下不会渐近地改进任何东西。