草庐IT

今人不见古时月,今月曾经照古人 2023-03-28 原文

堆结构是一种数组对象,是一棵完全二叉树。

性质

若当前节点编号为i,父结点则为i/2,左孩子为2i,右孩子为2i+1。

堆的结点数\(\le\)数组长度len

下图为一个大根堆:每个结点均小于其父结点,树根是堆中最大的结点,小根堆反之。

添加

往堆中添加一个元素。

重复n次添加操作,即可建立一个小根堆。

实现流程(以小根堆为例)

先在堆尾加入1个元素,并把这个结点置为当前结点。

比较当前结点和它的父结点的大小,

如果当前结点小于父结点,交换它们的值,把父结点置为当前结点。

重复以上过程。

如果当前结点大于等于父结点,结束。

取出堆顶

从堆中取出并删除一个元素。

实现流程(以小根堆为例)

取出根结点的值。

把堆的最后一个结点(len)放到根的位置上,把根覆盖掉。

把堆的长度减一。

把根结点置为当前结点。

如果当前节点无儿子(pa>len/2),结束。

否则,比较当前节点与其子节点的值,

如果当前节点的值小于等于其子节点,结束。

反之则交换这两个结点的值,重复上述步骤,直至结束。

优先队列

priority_queue<Type,Container,Functional>

Type是数据类型,Container是容器类型。

(Container必须是用数组实现的容器,比如vector,deque等,但不能用list,STL里默认用vector)

Functional是比较函数,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大根堆。

头文件

include

定义小根堆

priority_queue<int,vector,greater>q;//升序队列

定义大根堆

priority_queue<int,vector,less>q;//降序队列

基本操作

empty()

如果队列为空,则返回真。

pop()

删除队头元素,即删除第一个元素。

push()

加入一个元素。

size()

返回优先队列中拥有的元素个数。

top()

返回优先队列队头元素,即优先级最高的元素。

在默认的优先队列中,优先级高的先出队。

在默认的int型中先出队的为较大的数。

堆排序

并非原创,仅是整理,请见谅

