理解为什么弗洛伊德的龟兔赛跑算法在应用于整数数组时有效

2024-02-13

我试图解决这个leetcode问题https://leetcode.com/problems/find-the-duplicate-number/ https://leetcode.com/problems/find-the-duplicate-number/使用我自己的龟兔算法实现,当给定以下整数数组时,会导致无限循环:

[3,1,3,4,2]

只有在跟踪我的算法之后,我才能够看到慢跑者和快跑者永远不会同时接受两个重复值。这是我的伪代码算法:

initialize fast and slow runners to 0

while(true)

   move fast runner two indices forward
   move slow runner one index forward

   if arr[fast] == arr[slow] and fast != slow
      return arr[fast] // this is the duplicate

现在,我确信精通离散数学的人能够直观地知道这种方法不会得出正确的解决方案,而无需首先像我一样追溯示例。

我可以做出哪些推论或观察来让我发现这个算法行不通?我想知道如何通过一系列逻辑陈述直观地识别出这个逻辑中的缺陷。换句话说,如何解释为什么两个跑步者在这个例子中永远找不到重复项?我觉得这可能与计数有关,但我在离散方面没有很强的背景。

为了澄清,我已经查看了正确的实现,所以我确实知道解决它的正确方法是什么。我只是认为这种方式的工作方式与将其应用于链接列表太相似,在链接列表中,您将快速运行者向上移动两个节点,将慢速运行者向上移动一个节点。感谢您的帮助。


当您检测链表中的循环时,弗洛伊德的乌龟算法就会起作用。它依赖于这样一个事实:如果两个指针以不同的速度移动,它们之间的差距将继续增加到一个极限,之后如果存在循环,它将被重置。
在这种情况下,算法确实找到了一个循环,因为经过一些迭代后两个指针都收敛到索引 0。然而,您并不是要在这里检测循环;而是要检测循环。您正在尝试查找重复项。这就是为什么它会陷入无限递归:它的目的是检测循环(它正确地做到了),但在其基本实现中不检测重复项。

为了澄清这一点,这里有一个在示例数组上创建的示例链接列表。

3 -> 1 -> 3 -> 4 -> 2
'--<----<----<----<-'

如果运行 Floyd 算法,您会发现循环将在索引 0 处被检测到,因为两个指针都会在那里收敛。它的工作原理是检查是否fast and slow指向同一地点如果它们具有相同的节点值(fast==slow不等于fast.value==slow.value).

