之前我想说清楚是的,这是为了大学任务,我正在寻求帮助,理解算法能够实现它。 所以我可以在这里找到这个任务: https://www.labri.fr/perso/dorbec/AA/projet-uno.pdf
基本上我们有一套"卡"由2 int表示,表示卡的颜色,另一个表示数字。要完成的工作是找到最长的卡片序列,如UNO游戏,其中下一张卡片是相同的颜色或相同的数字。 为此,在诅咒期间实施了一系列算法,但我们必须实施的最后一个算法是"颜色编码"而现在我已经没时间了,仍然不太清楚它是如何工作的。 我会把文字的图像放在这里以保持格式。
了解它的任何帮助将不胜感激。
由于
答案 0 :(得分:3)
我想我可以帮助你。 您的问题可以很容易地转换为最长的路径问题。找到长度为k的路径很长一段时间很难解决。即使k相对较小,比如log(n),人们仍然认为在多项式时间内不可能。
基本思路:你多次为图形着色,并希望你不小心为长度为k的路径着色。嗯,这个概率非常小,但是如果你重复很多次,概率实际上变得非常大。
但首先,让我们假设图中有一条彩色路径。什么"有色"甚至意味着?有色意味着具有k个节点的长度为k-1的路径以k种不同的颜色着色。如果您从节点 v 开始,其颜色为1,您会怎么做? 你会看看你的邻居,看看他们的颜色是否与你不同。如果是,则将它们添加到名为 P(1)的集合中。 您可以继续使用其中一个邻居,看看他们是否有颜色,但尚未出现在颜色集中。只要您找到尚未看到的新颜色或者达到k-1颜色,或者您看到其中一个节点具有您已经看到的颜色,您就会这样做。在最后一种情况下,你放弃了任务并回到一切仍然良好的地方。
重要提示:我们为节点着色。长度为i的路径,有i + 1个节点和i个边缘。
更正式: 令P i(v):= {S是([k]选择i + 1)|的元素存在一条路径,用S中的颜色着色,以v结尾 P不是路径。 P包含一些我们称之为S的颜色。 在这种情况下,S不是数字。它是不同颜色的基数i + 1的子集。 例如: P 3(v)可能看起来像这样= {{绿色,红色,黑色,黄色},{粉色,橙色,灰色,黄色},{...}}。请注意"黄色"两次?如果我继续使用更多的子集,"黄色"会出现在每一套。为什么?因为它是我们终端节点v的颜色! 所以P i(v)至少拥有一个所有不同颜色的集合S,其中一条长度为i的路径被着色。这条路径以v结尾!
这是什么意思? 如果我们可以计算P k-1(v),并且该集合不是空的。存在长度为k的路径。真棒。
但是我们如何计算P k-1(v)? 这并不难: 如果我们想要计算P i(v)。我们需要什么? 我们需要P i-1(x)。 X?为什么? x是v的邻居! ---> g ----> y ---> o -----> x ------> v 说{绿色,黄色,橙色,x的颜色}是P i-1(x)的一个子集。我们称之为R. 记得? P i-1(x)可以有许多不同的集合。它可能看起来像这样:{{绿色,红色,黑色,黄色},{粉红色,橙色,灰色,黄色},{...}}! 那么与R,x和v的关系到底是什么? R是一组颜色,表示长度为i-1的彩色路径,其通向x。如果作为x的邻居的顶点v具有在R中尚未出现的颜色,那么我们可以将其添加到R.但是现在R已经获得了一种颜色。它的大小| R |,现在是i + 2。 似乎这必须是P i(v)的新子集之一!为什么现在v? 好吧,我们已经将路径扩展了一种颜色,因此最好保存在相应的设置中! 那么到目前为止我们看到了什么: - 你有一个P i(v)集,它包含子集S,它本身包含i + 1多种颜色(不要忘记v) - 如果你有一套P k-1(v),你有一条长度为k的路径,你可以喝啤酒。 - P i(v)可以由P i-1(x)计算,其中x是v的邻居!最重要的是,你唯一需要检查的是v的颜色是否出现在P i-1(x)的一个子集中,我们称之为R.
你如何从一开始就计算它? 你从P 0(v)开始,这只是v的颜色。 然后,对于v的每个邻居x,计算P 1(v)。如果你回忆起i-1的话,P 1(v)就是P 1-1(x)。 P 0(x)再次只是x的颜色。如果x和v的颜色不相同,它们就形成了P 1(v)的第一个子集! 然后通过计算P 1(x)来计算P 2(v),其再次由P 0(y)计算,其中y是x的邻居。 只要我们还没有达到P k-1(v),这种情况就会持续下去。
至于复杂性:这在O(2 ^ k km)内运行。其中m是边数,k是路径长度。 所以现在我们能够在多项式时间内使用这个算法来搜索k = log n long的路径。如果它大于那个,不幸的是,它不再是多项式。
所以,现在我们有一个算法可以找到一个" long"多项式时间的路径。可是等等。如果路径是彩色的,它只能这样做! 我不知道你住在哪里,但在我的世界里,图表默认不是彩色的,特别是不是不同颜色的路径。
我们必须这样做。 我们用k种不同的颜色为k长度的路径着色的概率是多少?
有k!使用k种不同颜色为图形着色的许多方法。但是有k ^ k种不同的方法来为具有k种不同颜色的路径着色,其中它们可以多次出现。示例:对于黄色= y和绿色= g,您有2个!= 2个选项,其中颜色必须不同:(y,g)或(g,y)。当颜色不必相同时,您有k ^ k = 2 ^ 2 = 4个选项。 (y,y),(g,g)和你已经看过的那些。 所以Pr [Path用diff着色。 color] = k!/ k ^ k,大于e ^ -k,与1 / e ^ k相同。 所以你同意概率非常小,对吗? 获得第一次成功的预期尝试次数是多少? 这是几何分布,期望值= 1 / p = e ^ k。 所以我们认为在e ^ k尝试之后我们可以希望第一次有一条彩色路径。有时它会少一些,有时甚至更多。 问题。一次尝试的失败是1-e ^ -k,非常大。但是如果我们说执行这个Te ^ k次,那么问题。 Te ^ k个连续故障变得非常小:(1-e ^ -k)^ Te ^ k< =(e ^ -e ^ -k)^ Te ^ k< = e ^ -T 所以问题。我们将在Te ^ k尝试后成功,大于1-e ^ -T。这非常小。
算法现在看起来如何? 1)用k种不同颜色随机地着色图形。 2)执行检查是否有彩色路径的算法 如果有一个返回它。如果不是继续。 3)重复步骤1和2 Te ^ k次。 (这很有趣,相信我)。 事实上并非如此。让计算机做到。
这种算法称为蒙特卡罗型随机算法。 它的运行时间是 O(Te ^ k * 2 ^ k * km)和假的概率"否则没有路径(但实际上有一个路径)"小于e ^ -T(再次,非常小)。再次,对于k = log n,这个随机算法实现了多项式运行时间!