亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

使用python從三個角度解決josephus問題的方法

瀏覽:67日期:2022-08-01 08:37:11

0 寫在前面

josephus問題是數據結構教材中的一個常見實例,其問題可以描述為:

設nnn個人圍坐一圈,現在要求從第kkk個人開始報數,報到第mmm個的人退出。然后從下一個人開始繼續按照同樣規則報數并退出,直到所有人退出為止。要求按照順序輸出每個人的序列號。

1 基于數組概念的解法

首先考慮基于python的list和固定大小的數組概念,即將list看作元素個數固定的對象,只改變值而不刪除元素,相當于擺了一圈nnn把椅子,人雖然退出但是椅子還在,我們可以給每個人從111到nnn編號,沒有人的位置用000表示,思路如下:

初始

建立包含nnn個人(編號)的list 找到第kkk個人開始

運行

從kkk的位置開始數到mmm,中間遇到000的就跳過 數到mmm之后,將其值改為000 然后繼續循環,總共循環nnn次(因為每次循環就會退出一個人)

代碼如下:

def josephus_A(n, k, m): people = list(range(1, (n+1))) i = k-1 for num in range(n): count = 0 while count < m: if people[i] > 0:count += 1 if count == m:print(people[i], end=' ')people[i] = 0 i = (i+1) % n # count只是flag,真正記的數是i if num < n-1: print(end=',', ) else: print(' ')

2 基于順序表的解法

順序表是線性表的一種,即表中元素放在一塊足夠大的連續存儲區里,首元素存入存儲區開始位置,其余元素依次存放。順序表在python中的也是list,跟第一種解法不同,當第mmm個人退出需要進行刪除元素的操作,才是順序表。而第一種解法的數組想要刪除并不是那么容易,這里是因為python中沒有內置對數組的支持,所以用list代替,具體可以參照c++中的數組,如果要刪除中間的某個元素的話,必須對后面的元素重新編號。代碼實現如下:

def josephus_L(n, k, m): people = list(range(1, (n+1))) i=k-1 for num in range(n,0,-1): i=(i+m-1)%num print(people.pop(i),end=', ' if num>1 else 'n')

3 基于循環單鏈表的解法

單鏈表即單向鏈接表,典型的就是c++中的鏈表,循環單鏈表就是頭尾相連的單鏈表,也是線性表的一種,這道題目使用循環單鏈表記錄nnn個人圍坐一圈最為契合。我們只需要數到第mmm個結點就刪除,刪除操作對于鏈表來說比較容易,而且不需要有i = (i+1) % n這樣的整除操作。但是問題在于python并沒有像c++那樣有內置對鏈表的支持,因此需要建立一個鏈表的類,建立是比較麻煩的,但是操作比較簡單,如下:

class LNode: # 建立鏈表結點 def __init__(self,elem,next_=None): self.elem=elem self.next=next_class LCList: # 建立循環鏈接表 def __init__(self): self._rear=None def is_empty(self): return self._rear is None def prepend(self,elem): # 前端插入 p=LNode(elem) if self._rear is None: p.next=p # 建立一個結點的環 self._rear=p else: p.next=self._rear.next self._rear.next=p def append(self,elem): # 尾端插入 self.prepend(elem) self._rear = self._rear.next def pop(self): # 前端彈出 if self._rear is None: raise LinkedListUnderflow('in pop of CLList') p = self._rear.next if self._rear is p: self._rear =None else: self._rear.next=p.next return p.elem def printall(self): # 輸出表元素 if self.is_empty(): return p = self._rear.next while True: print(p.elem) if p is self._rear:break p=p.nextclass LinkedListUnderflow(ValueError): # 自定義異常 passclass Josephus(LCList): def __init__(self,n,k,m): LCList.__init__(self) for i in range(n): self.append(i+1) self.turn(k-1) while not self.is_empty(): self.turn(m-1) print(self.pop(),end=('n' if self.is_empty() else ', ')) def turn(self,m): for i in range(m): self._rear = self._rear.next

到此這篇關于使用python從三個角度解決josephus問題的方法的文章就介紹到這了,更多相關python josephus問題內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 中文字幕亚洲欧美一区 | 日韩亚洲欧美性感视频影片免费看 | 九九九九九九精品免费 | 羞羞色院91精品网站 | 亚洲成a人片在线网站 | 五月天色丁香 | 国产精品女主播自在线拍 | 国内精品视频一区二区三区 | 中文乱码一二三四有限公司 | 狠狠色丁香婷婷综合久久来 | 国产成人午夜福在线观看 | 久久中文字幕制服丝袜美腿 | 国产成人高清精品免费5388密 | 中文精品久久久久国产网址 | 免费激情网 | 日本黄色二级片 | 欧美 亚洲 一区 | 大陆黄色a级片 | 最新国产麻豆精品 | 爱爱永久免费视频网站 | 亚洲欧美日产综合一区二区三区 | 伊人色综合琪琪久久社区 | 欧美日韩在线第一页 | 免费人成网站在线播放 | 伊人精品在线 | 1000部末满18在线观看黄 | 久久99爱爱 | 国产日本亚洲欧美 | 超黄视频网站 | 欧美午夜a级限制福利片 | 爱爱免费视频网站 | 欧美成人午夜不卡在线视频 | 女人被男人狂躁免费视频 | 国产日产久久高清欧美一区 | 亚洲成在人天堂一区二区 | 日韩中文字幕精品视频在线 | 国产欧美日韩综合精品二区 | 亚洲国产精品综合久久久 | 最新国产美女一区二区三区 | 中国成熟xxx视频 | 97久久久久国产精品嫩草影院 |