卷積滑動視窗python程式碼_Python —— 滑動視窗最小值
阿新 • • 發佈:2021-02-12
技術標籤:卷積滑動視窗python程式碼
考慮一個經常碰到的問題,對於一個數組,現在有一個視窗[i, j]
,i
和j
只會做增加的操作,要求輸出[i,j]
上的最小值。
這其實就是一個“最小佇列(min queue)”問題:維護一個佇列,使得插入、彈出、獲取最小值這三個操作的平均時間複雜度都是
。實現這個的方法是使用兩個佇列,其中一個是單調佇列。
思路參見:
滑動視窗的最小值問題_C/C++_weixin_38391092的部落格-CSDN部落格blog.csdn.netimport collections class MinQueue(collections.deque): def __init__(self, iterable=None, maxlen=None): super().__init__(maxlen=maxlen) self.minQueue = collections.deque() if isinstance(iterable, collections.abc.Iterable): for it in iterable: self.append(it) @property def minV(self): return self.minQueue[0] if self.minQueue else None def append(self, v): while self.minQueue and v < self.minQueue[-1]: self.minQueue.pop() self.minQueue.append(v) super().append(v) def extend(self, iterable): for it in iterable: self.append(it) def pop(self): if not self.minQueue: return None v = super().popleft() if self.minQueue[0] == v: self.minQueue.popleft() return v
上面用 python 對這一問題做了很好的封裝。
同樣的,有滑動視窗最大值
import collections class MaxQueue(collections.deque): def __init__(self, iterable=None, maxlen=None): super().__init__(maxlen=maxlen) self.maxQueue = collections.deque() if isinstance(iterable, collections.abc.Iterable): for it in iterable: self.append(it) @property def maxV(self): return self.maxQueue[0] if self.maxQueue else None def append(self, v): while self.maxQueue and v > self.maxQueue[-1]: self.maxQueue.pop() self.maxQueue.append(v) super().append(v) def extend(self, iterable): for it in iterable: self.append(it) def pop(self): if not self.maxQueue: return None v = super().popleft() if self.maxQueue[0] == v: self.maxQueue.popleft() return v