[算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值

Day6队列中的移动平均值

给定一个整数数据流和一个窗口大小,根据滑动窗口的大小,计算其所有整数的移动平均值
[算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值_第1张图片

队列,Python中的queue模块是对栈和队列的封装,可以直接调用类的属性和方法,队列类似于一条管道,元素先进先出,进put(arg),取get( )。需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态。

队列的种类

队列有很多种,但都依赖模块queue
[算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值_第2张图片

队列的方法

[算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值_第3张图片

import queue
# 初始化一个大小为3的队列
q = queue.Queue(3)
# 判断队列是否为空
print(q.empty())
# 入队,在队列尾增加数据,block和timeout参数可省略,block为True表示队列已经满了,
# 则阻塞,timeout表示超时间,如果阻塞时间超过了则会报错
q.put(5,block = True,timeout = 5)
# 判断队列是否满了
print(q.full())
# 获取队列当前数据的个数
print(q.qsize())
# 从队列中取出一个元素
print(q.get())

[算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值_第4张图片
法一:`

class MovingAverage:
    def __init__(self, size: int):
        self.size = size
        self.queue = []
        
    def next(self, val: int) -> float:
        size, queue = self.size, self.queue
        queue.append(val)
        # calculate the sum of the moving window
        window_sum = sum(queue[-size:])
        if len(queue) == 1:
            return print(queue[0])
        else:
            tail = " + ".join([str(i) for i in queue[-size:]])
            return print("({})/{}={}".format(tail,min(len(queue),size),window_sum / min(len(queue), size)))
m = MovingAverage(3)
m.next(1)
m.next(10)
m.next(5)
m.next(6)

[算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值_第5张图片
法二:

import queue
class MovingAverage:
    def __init__(self,size:int):
        self.que = queue.Queue(size)
    def next(self,val:int) -> float:
        if(self.que.full()):
            self.que.get()
        self.que.put(val)
        return sum(self.que.queue)/self.que.qsize()
m = MovingAverage(3)
print(m.next(1))
print(m.next(10))
print(m.next(5))
print(m.next(6))

[算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值_第6张图片
了解更多队列内容详见
双端队列和循环队列详见

你可能感兴趣的:([算法和数据结构入门][Day6]笨办法实现使用队列求移动平均值)