Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 龟兔算法返回一个案例的空结果,重复字符的结果不正确_Algorithm - Fatal编程技术网

Algorithm 龟兔算法返回一个案例的空结果,重复字符的结果不正确

Algorithm 龟兔算法返回一个案例的空结果,重复字符的结果不正确,algorithm,Algorithm,我正在经历。使用Ruby语言,我实现了以下功能: def tortoise_and_hare(sequence) tortoise = 1 hare = 2 while sequence[tortoise] != sequence[hare] tortoise += 1 hare += 2 end # Find start index of first repetition idx = 0 tortoise = 0 while sequence[

我正在经历。使用Ruby语言,我实现了以下功能:

def tortoise_and_hare(sequence) tortoise = 1 hare = 2 while sequence[tortoise] != sequence[hare] tortoise += 1 hare += 2 end # Find start index of first repetition idx = 0 tortoise = 0 while sequence[tortoise] != sequence[hare] tortoise += 1 hare += 1 idx += 1 end # Find length of cycle starting from index idx length = 1 hare = tortoise + 1 while sequence[tortoise] != sequence[hare] hare += 1 length += 1 end [idx, length] end sequence = [2, 0, 6, 3, 1, 6, 3, 1, 6, 3, 1] idx, length = tortoise_and_hare(sequence) p sequence[idx, length] 它看起来是错误的还是在某些情况下可能失败? 对于第二个重复字符的问题,我们可以做些什么? 虽然我想出了另一个优雅的基于正则表达式的解决方案,但我仍然想进一步了解上述算法

好奇的正则表达式解决方案:/?\d+\s+\d+\s\k/


编辑:我理解为什么它无法检测重复字符。但是在这种情况下,还有其他算法可以帮助您吗?

答案是您的代码很好,但是您的样本集太小了。该算法并不要求在尽可能短的数据量中找到一个循环

链接页面上的数据集定义定义了生成无限数据集的过程。这些数据最终必须重复,因为您的域是无限的,但您的范围是有限的

根据范围的不同,该算法需要更多或更少的数据来确定周期。你只是提供得不够

至于我会采用的解决方案?我将通过插入第一个数字来创建一个范围内每个数字的地图,以及我找到它的位置。一旦你找到一个重复,你就找到了你的周期。从第一个实例的位置到第二个实例之前的位置。这提供了线性运行时和N*M内存使用。N=列表的大小M=值的范围

下面是您想要的perl rusty perl正则表达式:

$data = "1 2 3 4 5 3 4 5"; 
if ($data =~ /(?<c>\d).*?(\k<c>)/) {
    print substr($data, $-[1], $-[2]-$-[1])."\n";
} elsif {
    print "NO\n";
}

最坏的情况是n^2,我想它只适用于容易修复的一位数,但它更严格

好的,我理解了为什么这个算法在重复字符的情况下不可能工作。在这种情况下,是否有任何算法可以工作?既然您没有任何答案,为什么不更新您的问题以反映您当前的问题,而不是用另一个问题来评论您的问题。@xaxxon,已编辑。我没有想到这一点,而且,我甚至不想去考虑正则表达式解决方案的运行时复杂性。这可能看起来很优雅,但回溯到这一点肯定是可怕的。可能是N!运行时或类似的惊人的事情!它将吃掉你的整个数据集,然后寻找重复。它会吐出一个数字,然后再试一次。然后,它将吐出第二个数字并重试,重复直到初始捕获为空。我甚至不确定这会给你你想要的。所以实际上我认为正则表达式的解决方案是N^2最坏的情况。另外,对于1的输入,我相信这将返回1的重复,而不仅仅是1。你必须确保你的输入正好有2个周期的范围,才能得到最小的答案。对于1 1的输入,我不相信它会找到任何循环,因为它需要检测两个数字来匹配第一个匹配的组。原始算法给出的结果是空的。由于我们不知道测试用例,我假设测试用例对于算法来说不够长。我将尝试寻找除RegEx之外的另一种方法。如果您的输入不是这些算法的输入形式,那么这些算法就不是您要寻找的。这就是为什么你链接到的页面会特别调用数据源的原因。你不能忽视它。@HarshGupta事实证明,这个问题的问题实际上比你提供的链接上提出的问题更难。然而,正则表达式是解决这一特定问题的好方法。
$data = "1 2 3 4 5 3 4 5"; 
if ($data =~ /(?<c>\d).*?(\k<c>)/) {
    print substr($data, $-[1], $-[2]-$-[1])."\n";
} elsif {
    print "NO\n";
}