Python數(shù)據(jù)結(jié)構(gòu)隊列解決約瑟夫斯問題
1、隊列
隊列是一種遵循先進先出(FIFO)原則的數(shù)據(jù)結(jié)構(gòu)。
可以使用數(shù)組實現(xiàn)隊列的基本操作。當進行入隊操作的時候,即在隊列尾部插入一個元素,由于需要將所有元素向后移動一個位置,因此添加操作的時間復(fù)雜度是O(n);
當進行出隊操作的時候,只需要在隊頭移除一個元素,其他元素的序號不變,因此移除操作的時間復(fù)雜度是O(1)。
使用Python數(shù)組實現(xiàn)隊列源碼:
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、使用隊列解決約瑟夫斯問題
弗拉維奧·約瑟夫斯是公元1世紀著名的歷史學家。相傳,約瑟夫斯當年和39個戰(zhàn)友在山洞中對抗羅馬軍隊。眼看著即將失敗,他們決定舍生取義。于是,他們圍成一圈,從某個人開始,按順時針方向殺掉第7人。約瑟夫斯同時也是卓有成就的數(shù)學家。據(jù)說,他立刻找到了自己應(yīng)該站的位置,從而使自己活到了最后。當只剩下他時,約瑟夫斯加入了羅馬軍隊,而不是自 殺。
這個故事有很多版本,有的說是每隔兩個人,有的說最后一個人可以騎馬逃跑。不管如何,問題都是一樣的。
約瑟夫斯問題等價于一個兒童游戲:傳土豆。
在這個游戲中,孩子們圍成一圈,并依次盡可能快地傳遞一個土豆,在某個時刻,大家停止傳遞,此時手里有土豆的孩子就得退出游戲。重復(fù)上述過程,直到只剩下一個孩子。
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、雙端隊列
雙端隊列是一種允許我們同時從隊頭和隊尾進行出隊和入隊操作的特殊隊列,它是隊列和棧的結(jié)合體。
使用數(shù)組實現(xiàn)雙端隊列源碼:
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、使用雙端隊列解決回文問題
回文是指從前往后讀和從后往前讀都一樣的字符串,例如radar、toot,以及madam。
需要構(gòu)建一個程序,它接受一個字符串并且檢測其是否為回文。
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)隊列解決約瑟夫斯問題的詳細內(nèi)容,更多關(guān)于Python數(shù)據(jù)結(jié)構(gòu)隊列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django中ORM找出內(nèi)容不為空的數(shù)據(jù)實例
這篇文章主要介紹了Django中ORM找出內(nèi)容不為空的數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python Multinomial Naive Bayes多項貝葉斯模型實現(xiàn)原理介紹
這篇文章主要介紹了Python Multinomial Naive Bayes多項貝葉斯模型實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09關(guān)于flask路由app.route及路由參數(shù)的各種用法解析
我們在開發(fā)過程中,編寫項目時所使用的路由往往是指代了框架/項目中用于完成路由功能的類,這個類一般就是路由類,簡稱路由,這篇文章主要介紹了有關(guān)flask路由app.route及路由參數(shù)的各種用法解析,需要的朋友可以參考下2024-03-03TensorFlow中tf.batch_matmul()的用法
這篇文章主要介紹了TensorFlow中tf.batch_matmul()的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06