您尝试通过比较节点上的值来检查重复项,并检查节点是否不指向同一位置。这实际上是缺陷,因为弗洛伊德的算法会检查两个指针​​是否指向同一位置以检测循环。
你可以阅读这个简单、信息丰富的证明 https://stackoverflow.com/a/6110767提高您对指针为何会收敛的直觉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解为什么弗洛伊德的龟兔赛跑算法在应用于整数数组时有效 的相关文章

  • 以小于 O(n^2) 的复杂度计算两个数组中的互质对数量

    我在挑战中遇到了这个问题 有两个数组 A 和 B 的大小均为 N 我们需要返回对的计数 A i B j 其中gcd A i B j 1 and A i B j 我只能想到暴力方法 它超出了少数测试用例的时间限制 for int i 0 i
  • DPLL算法定义

    我在理解 DPLL 算法时遇到一些问题 我想知道是否有人可以向我解释它 因为我认为我的理解是不正确的 我理解的方式是 我采用一些文字集 如果每个子句都为真 则模型为真 但如果某些子句为假 则模型为假 我通过查找单元子句递归地检查模型 如果有
  • Dijkstra 算法不生成最短路径?

    我正在使用 Dijkstra 算法解决最短路径问题 我遇到了麻烦 因为该算法应该提供最短路径 但运行该算法后 我手动得到了一条短路路径 这只是该算法的副产品吗 我尝试生成的路径是从 a gt z 这是我通过应用该算法得到的路径 在我访问的每
  • Python:for 循环 - for i in range(0,len(list) 与 for i in list

    这是一个非常简单的Python 力学问题 为什么我不能只说 for i in range original list 而不是 for i in range 0 len original list 人们通常使用范围而不是前者吗 谢谢 If I
  • 数组中的重复元素[重复]

    这个问题在这里已经有答案了 这有点与this https stackoverflow com questions 2605766 how to find a duplicate element in an array of shuffled
  • 找到质数?

    为了判断 N 是否是质数 我们只需要查找所有小于或等于 sqrt N 的数字 这是为什么 我正在编写 C 代码 因此试图理解其背后的原因 如果 N 是一个正整数 且能被两个正整数 1 和 N 整除 则 N 是素数 由于数字的约数不能大于该数
  • 找到不(必要)与二进制矩阵中的图像边界对齐的最大矩形

    我在用这个解决方案 https stackoverflow com questions 2478447 find largest rectangle containing only zeros in an nn binary matrix在
  • 如何返回 Solidity 中的结构数组?

    我正在为以太坊智能合约设计一个解决方案bidding 用例包括保留名称 例如 myName 并分配给一个地址 然后 人们可以竞标该名称 在本例中为 myName 可以有多个名称发生多次此类出价 struct Bid address bidO
  • 将整数列表划分为总和相等的 K 个子列表

    类似的问题还有1 https stackoverflow com questions 27322804 partition of a set into k disjoint subsets with equal sum and 2 http
  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • StackOverflowError 计算 BigInteger 的阶乘?

    我正在尝试编写一个Java程序来计算大数的阶乘 它似乎BigInteger无法容纳这么大的数量 下面是我编写的 简单的 代码 public static BigInteger getFactorial BigInteger num if n
  • 如何在单向链表(一次遍历中)中从尾部获取第 n 个节点?

    所以我在一次考试中得到了这个问题 如何从单链表的尾部获取第 n 个节点 每个节点都有一个值和一个下一个 指向下一个值的指针 我们得到这个 getNodeFromTail Node head int x 所以我的做法是通过遍历一次来求出列表的
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • Python 旅行商贪婪算法 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 因此 我为旅行推销员问题创建了一种排序 并按 x 坐标和 y 坐标进行排序 我正在尝试实施贪婪搜索 但无法做到 此外 每
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4

随机推荐

  • php中的foreach循环问题

    这是我的一些代码 p 只是回显并添加换行符 foreach vanSteps as k gt reqInfo p k if van k p The key is the van continue continue continue if w
  • 在 python 张量流中打印生成器

    我正在尝试遵循tensor flow教程如此描述link https github com random forests tutorials blob master ep7 ipynb 我正在尝试按描述打印预测结果 print Predic
  • 样式输入类型=文件未按预期工作

    我正在为表单类型创建一个 css 模板 并希望为表单输入提供圆形边框 这适用于 type text 但不适用于 type file 用于文件上传 我究竟做错了什么 tempform input type text moz border ra
  • Sharepoint 维基

    好吧 我看过几个帖子mention其他一些关于不使用 SP wiki 的帖子 因为它们很糟糕 因为我们正在考虑创建我们的维基inSP 我需要知道为什么我们不应该让 6 名自动化开发人员组成的小组来记录各种自动化流程中的步骤以及必须不时进行的
  • 如何在图表中添加大括号?

    我想在R中制作如下图 如何绘制水平支撑 像这样的事情怎么样 plot c 0 1 c 0 1 text x 0 5 y 0 5 srt 90 cex 8 family Helvetica Neue UltraLight 根据您的目的进行调整
  • Socket.io + PhoneGap

    当我尝试使用时套接字IO https socket io with PhoneGap https phonegap com 我收到此错误 在 iOS 上应该支持 socket io Access Control Allow Origin 不
  • NSArray 填充 bool

    我正在尝试创建一个布尔值的 NSArray 请问我有多少人这样做 NSArray array NSArray alloc init array 0 YES 这对我不起作用 Thanks NSArray 不是 c 数组 您无法使用以下方式访问
  • ModelEntity.从 url 加载

    我有一个带有 AR 的屏幕 目前 usdz 3D 模型存储在应用程序本地 我们需要确保使用 get 请求接收它们 这是要检查的网址 https developer apple com augmented reality quick look
  • SQL 选择用字符串替换整数

    目标是将 SQL 查询中返回的整数值替换为该数字表示的 char 值 例如 标记为 Sport 的表属性被定义为 1 4 之间的整数值 1 篮球 2 曲棍球等 下面是数据库表 然后是所需的输出 数据库表 Player Team Sport
  • -webkit-transform 的替代方案:transformY?

    我正在创建一个 chrome 扩展 它在特定页面的顶部显示 iframe 该 iframe 被固定并放置在打开 body 标签之前 为了给这个 iframe 预留一个位置 我使用 CSS 向下移动主体 包括固定元素 webkit trans
  • AngularJS 中 !$pristine 与 $dirty 之间有什么区别

    最近我读了一些关于 angularJS 表单验证的教程 如下所示 p p 但我觉得 pristine and dirty是相等的 那么我可以使用下面的吗 p p 我认为这两个属性之间存在细微差别 这取决于您的用例 setDirty 将表单设
  • 如何获取node.js中的所有memcached数据?

    首先 我的目的是当用户关闭浏览器时用户会话数据应该过期 现在的问题是 我的服务器需要 memcached 才能正常工作 因此 我想从已关闭浏览器的 memcached 中删除该特定用户会话 我不想清除所有内存缓存 以便剩余用户的会话仍然存在
  • nvcc 和 NVIDIA-smi 显示的不同 CUDA 版本

    我对运行时显示的不同 CUDA 版本感到非常困惑which nvcc and nvidia smi 我在 ubuntu 16 04 上安装了 cuda9 2 和 cuda10 现在我将PATH设置为指向cuda9 2 所以当我跑步时 whi
  • 如何在 ASP.NET 应用程序中实现多语言服务器错误?

    我的 ASP NET Web 应用程序在 web config 中有以下部分
  • 从 Laravel 外部推送到 Laravel 队列 (NodeJS)

    我有一个 Laravel 5 3 安装作为纯 API 应用程序运行 需要从多个不同的应用程序进行连接 一切都工作正常 毕竟我们谈论的是 Laravel P 除了我不明白一件事 我有一个 MQTT 服务器 它正在侦听来自多个设备的消息 无论是
  • Node.js 的 Liquid 模板 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有没有港口液体模板 https github com tobi liquid对于 Node j
  • Logstash:Mutate { gsub ... } 不起作用

    mutate add field gt eee gt 2016 uaie gsub gt eee 2016 2015 这确实会创建一个字段 eee 但 gsub 会not更新它 为什么 add field 在底层过滤器成功时运行 在您的情况
  • 计算 DFFITS 作为回归中杠杆率和影响力的诊断

    我正在尝试手动计算 DFFITS 获得的值应该等于通过以下方式获得的第一个值dffits功能 不过我自己的计算肯定有问题 attach cars x1 lt lm speed dist data cars all observations
  • Firefox 是否有相当于 Chrome 的“translateZ(0);”强制GPU加速CSS动画?

    我有一个 CSS3 过渡 在 Chrome 中如丝绸般平滑 但在 Firefox 最新版本 中却不稳定 我知道我可以通过设置在 Chrome 中强制 GPU 加速 DOM 对象 webkit transform 翻译Z 0 on it 我可
  • 理解为什么弗洛伊德的龟兔赛跑算法在应用于整数数组时有效

    我试图解决这个leetcode问题https leetcode com problems find the duplicate number https leetcode com problems find the duplicate nu