Python數(shù)據(jù)結(jié)構(gòu)隊(duì)列解決約瑟夫斯問題
1、隊(duì)列
隊(duì)列是一種遵循先進(jìn)先出(FIFO)原則的數(shù)據(jù)結(jié)構(gòu)。
可以使用數(shù)組實(shí)現(xiàn)隊(duì)列的基本操作。當(dāng)進(jìn)行入隊(duì)操作的時(shí)候,即在隊(duì)列尾部插入一個(gè)元素,由于需要將所有元素向后移動一個(gè)位置,因此添加操作的時(shí)間復(fù)雜度是O(n);
當(dāng)進(jìn)行出隊(duì)操作的時(shí)候,只需要在隊(duì)頭移除一個(gè)元素,其他元素的序號不變,因此移除操作的時(shí)間復(fù)雜度是O(1)。
使用Python數(shù)組實(shí)現(xiàn)隊(duì)列源碼:
class Queue:
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
#
def enqueue(self, item):
self.items.insert(0, item)
#
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
2、使用隊(duì)列解決約瑟夫斯問題
弗拉維奧·約瑟夫斯是公元1世紀(jì)著名的歷史學(xué)家。相傳,約瑟夫斯當(dāng)年和39個(gè)戰(zhàn)友在山洞中對抗羅馬軍隊(duì)。眼看著即將失敗,他們決定舍生取義。于是,他們圍成一圈,從某個(gè)人開始,按順時(shí)針方向殺掉第7人。約瑟夫斯同時(shí)也是卓有成就的數(shù)學(xué)家。據(jù)說,他立刻找到了自己應(yīng)該站的位置,從而使自己活到了最后。當(dāng)只剩下他時(shí),約瑟夫斯加入了羅馬軍隊(duì),而不是自 殺。
這個(gè)故事有很多版本,有的說是每隔兩個(gè)人,有的說最后一個(gè)人可以騎馬逃跑。不管如何,問題都是一樣的。
約瑟夫斯問題等價(jià)于一個(gè)兒童游戲:傳土豆。
在這個(gè)游戲中,孩子們圍成一圈,并依次盡可能快地傳遞一個(gè)土豆,在某個(gè)時(shí)刻,大家停止傳遞,此時(shí)手里有土豆的孩子就得退出游戲。重復(fù)上述過程,直到只剩下一個(gè)孩子。
import my_queue
def hotPotato(namelist, num):
queue = my_queue.Queue()
for name in namelist:
queue.enqueue(name)
while queue.size() > 1:
for i in range(num):
queue.enqueue(queue.dequeue())
queue.dequeue()
return queue.dequeue()
print(hotPotato([1, 2, 3, 4, 5, 6], 7))
執(zhí)行過程如下,最終輸出結(jié)果為 3 。
234561
345612
456123
561234
654321
543216
432165
43216 彈出4
3216 彈出3
3、雙端隊(duì)列
雙端隊(duì)列是一種允許我們同時(shí)從隊(duì)頭和隊(duì)尾進(jìn)行出隊(duì)和入隊(duì)操作的特殊隊(duì)列,它是隊(duì)列和棧的結(jié)合體。
使用數(shù)組實(shí)現(xiàn)雙端隊(duì)列源碼:
class Deque:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def addFront(self, item):
self.items.append(item)
def addRear(self, item):
self.items.insert(0, item)
def removeFront(self):
return self.items.pop()
def removeRear(self):
return self.items.pop(0)
def size(self):
return len(self.items)
4、使用雙端隊(duì)列解決回文問題
回文是指從前往后讀和從后往前讀都一樣的字符串,例如radar、toot,以及madam。
需要構(gòu)建一個(gè)程序,它接受一個(gè)字符串并且檢測其是否為回文。
import my_deque
def palchecker(aString):
chardeque = my_deque.Deque()
for ch in aString:
chardeque.addRear(ch)
stillEqual = True
while chardeque.size() > 1 and stillEqual:
first = chardeque.removeFront()
last = chardeque.removeRear()
if first != last:
stillEqual = False
return stillEqual
print(palchecker('aaaabaaaa'))
print(palchecker('aaaabaaab'))
輸出結(jié)果為:
True
False
以上就是Python數(shù)據(jù)結(jié)構(gòu)隊(duì)列解決約瑟夫斯問題的詳細(xì)內(nèi)容,更多關(guān)于Python數(shù)據(jù)結(jié)構(gòu)隊(duì)列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 實(shí)現(xiàn)OpenCV格式和PIL.Image格式互轉(zhuǎn)
今天小編就為大家分享一篇Python 實(shí)現(xiàn)OpenCV格式和PIL.Image格式互轉(zhuǎn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python中創(chuàng)建相關(guān)系數(shù)矩陣的方法小結(jié)
相關(guān)系數(shù)矩陣是一種用于衡量變量之間關(guān)系的重要工具,本文將介紹在 Python 中創(chuàng)建相關(guān)系數(shù)矩陣的不同方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
詳解Python和Rust中內(nèi)存管理機(jī)制的實(shí)現(xiàn)與對比
Python和Rust都采用了垃圾收集(Garbage?Collection)機(jī)制來管理內(nèi)存,但它們各自的實(shí)現(xiàn)方式有很大的不同,下面就跟隨小編一起來深入了解下二者的區(qū)別吧2024-03-03
Python實(shí)現(xiàn)可視化CSV文件中的數(shù)據(jù)
CSV文件包含許多記錄,數(shù)據(jù)分布在各行和各列中,在這篇文章中,小編主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)可視化CSV文件中的數(shù)據(jù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11

