Python数据结构队列解决约瑟夫斯问题
作者:西召 发布时间:2022-01-07 03:20:53
1、队列
队列是一种遵循先进先出(FIFO)原则的数据结构。
可以使用数组实现队列的基本操作。当进行入队操作的时候,即在队列尾部插入一个元素,由于需要将所有元素向后移动一个位置,因此添加操作的时间复杂度是O(n);
当进行出队操作的时候,只需要在队头移除一个元素,其他元素的序号不变,因此移除操作的时间复杂度是O(1)。
使用Python数组实现队列源码:
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个战友在山洞中对抗罗马军队。眼看着即将失败,他们决定舍生取义。于是,他们围成一圈,从某个人开始,按顺时针方向杀掉第7人。约瑟夫斯同时也是卓有成就的数学家。据说,他立刻找到了自己应该站的位置,从而使自己活到了最后。当只剩下他时,约瑟夫斯加入了罗马军队,而不是自 杀。
这个故事有很多版本,有的说是每隔两个人,有的说最后一个人可以骑马逃跑。不管如何,问题都是一样的。
约瑟夫斯问题等价于一个儿童游戏:传土豆。
在这个游戏中,孩子们围成一圈,并依次尽可能快地传递一个土豆,在某个时刻,大家停止传递,此时手里有土豆的孩子就得退出游戏。重复上述过程,直到只剩下一个孩子。
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))
执行过程如下,最终输出结果为 3 。
234561
345612
456123
561234
654321
543216
432165
43216 弹出4
3216 弹出3
3、双端队列
双端队列是一种允许我们同时从队头和队尾进行出队和入队操作的特殊队列,它是队列和栈的结合体。
使用数组实现双端队列源码:
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。
需要构建一个程序,它接受一个字符串并且检测其是否为回文。
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'))
输出结果为:
True
False
来源:https://juejin.cn/post/7195398266224115767#heading-1
猜你喜欢
- 异步 innerHTMLinnerHTML 插入节点的性能的问题,通常是我们最关注的。在回答这问题时,James Padolsey 给出了他
- 这是我的第一个真正意思上的自动化脚本。1、练习的测试用例为:打开百度首页,搜索“胡歌”,然后检索列表,有无“胡歌的新浪微博”这个链接 2、在
- Django根据已有数据库表反向生成models类一. 创建一个Django项目django-admin startproject ‘xxx
- Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原。1.PHP加密扩展库Mcrypt安装在标准的PHP安装过程中并没
- session 不用多介绍,使一个http可以对应一个终端用户。session的本质使用cookie来实现。原理大概是:http 带来服务端
- 原先的ctrl+alt+L容易和各种软件的快捷键冲突在setting——keymap——右边搜索栏搜索Reformat Code就会出现该设
- js代码:window.alert = function(msg, callback) {var div = document.create
- 本文主要探索的是使用Python+tkinter编程实现一个简单的计算器代码示例,具体如下。闲话不说,直奔主题。建议大家跟着敲一遍代码,体会
- 迭代数组NumPy中引入了 nditer 对象来提供一种对于数组元素的访问方式。一、单数组迭代1. 使用 nditer 访问数组的每个元素&
- 前言PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数
- 基本介绍文件,对我们并不陌生,文件是数据源(保存数据的地方)的 一种输入流和输出流 文件在程序中是以流的形式来操作的流:数据在数据源(文件)
- 简介Python 的序列(sequence)通常指一个可迭代的容器,容器中可以存放任意类型的元素。列表和元组这两种数据类型是最常被用到的序列
- VuePressvuepress是尤大大4月12日发布的一个全新的基于vue的静态网站生成器,实际上就是一个vue的spa应用,内置webp
- 一、条件语句条件语句能够改变Python程序的执行流程,是执行这个代码块还是另一个代码块。凡是需要判断来确定下一步如何执行的程序都要使用条件
- 本系列文章是我在sqlskill.com的PAUL的博客看到的,很多误区都比较具有典型性和代表性,原文来自T-SQL Tuesday #11
- vue单向数据流在vue中需要遵循单向数据流原则在父传子的前提下,父组件的数据发生会通知子组件自动更新子组件内部,不能直接修改父组件传递过来
- 第一个博客,大概就是开始学数据库了,然后自己下载各种搞不定,各种问题,百度也不是很好用,问了下也没什么结果,后来总算搞定,但是花了很长时间,
- 本文实例为大家分享了opencv+python实现均值滤波的具体代码,供大家参考,具体内容如下原理均值滤波其实就是对目标像素及周边像素取平均
- python逆序的三位数程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入7
- 在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述Navicat for