弗洛伊德龟兔赛跑算法(弗洛伊德判圈算法)
创始人
2025-05-31 19:47:45
0

弗洛伊德( 罗伯特・弗洛伊德)判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法。

昨晚刷到一个视频,来自油管的Joma Tech,视频本身挺有意思的,当然这哥们也很有意思,经常在油管发视频然后在FB就被辞职了,现就职于谷歌。

里面介绍了如何实现下面这个的算法,主要是视频内容很有意思,当然这里还是介绍里面出现的几个算法。

题目:找出数组中的重复数字,数组里只有一个重复的数字,可以重复多次。其中算法的要求是时间复杂度小于O(n²),空间复杂度是O(1)

题目是很简单,求解的办法也很多,有直接循环查找,为了提高效率还可以使用二分查找,视频中的前两个方法如下:

排序之后,相邻元素如果是相等即为重复数字。但运行的时间复杂度高,比较耗时。不能通过!

def findDuplicate1(nums):nums.sort()for i in range(1,len(nums)):if nums[i]==nums[i-1]:return nums[i]arr1=[1,3,4,2,2]
arr2=[8,1,3,4,2,4,5,4]print(findDuplicate1(arr1))#2
print(findDuplicate1(arr2))#4

使用字典或set来保存遍历数组里的值,然后判断是否已添加,如果有添加就说明是重复数值了。

这个虽然相较于上面的方法,时间缩短了,但是空间复杂度上来了,比较耗内存。不能通过!

def findDuplicate2(nums):seen={}for num in nums:if num in seen:return numseen[num]=Trueprint(findDuplicate2(arr1))#2
print(findDuplicate2(arr2))#4#或者set()也可以
def findDuplicate2_(nums):seen=set()for num in nums:if num in seen:return numseen.add(num)
print(findDuplicate2_(arr1))#2
print(findDuplicate2_(arr2))#4

接下来看下符合要求的算法,也就是下面介绍的龟兔算法。

当然这个题目还有一个限定条件,给定一个包含n + 1个整数的数组nums,其中每个整数都在1到n之间(包括),不然我给出的示例就会出现索引越界了,这样就可以使用这个龟兔赛跑的算法,也有人管叫快慢指针,有重复就形成闭环:

def findDuplicate_ok(nums):tortoise=nums[0]hare=nums[0]while True:tortoise=nums[tortoise]#龟hare=nums[nums[hare]]#兔if tortoise==hare:breakptr1=nums[0]ptr2=tortoisewhile ptr1!=ptr2:ptr1=nums[ptr1]ptr2=nums[ptr2]return ptr1arr1=[1,3,4,2,2]
arr3=[1,4,6,8,2,3,8,5,7]
print(findDuplicate_ok(arr1))#2
print(findDuplicate_ok(arr3))#8

时间复杂度:O(n),空间复杂度:O(1)

当然如果是初学者,会感觉到有点复杂,没关系,我们可以在龟(或兔或两者)的位置设置断点,然后步进,一步一步的看整个算法的执行流程就明白了,这个也是大家在需要进行调试或者了解一些变量的变化的最常见有效的方法。

不便调试的,我也将整个执行过程贴出来,方便观察:

数组:nums=[1,4,6,8,2,3,8,5,7]

第1次

第2次

第3次

第4次

第5次

nums[0]=1

nums[1]=4

nums[4]=2

nums[2]=6

nums[6]=8

nums[0]=1

nums[nums[1]]=2

nums[nums[2]]=8

nums[7]=5

nums[3]=8

当迭代到第5次的时候,两者相等了,于是就跳出循环,然后就通过指针找出重复的值

ptr1=1

nums[1]=4

nums[4]=2

nums[2]=6

nums[6]=8

ptr2=8

nums[8]=7

nums[7]=5

nums[5]=3

nums[3]=8

相关内容

热门资讯

原创 控... 对于现代人而言,“白米饭”已经成为了餐桌上的常客,软糯香醇,搭配下饭的小菜,简直美味的不能再美味了。...
原创 蒸... #蒸米饭时,大米下锅前还需多加这一步,否则米饭不香! 在平凡的生活中,一碗好米饭承载着家的味道与温...
摸着肚子像冰块?5道“火炉菜”... 夏天抱着冰西瓜吹空调,结果肚子凉得像冷藏室?喝口冰奶茶,胃里直接开启"震动模式"?别急着翻秋裤,这5...
原创 腌... **《腌带鱼时,别只会加料酒!多加一点“它”,鲜香肉嫩无腥味》** 在美食的世界里,带鱼以其独特的...
原创 经... #经典名菜京酱肉丝,超高颜值,酱香浓郁,口感丝滑 在中华美食的璀璨星河中,京酱肉丝宛如一颗闪耀的明...
新疆伊犁四大草原:每一片都藏着... 新疆伊犁被誉为"塞外江南",这里的草原风光堪称中国最美。伊犁河谷孕育了四大著名草原,每一片都有独特的...
去内江旅游 到自贡吃饭 萝卜白菜,各有所爱。2025年5月11日下午,孩子们自驾车带我与老伴去内江市旅游,到该吃晚饭的时候 ...
四川九寨沟峨眉山旅游跟团5天4... 探秘四川:九寨沟与峨眉山的五日奇幻之旅 四川旅游推荐!当地导游-乐乐:185 8335 5758(加...
四川九寨沟峨眉山旅游参团游5天... 标题:《亲测四川九寨沟峨眉山五日游,花费与美景齐飞,乐乐导游带你玩转天府之国》 四川旅游推荐!当地导...
四川九寨沟都江堰旅游团建五日游... 标题:《四川九寨沟都江堰五日游记:乐乐导游带我领略蜀地风情》 四川旅游推荐!当地导游-乐乐:185 ...
广州市儿童公园“六一”变身欢乐... 粤港澳大湾区首次由智慧人形机器人参与的火炬传递 受访单位供图 羊城晚报记者 孙牧 实习生...
上海警方通报“迪士尼打架事件”... 上海警方通报。 据上海市公安局浦东分局官方微博消息,2025年5月31日18时许,浦东公安分局接报警...
新疆四日游参加旅行团价格,新疆... 新疆四日游参加旅行团价格,新疆旅游四天三夜旅游费用 新疆,这片广袤无垠的西北大地,是东西方文明交流的...
光明日报:民俗体验游火爆,看到... 与五一和国庆相比,这个端午节更像是一个“加长版周末”,很多人选择“周边游”“奔县游”来完成这三天的微...
原创 史... #史无前例!你家是如何处理过年剩菜剩饭的? 新春佳节,阖家团圆,丰盛的菜肴摆满餐桌,欢声笑语中,年...
原创 饺... 大家好呀,我是王大妈,一个天天和厨房打交道的普通主妇。今天要跟大家分享一个我家闺女最近超迷的吃法——...
原创 腐... #腐竹泡发后不“劲道”?酒店厨师教你一招,保证腐竹又软又入味 在美食的世界里,腐竹是一种常见且备受...
原创 胡... #胡萝卜也有新吃法,不炒不煮不红烧,简单搅拌一下,孩子可爱吃了 在寻常的餐桌上,胡萝卜总是以熟悉的...
坚持早上喝一周山药小米糊,胃里... #图文打卡计划#你们有没有过这种感觉?早上起床,胃里像揣了个没精打采的小气球,说不上疼,就是隐隐约约...