前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法:龟兔赛跑

算法:龟兔赛跑

作者头像
WEBJ2EE
发布2019-07-19 14:42:33
1.1K0
发布2019-07-19 14:42:33
举报
文章被收录于专栏:WebJ2EEWebJ2EEWebJ2EE

1. 龟兔赛跑?

龟兔赛跑算法(Floyd's cycle detection 或 Tortoise and the hare algorithm)可用于判定链表、迭代函数、有限状态机是否有环。如果有环,可以找出环的起点和大小。

2. 基本原理?

龟兔赛跑的基本思想可以用我们跑步的例子来解释,如果两个人同时出发,如果赛道有环,那么快的一方总能追上慢的一方。

定义:有限集 S,Xi∈S,f(Xi)∈S,Xi=f(Xi-1);

假设:μ 是环路的起点λ是环路长度

如果存在环路,则存在 i ≥ μ,k ≥ 0,使:

Xi = X(i + kλ);

该算法主要回答3个问题

1. 是否有环路?

2. 环路的起点?

3. 环路的长度?

假设有一只兔子(Hare)和一只乌龟(Tortoise),它们从链表的开始以不同的速度沿着链表遍历。乌龟每一步移动1个单元格兔子每一步移动2个单元格

2.1. 是否有环路?

如果兔子没路走了,意味着有终点,即没有循环。

2.1. 环路的起点?

如果包含一个环,兔子会先进入环,随后和后来的乌龟相遇

【性质1】:存在 i=kλ≥μ 使 Xi = X2i;所以当龟、兔第一次相遇时,乌龟走过的步长即是 kλ。

【性质2】:当已求得某个 v=kλ 时,根据 Xi = X(i+v) (i≥μ),只要在让乌龟回到起点,乌龟和兔子每次走一个单元格,再一次相遇时,i 就是 μ,即它们相遇的位置就是环路起点

2.3. 环路的长度?

【性质3】:兔子、乌龟第二次在起点相遇后,它们都停在环路的起点上。此时兔子不动,乌龟继续走,每一步走1个单元格,当第三次相遇时,乌龟走过的路程即环路长度

3. 动画展示?

图:龟兔赛跑动画演示

图文无关

4. 代码示例?

5. 算法特性?

  • 时间复杂度:O(λ+μ)

参考:

《算法基础》 维基百科: https://en.wikipedia.org/wiki/Cycle_detection#Floyd's_Tortoise_and_Hare 动画展示: https://visualgo.net/en/cyclefinding?slide=1

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebJ2EE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档