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

标签:Python,数据结构,队列
0
投稿

猜你喜欢

  • sqlserver 存储过程分页(按多条件排序)

    2024-01-23 15:56:31
  • Python数组变形的几种实现方法

    2021-08-20 09:30:47
  • 破解加密的网页代码方法

    2010-03-16 12:35:00
  • MySQL 修改数据库名称的一个新奇方法

    2024-01-16 00:56:59
  • Python运行提示缺少模块问题解决方案

    2023-06-24 02:16:23
  • 详解mysql数据去重的三种方式

    2024-01-22 03:06:35
  • 使用Python实现图像标记点的坐标输出功能

    2022-10-31 16:15:06
  • 自己用的ASP分页函数

    2009-10-18 11:30:00
  • Django中使用session保持用户登陆连接的例子

    2021-08-29 03:27:30
  • Python内建类型bytes深入理解

    2022-11-13 08:35:54
  • pytorch实现用Resnet提取特征并保存为txt文件的方法

    2023-04-10 17:21:09
  • Python使用Flask-SQLAlchemy连接数据库操作示例

    2024-01-27 10:34:36
  • jquery ajax 局部无刷新更新数据的实现案例

    2024-05-02 17:05:08
  • Oracle的out参数实例详解

    2024-01-17 00:34:23
  • Python实现的列表排序、反转操作示例

    2023-06-19 11:14:27
  • FF下,用 col 隐藏表格列的方法详解!

    2008-04-02 11:35:00
  • Pytorch实现ResNet网络之Residual Block残差块

    2022-11-17 15:00:02
  • Python tkinter 多选按钮控件 Checkbutton方法

    2022-12-31 08:38:46
  • XHTML与HTML之间的7个区别

    2009-05-20 10:13:00
  • django 消息框架 message使用详解

    2021-06-21 17:22:29
  • asp之家 网络编程 m.aspxhome.com