【问题标题】:Is it possible to use the Tortoise and Hare algorithm to find a duplicate word in a string of array?是否可以使用 Tortoise and Hare 算法在一串数组中查找重复的单词?
【发布时间】:2021-07-25 21:53:10
【问题描述】:

我是 Floyd 的 龟兔算法的新手。给定一个单词数组,例如['cat', 'dog', 'cat', 'elephant']。是否可以利用龟兔算法的思想来查找重复词?

当我在网上搜索时,似乎只能使用一组数字。如果我的问题不够清楚,请发表评论,我可以尝试提供更多信息。

非常感谢,

【问题讨论】:

  • 你试过了吗?仅针对数字数组似乎不合逻辑。
  • @KevinHwang 我什至不明白你如何将它用于数字。该算法非常专门针对链表问题。
  • 我不明白 T&H 如何应用于查找重复项。它检测链接结构中的循环。如果有一个循环,野兔指针最终会“圈”乌龟指针,因此它们指向同一个元素。注意:维基百科页面相当混乱地用一个看起来像数组的图表来说明算法。仔细阅读说明。不是这样的。
  • @KevinHwang 请仔细阅读那篇文章。结论是使用 T&H 查找重复项(无论类型如何)是行不通的。
  • @Gene。实际上,它可以在数字数组中找到重复项。如果您看过 Joma Tech 在 YT 上的视频。虽然似乎是一个特定的数字数组

标签: algorithm search


【解决方案1】:

不,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 算法无法帮助识别重复值。但是有一些特定的结构,您可以使用数字或字符串信息来链接节点,但这些不是 ,而是 链接。这样的数组在表面上可以没有重复,但仍然代表一个有循环的链表。所以同样在这种情况下,龟兔赛跑算法也不会帮助找到重复的。它用于查找链接节点的循环。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2012-12-05
    • 2017-10-10
    • 1970-01-01
    • 2021-12-11
    • 2012-11-27
    相关资源
    最近更新 更多