zoukankan      html  css  js  c++  java
  • heapq of python

    heap

    https://stackoverflow.com/questions/19979518/what-is-pythons-heapq-module

    堆不是二叉树。

    堆以list方式存储。

    堆不同于sorted list。

    堆在插入和删除比sorted list更加高效。

    搜索还是sorted list高效。

    Quoting Wikipedia:

    Heaps are commonly implemented with an array. Any binary tree can be stored in an array, but because a binary heap is always a complete binary tree, it can be stored compactly. No space is required for pointers; instead, the parent and children of each node can be found by arithmetic on array indices.

    This image below should help you to feel the difference between tree and list representation of the heap and (note, that this is a max heap, which is the inverse of the usual min-heap!):

    enter image description here

    In general, heap data structure is different from a sorted list in that it sacrifices some information about whether any particular element is bigger or smaller than any other. Heap only can tell, that this particular element is less, than it's parent and bigger, than it's children. The less information a data structure stores, the less time/memory it takes to modify it. Compare the complexity of some operations between a heap and a sorted array:

            Heap                  Sorted array
            Average  Worst case   Average   Worst case
    
    Space   O(n)     O(n)         O(n)      O(n)
    
    Search  O(n)     O(n)         O(log n)  O(log n)
    
    Insert  O(1)     O(log n)     O(n)      O(n)
    
    Delete  O(log n) O(log n)     O(n)      O(n)
    

    heapq

    https://docs.python.org/3.5/library/heapq.html#

    此模块实现的优先队列算法。

    即在一个排队队列中, 不是按照先来先服务的顺序,

    而是按照节点在队列中的权重,动态叫号。

    潜台词是, 队列中的节点,是动态改变的, 就是在任意时间:

    (1)已排队节点,可以退出排队。

    (2)新来节点,可以理解加入排队。

    对于顺序列表, 其实实现动态性能,要时间代价太大。

    This module provides an implementation of the heap queue algorithm, also known as the priority queue algorithm.

    Heaps are binary trees for which every parent node has a value less than or equal to any of its children. This implementation uses arrays for which heap[k] <= heap[2*k+1] and heap[k] <= heap[2*k+2] for all k, counting elements from zero. For the sake of comparison, non-existing elements are considered to be infinite. The interesting property of a heap is that its smallest element is always the root, heap[0].

    >>> def heapsort(iterable):
    ...     h = []
    ...     for value in iterable:
    ...         heappush(h, value)
    ...     return [heappop(h) for i in range(len(h))]
    ...
    >>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    DEMO

    # Python code to demonstrate working of 
    # heapify(), heappush() and heappop() 
    
    # importing "heapq" to implement heap queue 
    import heapq 
    
    # initializing list 
    li = [5, 7, 9, 1, 3] 
    
    # using heapify to convert list into heap 
    heapq.heapify(li) 
    
    # printing created heap 
    print ("The created heap is : ",end="") 
    print (list(li)) 
    
    # using heappush() to push elements into heap 
    # pushes 4 
    heapq.heappush(li,4) 
    
    # printing modified heap 
    print ("The modified heap after push is : ",end="") 
    print (list(li)) 
    
    # using heappop() to pop smallest element 
    print ("The popped and smallest element is : ",end="") 
    print (heapq.heappop(li)) 

    应用

    https://www.geeksforgeeks.org/applications-priority-queue/

    (1)最短路算法

    (2)素数算法

    (3)数据压缩

    (4)A星搜索

    (5)堆排序

    (6)系统负载均衡,中断处理。 进程调度,磁盘调度。

    Dijkstra’s Shortest Path Algorithm using priority queue: When the graph is stored in the form of adjacency list or matrix, priority queue can be used to extract minimum efficiently when implementing Dijkstra’s algorithm.

    Prim’s algorithm: It is used to implement Prim’s Algorithm to store keys of nodes and extract minimum key node at every step.

    Data compression : It is used in Huffman codes which is used to compresses data.

    Artificial Intelligence : A* Search Algorithm : The A* search algorithm finds the shortest path between two vertices of a weighted graph, trying out the most promising routes first. The priority queue (also known as the fringe) is used to keep track of unexplored routes, the one for which a lower bound on the total path length is smallest is given highest priority.

    Heap Sort : Heap sort is typically implemented using Heap which is an implementation of Priority Queue.

    Operating systems: It is also use in Operating System for load balancing (load balancing on server), interrupt handling.

  • 相关阅读:
    7月自动化测试公开课通知
    招高级自动化测试工程师
    招聘软件开发工程师/开发实习生
    Selenium关键字驱动测试框架Demo(Java版)
    Eclipse+Selenium自动化测试脚本设计V1.0
    WebDriver基本API使用(基于Java)V1.0
    测试体系建设 免费咨询服务
    UFTQTP 12 新特性
    招聘自动化测试工程师
    AppScan学习笔记
  • 原文地址:https://www.cnblogs.com/lightsong/p/13931970.html
Copyright © 2011-2022 走看看