队列(Queue)是一种常见的数据结构,它遵循先进先出(FIFO - First In First Out)的原则。
队列的基本操作
- 入队(Enqueue):在队列的尾部添加一个元素。
- 出队(Dequeue):从队列的头部移除一个元素。
- 查看队首元素(Peek):获取队列头部的元素,但不移除它。
- 判断队列是否为空(IsEmpty):检查队列中是否有元素。
队列的应用场景
- 广度优先搜索(BFS):在图的广度优先搜索算法中,队列用于存储待访问的节点。
- 任务调度:操作系统中的任务调度,例如按照先来先服务的原则处理进程。
- 消息传递系统:在消息队列中间件中,消息按照发送的先后顺序排队等待接收者处理。
Python中的queue
模块
在 Python 中,queue模块提供了同步的队列类,这些队列类可用于在多线程编程中安全地传递数据。以下是queue模块中主要的队列类及其基本用法:
- Queue类
Queue类实现了一个基本的先进先出(FIFO)队列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| >>> import queue >>> q = queue.Queue() >>> q.put(1) >>> q.put(2) >>> q.put(3) >>> q.empty() False >>> q. q.all_tasks_done q.full() q.get_nowait() q.maxsize q.not_empty q.put( q.qsize() q.task_done() q.empty() q.get( q.join() q.mutex q.not_full q.put_nowait( q.queue q.unfinished_tasks >>> q.qsize() 3 >>> q.get() 1 >>> q.get() 2 >>> q.get() 3 >>> q.get()
|
求滑动窗口的中位数:https://leetcode.cn/problems/sliding-window-median/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import heapq
def deleteItem(heap, num): idx = heap.index(num) last = heap.pop() if idx < len(heap): heap[idx] = last heapq._siftup(heap, idx) heapq._siftdown(heap, 0, idx)
def getMiddle(heap, k): sortedList = heapq.nsmallest(k, heap) idx, left = divmod(k, 2) if not left: if idx > 0: return (sortedList[idx - 1] + sortedList[idx]) / 2 else: return int(sortedList[idx])
class Solution: def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]: middles = [] heap = [] for i, num in enumerate(nums): if i < k: heapq.heappush(heap, num) else: middles.append(getMiddle(heap, k)) numOut = nums[i - k] deleteItem(heap, numOut) heapq.heappush(heap, num) middles.append(getMiddle(heap, k)) return middles
|