当前位置: 首页 > news >正文

Floyd判圈和Brent判圈

问题背景

想象一个链表,它可能在某个节点处指向一个之前的节点,从而形成一个环。

我们的目标是:

  • 判断链表中是否存在环。

  • 找到环的入口点。

  • 计算环的长度。

比如说这个:

1 -> 2 -> 3 -> 4 -> 5 -> 6^         ||         v9 <- 8 <- 7

节点 \(4\) 即为环的入口点,环的长度为 \(6\)

Floyd 判圈算法 (龟兔赛跑算法)

使用两个指针,一个慢指针(乌龟)和一个快指针(兔子)。

慢指针:每次移动一步。

快指针:每次移动两步。

判断是否有环的原理:如果链表中存在环,那么快指针最终会追上慢指针(在环内相遇)。如果不存在环,快指针会先到达链表尾部。

算法步骤如下:

  • 初始化:

    • 指针 \(slow\)\(fast\) 都指向链表头节点。
  • 移动阶段:

    • 在每一步中,\(slow\) 向后移动一个节点。
    • \(fast\) 向后移动两个节点。
    • 检查 \(fast\)\(fast.next\) 是否为 \(null\)。如果是,则链表无环,算法结束。
    • 检查 \(slow\) == \(fast\)。如果相等,则链表有环。
  • 寻找环入口:

    • \(slow\)\(fast\) 第一次相遇时,将其中一个指针重新指向链表头。
    • 然后,两个指针都以每次一步的速度移动。
    • 当它们再次相遇时,相遇的节点就是环的入口点。

那问题来了,为什么重新指向头节点后,再次相遇的点就是环入口?

我们设链表头到环入口的距离为 \(A\),环入口到第一次相遇点的距离为 \(B\),第一次相遇点回到环入口的距离为 \(C\)

那么环的长度 \(L = B + C\)

在第一次相遇时:

慢指针走过的路程:\(A + B\)

快指针走过的路程:\(A + B + k * L\)(其中 \(k\) 是快指针在环内转的圈数)。

由于快指针速度是慢指针的两倍,所以路程也是两倍,所以 \(2(A + B) = A + B + k * L\)\(A = k * L - B\)

\(L = B + C\) 代入:\(A = k * (B + C) - B\)\(A = (k-1) * L + C\)

从链表头(\(A\))到环入口的距离,等于从第一次相遇点(\(C\))绕 \((k-1)\) 圈再回到环入口的距离。

所以,一个指针从链表头走 \(A\) 步,另一个指针从相遇点走 \(C + (k-1)*L\) 步,它们最终会在环入口点相遇。

Brent 判圈算法

通常比 Floyd 有更低的时间常数,但好像没啥人学啊。

使用一个慢指针和一个快指针,但快指针不是连续移动,而是“跳跃式”移动。

慢指针:保持不动,直到快指针需要“跳跃”到它的位置。

快指针:每次移动一步,但每走一段距离(\(step_limit\)),如果还没遇到慢指针,就将 \(step_limit\) 翻倍,并把慢指针移动到快指针的当前位置。

算法步骤如下:

  • 初始化:
    • \(slow\) = \(head\), \(fast\) = \(head\)
    • \(step_limit = 2\) (初始的移动限制)
    • \(steps_taken = 0\) (记录当前周期内已走的步数)
  • 移动阶段:
    • \(fast = fast.next\) (快指针走一步)
    • \(steps_taken += 1\)
    • 检查 \(fast == slow\)。如果相等,则发现环。
    • 检查 \(steps_taken == step_limit\)
    • 如果相等,说明当前周期走完了。将 \(slow\) 移动到 \(fast\) 的位置(让乌龟跳到兔子当前位置)。将 \(step_limit *= 2\),并将 \(steps_taken\) 重置为 \(0\)

寻找环入口和长度:

一旦检测到环(\(fast\) == \(slow\)),环的长度就是此时 \(steps_taken\) 的值(因为 \(slow\) 没动过,\(fast\) 走了 \(steps_taken\) 步追上它)。

要找到环入口,可以将两个指针都重置为头节点,然后让一个指针先走环长度步,然后两个指针同时一步一步走,相遇点就是入口啦。

http://www.rkmt.cn/news/51700.html

相关文章:

  • 2025年石棉橡胶板厂家联系方式汇总:专业服务与产品解析
  • 智表ZCELL产品V3.4 版发布,新增区域筛选、字母列参等功能。
  • 元推理品析:自指有机,自洽有缘
  • qqw
  • 详细介绍:Vue3 表单输入绑定
  • Splunk Enterprise 10.0.2 发布 - 搜索、分析和可视化,数据全面洞察平台
  • C# 常用控件(学习笔记6)
  • Ai元人文:“退一万步”的设想
  • TikTok(抖音)国际现代风水指南1什么是风水?
  • Windows-icacls
  • 安卓助手
  • 【Linux】curl基础语法与常用参数详解
  • 20232414 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 力扣 第 476 场周赛(A~D)
  • 2025 年 11 月冷却塔厂家推荐排行榜,闭式冷却塔,方形冷却塔,工业冷却塔,全钢冷却塔,凉水塔,圆形冷却塔,玻璃钢冷却塔,防腐冷却塔,冷却水塔公司推荐
  • 3.分治算法的设计思想与分析方法
  • 2025 年 11 月螺杆泵厂家推荐排行榜,单干污泥料斗,浆料进料喂料,高压耐磨石油工业,化工环保食品级,船舶造纸加药计量,耐腐蚀高粘度污水污泥,不锈钢铸铁304316螺杆泵公司推荐
  • 2025 年 11 月冷拉/冷拔方钢厂家推荐排行榜,冷拉方钢,冷拔方钢,精密冷拉方钢,高强度冷拔方钢公司推荐
  • 每日一导5
  • 2025 年 11 月冷拉/冷拔异型钢厂家推荐排行榜,精密冷拉异型钢,冷拔异型钢材,定制冷拉型钢,高强度冷拔钢公司推荐
  • 2025 年 11 月 Q355B/Q345B/16Mn 扁钢厂家推荐排行榜,低合金高强度扁钢,结构用扁钢,优质扁钢批发公司推荐
  • 2025 年 11 月 TPU 厂家权威推荐排行榜,TPU加纤,TPU改性生产,专业定制与创新技术实力深度解析
  • 2025 年 11 月红木家具厂家权威推荐榜:交趾黄檀/小叶紫檀/巴里黄檀/缅甸花梨/阔叶黄檀,明清古典榫卯工艺高端定制全屋整装,白胚烘干实力解析
  • OI 笑传 #29
  • 2025 年 11 月 Q355B/Q345B/16Mn 圆钢厂家推荐排行榜,低合金高强度圆钢,结构用圆钢,合金钢圆钢公司精选
  • 2025 年 11 月磨粉机厂家推荐排行榜,雷蒙磨粉机,环辊磨粉机,摆式磨粉机,矿石磨粉机,超细磨粉机,高压磨粉机,大型磨粉机公司推荐
  • 2025 年 11 月冠晶石厂家推荐排行榜,外墙冠晶石,内墙冠晶石,防霉冠晶石,水包水冠晶石,水包砂冠晶石,耐污冠晶石,自洁冠晶石公司推荐
  • 2025 年 11 月保洁公司推荐排行榜,驻场保洁,钟点保洁,开荒保洁,外包保洁,商场/办公楼/工厂/医院/企业保洁服务公司精选
  • 2025 年 11 月防腐工程厂家推荐排行榜,喷砂,热喷锌,热喷铝,油漆涂装,热喷耐磨材料,防腐工程公司精选
  • 算法-回溯算法思想