有关堆的更多相关文章

  1. ruby - 在一堆 Rack 安装的应用程序/中间件之间共享对象的最佳/最优雅的方式? - 2

    在Rack安装的应用程序/中间件之间共享对象的最佳习惯用法是什么?例如,这个config.ru有两个Sinatra应用程序映射到不同的端点:classApp1现在,如果这两个应用程序需要共享一个对象,无论是数据库连接器还是任何其他对象,最好的习惯用法是什么?我基本上看到两个选项:1-在config.ru级别创建一个常量,并在应用程序中简单地引用该常量。例如:SHARED_OBJECT="helloworld"classApp12-在config.ru级别创建一个单例对象并在应用程序中使用它。例如:classSharedObjectincludeSingletondeftest@test

  2. ruby - 为什么这个 Ruby 程序不将堆内存返回给操作系统? - 2

    我试图了解从Ruby堆分配的内存何时返回给操作系统。我知道Ruby永远不会返回分配给它的堆内存,但我仍然不确定堆外内存的行为。即那些不适合40字节RVALUE的对象。考虑以下分配一些大字符串然后强制进行主要GC的程序。require'objspace'STRING_SIZE=250defprint_stats(msg)puts'-------------------'putsmsgputs'-------------------'puts"RSS:#{`ps-eorss,pid|grep#{Process.pid}|grep-vgrep|awk'{print$1,"KB";}'`}"p

  3. javascript - 提高 Chrome JS 堆限制? - 2

    我有一个使用太多内存的JavaScript应用程序。它不会使选项卡崩溃,但加载可能需要几分钟,其中大部分时间都花在了GC上。我正在使用堆分析器查看哪些函数分配的内存最多,效果很好。有没有什么方法可以让Chrome允许每个进程使用更大的JS堆,这样我就可以在减少内存压力的情况下进行测试运行,而无需等待GC几分钟?也许是我找不到的命令行参数? 最佳答案 是的,控制台中报告了jsHeapSizeLimit:>console.memoryMemoryInfo{totalJSHeapSize:42100000,usedJSHeapSize:2

  4. javascript - 堆分析的脚本代码有什么作用? - 2

    所以HeapAnalytics告诉我粘贴此代码以使用他们的产品-window.heap=window.heap||[];heap.load=function(a){window._heapid=a;varb=document.createElement("script");b.type="text/javascript",b.async=!0,b.src=("https:"===document.location.protocol?"https:":"http:")+"//cdn.heapanalytics.com/js/heap.js";varc=document.getElemen

  5. javascript - 我应该如何为一堆对象生成唯一的 ID? - 2

    我有一个由很多Symbol对象组成的数组:varsymbols={alpha:newSymbol('alpha','symbol_0','α','GreekSymbol'),beta:newSymbol('beta','symbol_1','β','GreekSymbol'),gamma:newSymbol('gamma','symbol_2','γ','GreekSymbol'),delta:newSymbol('delta','symbol_3','δ','GreekSymbol'),...about500ofthesediffere

  6. javascript - 信息堆大小 - 2

    我可以从Chrome中的performance.memory对象获取哪些信息?这些数字是什么意思?(他们是kb还是字符)我可以从这些数字中学到什么?performance.memory的示例值MemoryInfo{jsHeapSizeLimit:793000000,usedJSHeapSize:10000000,totalJSHeapSize:31200000} 最佳答案 WhatinformationcanIobtainfromtheperformance.memoryobjectinChrome?属性名称应该具有很好的描述性。W

  7. Javascript 将图像排列成一堆卡片 - 2

    我是javascript的新手,所以我确信我对它的理解有很多缺失。我正在尝试做的是创建一层图像,使其看起来像一堆卡片。看过类似的代码并尝试遵循他们的想法,但我就是无法正确定位图像。所有10张左右的图像都放在完全相同的位置。能帮忙看看为什么不定位吗?还有什么是“em”。我找不到任何关于它的文献,但假设它是像px这样的测量em??为什么在""中?functionDisplay(){varel;varleft=0;vartop=0;vari=0;varn=deck.length;varcardNode;varimg=document.createElement("IMG");img.src=

  8. 数据结构之优先级队列【堆】(Heap) - 2

    目录1.优先级队列(PriorityQueue)2.堆的概念3.堆的存储方式4.堆的创建5.用堆模拟实现优先级队列 6.PriorityQueue常用接口介绍6.1 PriorityQueue的特点6.2 PriorityQueue几种常见的构造方式7.top-k问题8.堆排序本篇主要内容总结(1)优先级队列底层是堆来实现的(2)堆的本质是完全二叉树 ,堆有大根堆和小根堆(3)大根堆:根节点最大的堆;小根堆:根节点最小的堆(4)堆的创建实现:大根堆为例大根堆创建:孩子结点和根节点比较交换,核心思想:向下调整  时间复杂度O(n)堆的插入:插入到最后一个位置,和根结点交换,核心思想:向上调整堆的

  9. javascript - 检查一堆条件的更好方法 - 2

    我是javascript的新手,但仍在接受这种语言的细微差别。我有一段代码,我必须在其中检查特定变量的一组条件。if(a=="MAIN_DOMAINNAME"||a=="DOMAIN_SERIAL"||a=="DOMAIN_REFRESH"||a=="DOMAIN_RETRY"||a=="DOMAIN_EXPIRE"||a=="DOMAIN_NEGTTL"||a=="MAIN_NS"){是否有更好的方法来执行此条件检查,例如:如果a是("DOMAIN_SERIAL","MAIN_DOMAINNAME","DOMAIN_REFRESH")之一{? 最佳答案

  10. javascript - 我如何以编程方式知道何时将超过 javascript 堆大小? - 2

    这个问题在这里已经有了答案:HowdoyoudetectmemorylimitsinJavaScript?(4个答案)关闭8年前。我正在编写一个实例化许多大型数组缓冲区的应用程序,其中一些是5MB。我想知道我什么时候会填满javascript堆,这样我就可以在我的javascript中激活一个条件来停止分配缓冲区。我发现如果超过堆大小,Chrome和Firefox的浏览器就会崩溃。W3C是否公开了用于衡量javascript堆使用情况的接口(interface)?

随机推荐