日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Floyd判圈算法(Floyd's cycle detection

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Floyd判圈算法(Floyd's cycle detection 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Floyd判圈算法(Floyd Cycle Detection Algorithm),又稱龜兔賽跑算法(Tortoise and Hare Algorithm)。該算法由美國科學家羅伯特·弗洛伊德發明,是一個可以在有限狀態機、迭代函數或者鏈表上判斷是否存在環,求出該環的起點與長度的算法。
?? ? ??如果有限狀態機、迭代函數或者鏈表上存在環,那么在某個環上以不同速度前進的2個指針必定會在某個時刻相遇。同時顯然地,如果從同一個起點(即使這個起點不在某個環上)同時開始以不同速度前進的2個指針最終相遇,那么可以判定存在一個環,且可以求出2者相遇處所在的環的起點與長度。
算法描述
如果有限狀態機、迭代函數或者鏈表存在環,那么一定存在一個起點可以到達某個環的某處(這個起點也可以在某個環上)。
初始狀態下,假設已知某個起點節點為節點S。現設兩個指針t和h,將它們均指向S。
接著,同時讓t和h往前推進,但是二者的速度不同:t每前進1步,h前進2步。只要二者都可以前進而且沒有相遇,就如此保持二者的推進。當h無法前進(或者是t,有一個就可以),即到達某個沒有后繼的節點時,就可以確定從S出發不會遇到環。反之當t與h再次相遇時,就可以確定從S出發一定會進入某個環,設其為環C。
如果確定了存在某個環,就可以求此環的起點與長度。
計算環長度
上述算法剛判斷出存在環C時,顯然t和h位于同一節點,設其為節點M。顯然,僅需令h不動,而t不斷推進,最終又會返回節點M,統計這一次t推進的步數,顯然這就是環C的長度。
計算環起點

?

為了求出環C的起點,只要令h仍位于節點M,而令t返回起點節點S。隨后,同時讓t和h往前推進,且保持二者的速度相同:t每前進1步,h前進1步。持續該過程直至t與h再一次相遇,設此次相遇時位于同一節點P,則節點P即為從節點S出發所到達的環C的第一個節點,即環C的一個起點。
鏈表起點為節點S,環起點為節點P,t和h相遇時位于同一節點M,S和P之間的距離為p,P和M之間的距離為m,環長為C,這里兩點之間的距離是指從一點走多少步可以到點另外一點。
當t和h相遇時,
t走的步數,step = p + m + a * C,a表示相遇時t走的圈數?
h走的步數,2 * step = p + m + b * C,b表示相遇時h走的圈數
兩者相減:step = (b - a) * C = p + m + a * C,由此可知t走的步數是環C的倍數,即 p + m 剛好是環長度C的倍數。
t和h在M處相遇,為了計算環C的起點,令h仍位于節點M,而令t返回起點S,隨后,同時讓t和h往前推進,且保持兩者的速度相同:t每前進1步,h前進1步。持續該過程直至t與h再一次相遇,則它們此次相遇時一定位于環的起始節點P。為什么它們此次相遇時一定在環起始節點呢?
t走了p步到達P,h在環C上p步在哪呢?h從M處出發走了p步,相對于環起始位置,h走過的距離是 m + p,而m + p剛好是環長度C的倍數,即h此時也位于環起始節點處,即t和h在P處相遇。據此就可以計算出環起始節點的位置。
算法復雜度
時間復雜度
注意到當指針t到達環C的一個起點節點P時(此時指針h顯然在環C上),之后指針t最多僅可能走1圈。若設節點S到P距離為,環C的長度為,則時間復雜度為,是線性時間的算法。
空間復雜度
僅需要創立指針t、指針h,保存環長n、環的一個起點P。空間復雜度為,是常數空間的算法。
應用
對于有限狀態機與鏈表,可以判斷從某個起點開始是否會返回到訪問過運行過程中的某個狀態和節點。
對于迭代函數,可以判斷其是否存在周期,以及求出其最小正周期。
https://blog.csdn.net/javasus/article/details/50015687

```cpp #include <bits/stdc++.h> using namespace std; int n ; //有n個節點 int len ; //循環節的長度 int start ; //鏈路的初始節點 int pos ; //循環節的初始節點 int val ; //初始節點的值 int m ; //在鏈路相遇的節點 int slow,fast; //兩個速度指針 int f(int p){int next;//構造下一步方法return next; } bool floydcycle(int start, int len, int pos, int val){// 是否存在循環節 slow = f(start) ;fast =f( f(start) );int cnt=1;while(slow != fast && cnt < n){slow = f(slow);fast = f ( f(fast) );cnt++;}if(slow != fast) return false;// 循環節長度 len = 0;do{ slow = f(slow);len++;}while(slow != fast);//循環節起始位置slow = 0;int p=0;while(slow != fast){slow = f(slow);fast = f(fast);++p;} pos = p ;val = slow; } int main(){floydcycle( start, len, pos, val); }

leetcode 202 快樂數
最終迭代下去,得到的和不管是不是1都是小于10的
https://leetcode-cn.com/problems/happy-number/

#include <bits/stdc++.h> using namespace std; class Solution{public:int f(int n){int ans=0;while(n){ans+=(n%10)*(n%10);n/=10;}return ans;}bool isHappy(int n){int slow = n;int fast = n;do{fast = f( f(fast) );slow = f(slow);}while(fast!=slow);if(slow != 1){return false;} else{return true;}} }; int main(){Solution s;int n;cin>>n;if(s.isHappt(n)) cout<<"YES";else cout<<"NO"<<endl;return 0; }

leetcode ?141. Linked List Cycle

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:bool hasCycle(ListNode *head) {if(head==NULL)return false;ListNode *slow;ListNode *fast;slow = fast = head;do{slow = slow->next;fast = fast->next;if(fast!=NULL) fast = fast->next;}while( fast != NULL &&slow != NULL &&slow->val!=fast->val);if(fast==NULL || slow==NULL) return false;else return true;} };

leetcode?142. Linked List Cycle II
測試數據

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNode *head) {// T的飛起// ListNode *slow = head;// ListNode *fast = head;// if(head==NULL|| head->next==NULL ) return NULL; // do{// slow = slow->next;// //fast = fast->next;// if(fast->next != NULL){// fast = fast->next->next;// }// else {// return NULL;// }// }while(slow!=NULL && fast !=NULL && slow->val !=fast->val);// if(fast==NULL || slow==NULL)return NULL;bool isCycle = false;while(slow !=NULL && fast !=NULL){slow = slow->next;if(fast->next ==NULL) return NULL;fast=fast->next->next;if(slow == fast){isCycle = true;break;}}if(!isCycle) return NULL;slow=head;while(slow != fast){ //如果按照下面那種寫法就過不了開始就是環的狀態slow = slow->next;fast = fast->next;}// do{// slow = slow->next;// fast = fast->next;// }while(slow != fast);return slow;} };

很能說明走到的相遇的位置和相遇的一道題
?

總結

以上是生活随笔為你收集整理的Floyd判圈算法(Floyd's cycle detection的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色成人免费观看 | 日日干夜夜爱 | 久久久久免费 | 成人在线视频免费看 | 老司机午夜av | 国产精品国产精品国产专区不卡 | 一级黄色片视频 | 小h片在线观看 | 亚州中文| 一卡二卡三卡在线 | 不卡av免费在线观看 | 青草视频在线免费观看 | 国产丝袜av | 亚洲品质自拍视频 | 日韩高清中文字幕 | 麻豆av网站 | 国产无码精品在线播放 | 成人精品一区二区三区电影 | 男女午夜视频在线观看 | 黄页网址大全免费观看 | 欧美日韩高清一区二区三区 | av观看一区 | 69视频入口 | 国产一区,二区 | 国产精品久久久久不卡 | 成人美女毛片 | 国产欧美综合一区二区三区 | 成人毛片网站 | 欧美性猛交久久久乱大交小说 | aaa一级片| 成人精品免费看 | 国产成人精品无码免费看在线 | 兔费看少妇性l交大片免费 日韩高清不卡 | 色综合天天综合综合国产 | 最新av免费观看 | 综合网在线视频 | 色综合一区二区三区 | 午夜宅男在线 | 在线免费观看黄色av | 亚洲精品婷婷 | 中文字幕av免费在线观看 | 天天综合视频 | 日韩二区三区四区 | 91精品一区二区三区四区 | 手机看片日韩 | 尹人综合| 国产麻豆精品久久一二三 | 无码不卡av东京热毛片 | 琪琪色综合| www.婷婷色| 日韩成人免费视频 | 欧美日韩一区二区三区四区五区六区 | 欧美亚洲激情 | 最新中文字幕av专区 | 另一种灿烂生活 | 中文字幕第三页 | 成人片在线看 | 久久久久99精品国产片 | 中文在线最新版天堂 | 亚洲综合视频在线 | 色综合久久久无码中文字幕波多 | xxxxx在线观看 | 五个女闺蜜把我玩到尿失禁 | 香蕉国产精品 | 欧美黄色录像视频 | 国产一区二区视频免费在线观看 | 一区二区在线免费观看视频 | 国产精品毛片一区视频播 | 北条麻妃一区二区三区在线观看 | 国产又粗又硬又长又爽的演员 | 国产一级黄色录像 | 日韩欧美亚洲一区二区三区 | 视频一区 国产 | 天天色官网 | 天天操天天操天天操天天 | 三级不卡视频 | 毛片你懂的 | 无码人妻精品一区二区三区99日韩 | 国产精品国产三级国产专区53 | www.国产色 | 国产欧美精品区一区二区三区 | 欧美一区二区在线视频观看 | 91网入口| 国产成人精品亚洲线观看 | 一级全黄裸体片 | 久久久综合久久久 | 久久久久国产一区二区 | 风间由美在线观看 | 天堂av在线网 | 亚洲图片欧美色图 | 91看篇| 999久久久国产精品 韩国精品一区二区 | 一区二区三区国产av | 亚洲一区二区国产 | 久久国产成人 | 伊人热久久 | 久久精选视频 | 国产黄色一区二区 | 天堂在线视频 |