Python|約瑟夫環算法

本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。


問題描述

問題描述:N個人圍成一圈,從第一個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈;如此往復,直到所有人出圈。(模擬此過程,輸出出圈的人的序號)。


解決方案

這道題涉及到的算法叫做“約瑟夫算法”,我們需要將列表內所有人類似排列成一個“圈”來解決,需要將前一次刪除後剩下的元素的索引不變,但是位置向前提。無限循環這個“圈”,直到刪除到只剩一個。

這道題的關鍵在於如何將每個數的索引數字固定,在刪除前一個數字後,後面的數字都應該在排序中加一。所以我們一開始需要創建一個列表,從1開始到含有位數的數字,代表每個數字的索引列表。

代碼示例:

def Josephus_problem(num,gap):

     location_list = [a for a in range(1,num+1)]

     if num ==   1 :

         return

     else:

         index = 0

         for i in range(num-1):

            index = (index + gap  )%len(location_list) - 1

            print("本次出局的人爲:",location_list[index])

            del location_list[index]

            if index == 0:

                index = 0

         print( "最後剩下的爲:",location_list[0])

 

Josephus_problem(5,3)


結語

這道題的解決方法有很多種,這裏主要介紹一下這種算法。還有重點爲推導出(index + gap )%len(location_list)這個公式。




主編:王楠嵐

稿件來源:深度學習與文旅應用實驗室(DLETA)

本文分享自微信公衆號 - 算法與編程之美(algo_coding)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章