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

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(使用前将#替换为@)

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

  • Exposé 布局算法

    我正在制作一些项目 其布局类似于 Mac OS X 在 Expos 中对窗口所做的操作 它适应项目的长宽比和可用区域的长宽比 基本上 可用区域分为行和列 每个单元格 行和列的交集 中放置一个项目 这些项目必须保持其纵横比 此处width h
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 寻找距离原点最近的 100 颗恒星的算法

    首先让我提出正确的问题 问 有一个文件包含超过一百万个点 x y 每个点代表一颗星星 a b 处有一颗行星地球 现在 任务是构建一种算法 返回距离地球最近的 100 颗恒星 您的算法的时间和空间复杂度是多少 这个问题在各种采访中被问过很多次
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 需要一种将网络块范围折叠为超集范围列表的算法

    我的数学不及格 我需要一种有效的方法将网络范围缩小为超集 例如如果我输入 IP 范围列表 1 1 1 1至2 2 2 5 1 1 1 2至2 2 2 4 10 5 5 5至155 5 5 5 10 5 5 6至10 5 5 7 我想返回以下
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • 解开 Knuth 的结:如何重构意大利面条式代码?

    这个问题的灵感来自如何将流程图转化为实施 https stackoverflow com questions 36647765它询问如何通过算法消除goto代码中的语句 这answer https stackoverflow com a 3

随机推荐

  • 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