我知道Tortoise和Hare的会议总结了循环的存在,但是如何将兔子移动到链接列表的开头同时将野兔保持在会场,然后一步一步地移动两个步骤使它们在循环的起始点相遇?
我有一个指针数组(这是算法,所以不要讨论语言细节)。大多数时候,该数组指向数组外部的位置,但它会退化为数组中的每个指针都指向数组中的另一个指针。最终,这些指针形成无限循环。
因此,假设整个数组由指向数组中另一个位置的指针组成,并且从头开始,如何找到在时间和空间上效率最高的循环长度?我相信最好的时间效率是 O(n),因为你必须循环数组,最好的空间效率是 O(1),尽管我不知道如何实现。
Index: 0 1 2 3 4 5 6
Value: *3 *2 *5 *4 *1 *1 *D
Run Code Online (Sandbox Code Playgroud)
D 是循环开始之前指向的数据。在此示例中,循环为 1、2、5,并且无限重复,但索引 0、3 和 4 不是循环的一部分。