不,Tortoise and Hare 算法的作用是在链表中找到一个循环,这意味着如果你跟随链接,你最终会到达一个 节点已经被访问过。请注意,这与列表中存储的 values 没有任何关系。在列表中查找重复的值并不是一种算法。具有重复值的列表很可能没有循环。
根据定义,数组没有循环。如果我们想用链接来描述一个数组,那么元素?链接到元素?+1,并且数组中的最后一个元素不链接到任何其他元素:没有循环。
数字数组
似乎只有数字数组才有可能。
这一定是关于数组的特定用途,它用于编码一个链表,该链表具有没有值的节点,但只有下一个指针。在这种情况下,数组 中的值是 链接,即某个索引处的值是列表中 下一个“节点”的索引。那么实际上,这只是链表的一种不同表示,可能有一个循环。
这说明它只适用于数字,因为索引是数字。此外,这些数字必须是 0..?-1 范围内的整数。这是一个例子:
[2, 3, 1, 0]
这里,索引 0 处的“节点”链接到索引 2 处的节点,该节点又链接到索引 1 处的节点,该节点链接到索引 3 处的节点,从而关闭循环,并链接到索引处的节点索引 0。
请注意,数组恰好没有重复的“值”,而是有一个循环。
但是,如果数组有一个没有链接回索引 0 的循环,那么它将有一个重复的“值”。例如:
[1, 2, 3, 2]
这里索引 0 处的第一个节点不是循环的一部分,.. 从索引 0 开始的路径进入索引 2 处的循环,该循环链接到索引 3,然后链接回索引 2,......等等。
因此,如果任务是查找所有值都可以解释为索引的重复值,则可以使用 Tortoise and Hare 算法。但请注意:
- 这仅适用于 特定 数组,即所有值都可以解释为索引(或位置,或您可以在值和索引之间定义的任何 1 对 1 映射)。
- 可以检测到链接回数组的第一个元素的循环,在这种情况下,数组实际上根本不需要重复。这个循环是否会被 Tortoise and Hare 算法检测到,取决于该算法的实际风格。它可以设计为不检测链接回索引 0 的完整循环,这是您希望不被检测到的。
字符串数组
字符串不代表索引,所以上述不适用于字符串。
唯一想到的就是有这样的东西:
[{ "value": "cat", "next": 1},
{ "value": "dog", "next": 2},
{ "value": "cat", "next": 3},
{ "value": "elephant", "next": 0}]
...再次使用数组的index建立链接。
或者一个对象(字典),像这样:
{
"cat": "dog",
"dog": "cat",
"cat": "elephant",
"elephant": "cat"
}
...本质上表示相同的图,但在列表的对象表示中使用字符串作为键。
结论
如果问题是关于具有 只是 字符串值的数组,那么 Tortoise 和 Hare 算法无法帮助识别重复值。但是有一些特定的结构,您可以使用数字或字符串信息来链接节点,但这些不是 值,而是 链接。这样的数组在表面上可以没有重复,但仍然代表一个有循环的链表。所以同样在这种情况下,龟兔赛跑算法也不会帮助找到重复的值。它用于查找链接节点的循环。