生活随笔
收集整理的這篇文章主要介紹了
用PHP实现丢手帕问题(约瑟夫问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:有n個人圍成一圈,然后從任意指定的一個?人那里為起點,以m個人為單位,每轉m個人第m個人被殺死。求最后不會被殺死的人。
遺留問題:
在此用php做簡單的實現,php中對遞歸有100次的深度限制,所以在此不用遞歸,用循環;php中處理數組的函數比較多,所以采用順序表(數組),順序表刪除元素比較復雜,所以效率比較低,只能處理10000一下的數據。鏈表中的遍歷比較復雜,同樣會導致效率低下,以后再做順序表與鏈表的結合。
模擬實現:
[php]?view plain
?copyclass?Dhc??{??????private?function?dropHandkerchief($start=0,$distance,$menArray)??????{??????????$count?=?count($menArray);????????????$pos?=?$distance?-?1;????????????$start?=?$start?>?($count-1)???0?:?$start;??????????$pos?=?$start?+?$pos;??????????while($count?>?1)????????????{????????????????if($pos?<?$count)??????????????{????????????????????echo?"第".?$menArray[$pos]?."人出列<br?/>";????????????????????array_splice($menArray,$pos,1);??????????????????$count??=?count($menArray);??????????????????$pos?+=?$distance?-?1;??????????????}else????????????????{??????????????????????????????????????$pos?=?$pos?%?$count;????????????????}??????????}????????????echo?'<br?/>';????????????echo?"第"?.$menArray[0].?"人被留下";????????}??????????public?function?drop()??????{??????????$menArray?=?array();??????????$total?=?100;??????????$distance?=?50;??????????$start?=?3;??????????$i?=?0;????????????while($i?<?$total)??????????{????????????????$menArray[$i]?=?$i?+?1;????????????????$i++;????????????}????????????$this->dropHandkerchief($start,?$distance,?$menArray);????????}??}??
數學推導實現:(20170914)
簡單改變一下問題的描述:有 n 個人,編號是 0 - n-1,從 0 開始數,數到 m 則 m 死,下一個人繼續從 0 開始數,直到只剩最后一個人,求這個人最開始的編號。
每死一個人就重新開始,相當于減小了問題的規模,就是要解 n 個規模的解:n, n-1, n-2, n-3 …… 3, 2, 1。
假如在第二輪(n-1個人的規模)中死的那個人編號是 x(這個編號是第一個人死后,重新從 0 開始編排的),則可以推導出這個人在第一輪(人數為 n 時)中的編號是:(x + m)%n。
(n-2)中死的人在(n-1)中的編號是:(x + m)%(n-1)
(n-3)中死的人在(n-1)中的編號是:(x + m)%(n-2)
……
( 1 )中死的人在( 2 )中的編號是:(x + m)%2, 此時 x = 0;
把上面的過程倒過來,已知規模為 1 時,x = 0;
求規模為 2 時,x2 的值:(x + m) % 2 = x2
求規模為 3 時,x3 的值:(x2 + m) % 3 = x3
?……
求規模為 n 時 x 的值。
[php]?view plain
?copy$n?=?100;??$m?=?3;??$s?=?0;????$x?=?0;??for?($i=2;?$i<=$n;?$i++)?{??????$x?=?($x?+?$m)?%?$i;??}??echo?($x?+?$s)?%?$n;???
總結
以上是生活随笔為你收集整理的用PHP实现丢手帕问题(约瑟夫问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。