floyd-cycle-finding相关内容

链表循环检测算法

我在网上阅读了一些关于如何找到链表中是否存在循环的面试问题以及解决方案(Floyd's cycle-finding algorithm) 是有两个指针,一个比另一个快 2 倍,并检查它们是否再次相遇. 我的问题是:为什么我不能只保持一个指针固定,而是每次将另一个指针向前移动 1 步? 解决方案 因为第一个(非移动)指针可能不在循环内,所以指针永远不会相遇.(请记住,循环可能只包含列表 ..
发布时间:2022-01-01 18:38:52 其他开发

使用 Hare and Tortoise 方法在链表中检测循环

我知道为了检测链表中的循环,我可以使用 Hare and Tortoise 方法,该方法包含 2 个指针(慢速指针和快速指针).然而,在阅读维基和其他资源后,我不明白为什么保证两个指针会在 O(n) 时间复杂度内相遇. 解决方案 这是一个非正式证明的尝试. 循环的形状无关紧要.它可以有一个长尾巴,一个循环到最后,或者只是一个没有尾巴的从头到尾的循环.不管周期的形状如何,有一件事是明确 ..

在循环链表中查找循环起始节点是如何工作的?

我知道乌龟和兔子的会议结束了循环的存在,但是如何将乌龟移动到链表的开头同时将兔子保持在会面的位置,然后一次移动一步使它们相遇循环的起点? 解决方案 这是弗洛伊德循环算法检测.您是在询问算法的第二阶段——一旦您找到了一个属于循环的节点,如何找到循环的开始? 在 Floyd 算法的第一部分中,兔子每走一步就移动两步.如果乌龟和兔子相遇,则存在一个循环,并且相遇点是循环的一部分,但不一定是 ..
发布时间:2022-01-01 18:02:09 其他开发

为什么在链表中查找循环时将指针增加 2,为什么不是 3、4、5?

我看了问题 已经讨论了在链表中查找循环的算法.我已经阅读了 Floyd 的循环寻找算法 解决方案,在很多地方都提到了我们必须拿两个指针.一个指针(slow/tortoise)增加一个,另一个指针(faster/hare)增加2.当它们相等时,我们找到循环,如果faster指针达到空,链表中就没有循环. 现在我的问题是为什么我们将更快的指针增加 2.为什么不是别的?增加 2 是必要的,或者我们 ..

解释在循环链表中查找循环起始节点是如何工作的?

我知道乌龟和兔子的会面结束了循环的存在,但是如何将乌龟移动到链表的开头,同时将兔子保持在会面处,然后一次移动一步,使它们在起点相遇循环? 解决方案 这是弗洛伊德循环算法检测.您是在询问算法的第二阶段——一旦您找到了一个属于循环的节点,如何找到循环的开始? 在 Floyd 算法的第一部分中,兔子每走一步就移动两步.如果乌龟和兔子相遇,则存在一个循环,并且相遇点是循环的一部分,但不一定是 ..
发布时间:2021-12-06 19:37:14 其他开发

使用Hare and Tortoise方法在链表中进行循环检测

我知道,为了检测链表中的循环,我可以使用Hare and Tortoise方法,该方法包含2个指针(慢速和快速指针).但是,在阅读了Wiki和其他资源后,我不明白为什么要保证两个指针在O(n)时间复杂度上会合. 解决方案 这里是一种非正式的证明. 周期的形状无关紧要.它可以有一条长长的尾巴,并有一个向尾的循环,或者只是从头到尾的一个循环而没有尾巴.与周期的形状无关,很明显-乌龟指针无 ..

我们怎样才能找到链接列表循环的起始节点?

按照弗洛伊德的圈发现算法中,乌龟和野兔满足点解释了循环性质的链接列表。 要发现在周期起始节点我们初始化龟指针到列表的头部,并开始由一个单位递增龟兔赛跑指针。在那里他们满足点表示周期的开始节点 请告诉我它是如何工作的特定情况。 链接列表流向为: 1→2→3→4- GT; 5→6> 7> 8> 3 解决方案 让我们来看看。 您快两倍定位兔子和乌龟1,并让他们跑, ..
发布时间:2015-11-30 20:48:00 C/C++

弗洛伊德的循环查找算法

我试图找到这个算法的C ++ .NET中却不能,我发现这一个: //最佳解决方案 功能布尔hasLoop(节点的StartNode){ 节点slowNode =节点fastNode1 =节点fastNode2 =的StartNode; 而(slowNode&安培;&安培; fastNode1 = fastNode2.next()&安培;&安培; fastNode2 = fastNode ..
发布时间:2015-11-30 16:22:39 C/C++开发

检测的未知源周期

如何检测重复的数字在一个无限序列?我试过弗洛伊德和放大器;布伦特检测算法,但落空... 我有一个发生器,它产生从0到9(含)的数字和我必须承认一个周期中它 例测试用例: 进口itertools #当然,这是一个假的只是为了提供一个例子 高清源(): 返回itertools.cycle((1,0,1,4,8 2,1,3,3,1)) >>>根=源() >> ..
发布时间:2015-11-30 16:22:19 Python

循环检测与龟兔赛跑的方法

据我所知,为了检测周期在列表中,我可以用龟兔赛跑的方法,其中包含两个指针(慢速和快速的)。然而,阅读维基和其他资源后,我不明白为什么它是保证这两个指针会为O满足(n)的时间复杂度... 解决方案 下面是在一个非正式的证据的一种尝试。 周期的形状并不重要。它可以有一个长尾巴,并且朝向端部的环,或者仅仅一个循环从开始到结束没有尾巴。不考虑周期的形状,有一点是清楚的 - 那乌龟指针不能赶上野兔指针 ..
发布时间:2015-11-30 14:55:54 C/C++

链表环路检测算法

我在网上看了一些面试问题,关于你将如何找到,如果有一个链表循环和解决方案(Floyd的循环查找算法)是有两个指针,一个是比其他快两倍,并检查他们再见面的。 我的问题是:为什么我不能只保留一个指针不动,只需将其他指针向前每次1步 解决方案 由于第一(非移动)指针可能不会说谎的内环路,所以指针永远不会满足。 (请记住,一个循环可以由该列表的一部分的。) ..
发布时间:2015-11-30 14:19:15 C/C++

为什么由两个增加的指针,同时寻找在循环链表,为什么不3,4,5?

我看了一下现在我的问题是,为什么我们增加更快的指针由2.为什么不是别的东西?由2提高是必要的,或者我们可以用X增加它来获得结果。是否有必要,我们会找到一个循环,如果我们增加更快的指针由2个或可能存在的情况下,我们需要增加3或5或x。 解决方案 没有理由,你需​​要使用两个数。步长任何选择就可以了(当然,除了一个,)。 要明白为什么这个工程,让我们来看看为什么Floyd的算法的工作摆在首位。我 ..

解释如何发现循环开始节点的循环链表的工作?

据我所知,乌龟和野兔的会议结束循环的存在,但如何移动龟链表开始,同时保持野兔在会场,其次是移动两个一步一步的时间让他们在出发点满足周期? 解决方案 这是弗洛伊德的算法进行周期检测 。您问的是算法的第二阶段 - 一旦你找到了一个节点,这是一个循环的一部分,一个人如何找到的启动的周期 在弗洛伊德的算法的第一部分,野兔移动两步乌龟的每一步。如果乌龟和野兔遇见,有一个周期,并在会议点是循环的一部分, ..
发布时间:2015-11-30 13:19:12 C/C++