python-heapq-优先级队列-堆
2012-11-09 00:00
232 查看
http://docs.python.org/2/library/heapq.html
heapq 是一个小堆(当然也可以通过变换优先级的值 变成大堆)
heapq 可以 压入 普通的整数 也可以 压入list 这样就能 优先级 附带其它属性了
heapq 本身 支持 push 和 pop 操作
但是如何 调整已经加入的元素的优先级值呢?
比如 将某个元素的优先级 调小, 使其向堆顶移动, 这里需要知道这个元素当前在堆的哪个位置,接着 执行 堆调整的交换操作,调整这个元素的位置
首先如何查找到元素的位置,这个就比较头痛,没想到办法让heapq在调整优先级的过程中同时记录元素的位置,如果不能这样快速的查找位置,那heapq就没有意义了
因此只能采用另外一种方式,类似于线性探测解决冲突的hash表所做的,将删除的元素 标记 ID 为-1 ,认为其被删除了, 在出队操作中, 对于已经被删除的元素则忽略, 接着将调整优先级的 新元素重新插入到队列里面去
但是存在一个问题, 这样不能通过简单的查看队列长度来判定队列是否为空, 需要封装一个pop操作来抛出异常, 同时在调用pop的时候 注意 捕获异常
heapq 是一个小堆(当然也可以通过变换优先级的值 变成大堆)
heapq 可以 压入 普通的整数 也可以 压入list 这样就能 优先级 附带其它属性了
heapq 本身 支持 push 和 pop 操作
但是如何 调整已经加入的元素的优先级值呢?
比如 将某个元素的优先级 调小, 使其向堆顶移动, 这里需要知道这个元素当前在堆的哪个位置,接着 执行 堆调整的交换操作,调整这个元素的位置
首先如何查找到元素的位置,这个就比较头痛,没想到办法让heapq在调整优先级的过程中同时记录元素的位置,如果不能这样快速的查找位置,那heapq就没有意义了
因此只能采用另外一种方式,类似于线性探测解决冲突的hash表所做的,将删除的元素 标记 ID 为-1 ,认为其被删除了, 在出队操作中, 对于已经被删除的元素则忽略, 接着将调整优先级的 新元素重新插入到队列里面去
但是存在一个问题, 这样不能通过简单的查看队列长度来判定队列是否为空, 需要封装一个pop操作来抛出异常, 同时在调用pop的时候 注意 捕获异常
相关文章推荐
- 利用python的heapq实现prim算法以及优先级队列
- Python利用heapq实现一个优先级队列
- 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序
- 基础入门_Python-模块和包.深入Celery之使用队列以及优先级提高响应?
- Python优先级队列实现
- python数据结构学习笔记-2016-11-05-02-优先级队列
- Python实现优先级队列结构的方法详解
- Python实现优先级队列结构的方法详解
- Python cookbook(数据结构与算法)实现优先级队列的方法示例
- Python的优先级队列
- python计算最大优先级队列实例
- python线程优先级队列( Queue)
- python多线程--优先级队列(Queue)
- python计算最大优先级队列实例
- python计算最小优先级队列代码分享
- Python线程优先级队列(Queue)
- 优先级队列实现
- python 操作execl,知识点 进程池,队列,xlwt
- python 多线程 +队列下载资源
- Python 生产者消费者--队列实现