堆(Heap)AS3版

堆Heap块Chunk 堆&块0x01 基础知识——Chunk0x02 基础知识——Heap0x03 堆的基本操作0x04 堆相关的函数1>malloc2>free0x05 堆溢出0x06 堆溢出中比较重要的几个步骤·寻找堆分配函数realloc malloc calloc·寻找危险函数·确定填充长度0x07 Fast bin0x08 Unsort bin注意点Fastbin attack--blin... 阅读详情
当应用优先级队列或者进行堆排序时,一般利用堆来实现。堆是一个完全二叉树,并满足如下条件:
1、根结点若有子树,则子树一定也是堆。
2、根结点一定大于(或小于)子结点。
因为要求堆必须是完全二叉树,所以使用数组实现堆要比结点实现更有效率。
利用数组实现,则对于长为N的堆中的元素从0到N-1排列,有:
1、i 的父结点:Parent(i)=(i+1)/2-1
2、i 的左叶子:Left(i)=(i+1)*2-1
3、i 的右叶子:Right(i)=(i+1)*2
堆的插入和删除很有意思。在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义了以下几种操作,在堆中进行了上述操作后,堆的特殊属性可能发生变化。例如,当在堆尾插入一个数据,它可能大于它的父节点,因而需要进行一系列的置换操作,调整它的位置,从而保持堆的特有属性。和此相关的操作包括:
筛选上移(sift_up):给定某个数据后,将其上移到相应的位置,从而保证其值不大于父节点。
筛选下移(sift_down):给定某个数据后,将其下移到相应的位置,从而保证其值不大于父节点。
堆主要应用在排序算法中。


package kono.utils
{
//堆,基于数组, Heap, built on a array
public class Heap
{
private var _heap:Array;
private var _top:uint;
private var capacity:uint;
private var compare:Function;

public function Heap(size:uint, compareTo:Function = null)
{
_heap = new Array(capacity = size);
_top = 0;
if(compareTo == null)
{
compare = function (a:Number, b:Number):int
{
return int(a-b);
}
}
else
{
compare = compareTo;
}
}

//得到堆的大小, get the heap????s capacity
public function get size():uint
{
return capacity;
}

//堆首, the first data in the heap
public function peek():*
{
return _heap[0];
}

//添加新数据到堆(sift_up), add a new data to heap
public function push(data:*):void
{
_heap[_top] = data;
var parents:uint = (_top - 1) >> 1;
while(_top > 0 && parents >= 0)
{
if(compare(_heap[_top], _heap[parents]) > 0)
{
var temp:* = _heap[parents];
_heap[parents] = _heap[_top];
_heap[_top] = temp;
if(parents > 0)
parents = (parents - 1) >> 1;
}
else
break;
}
_top ++;
}

//删除堆首元素(sift_down), remove the first data in the heap
public function pop():void
{
if(_top > 0)
{
_heap[0] = _heap[_top -1];
var cursor:uint = 0;
var childs:uint = (_top << 1) + 1;
childs = _heap[childs] > _heap[childs + 1] ? childs : childs + 1;
while(childs < _top)
{
if(compare(_heap[cursor], _heap[childs]) < 0)
{
var temp:* = _heap[cursor];
_heap[cursor] = _heap[childs];
_heap[childs] = temp;
cursor = childs;
}
else
break;
}
_top--;
}
delete _heap[_top];
}

//打印堆结构, print the frame of the heap
public function print():void
{
var space:String = " ";
for(var i:uint = 0; i < _heap.length; i++)
{
space += " ";
trace(space + _heap[i]);
}
}

//清空堆, remove all the data of the heap
public function clear():void
{
_heap = new Array(capacity);
_top = 0;
}

//判断给定数据是否包含在堆中, check if the given target exit in the heap
public function contains(target:*):Boolean
{
for(var i:uint = 0; i < _heap.length; i++)
{
if(_heap[i] == target)
{
return true;
}
}
return false;
}

//转换堆到数组, convert the heap to a array
public function toArray():Array
{
return _heap;
}

//返回堆的信息, return a string respreaenting the current heap
public function toString():String
{
return "[Heap, size=" + capacity + "]";
}
}
}

本文转自
http://www.moorwind.com/read.php?42
heap(max-heap最大堆、min-heap最小堆) 参考: 《STL源码剖析》   heap概述 heap并不归属于STL容器组件,它是个幕后英雄,扮演priority_queue的助手(底层实现)。所谓binary heap就是一种完全二叉树,也就是说,整颗binary tree除了最底层的叶子节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。 完全二叉树整棵树内没有任何节点漏洞,这带来一个好处:我们可以利用array来存储所... 阅读详情

相关推荐

Leaflet 加载天地图完整配置指南:从插件修改到无限缩放(附源码)

本文详细介绍了Leaflet与天地图深度集成的完整配置指南,包括插件修改、无限缩放实现及源码示例。通过解析天地图服务的WMTS协议、双投影支持和密钥机制,帮助开发者突破缩放级别限制,优化地图应用性能,适用于Web地图开发和高精度GIS系统。

weixin_27180827的博客 441

算法 之 堆 - Sift-up和Sift-down

1. Sift-up 假定对于某个i&gt;1,H[i]变成了键值大于它父节点键值的元素,这样就违反了堆的特性。我们需要使用Sift-up运算把新的数据项移到在二叉树中适合它的位置上。 Sift-up的运算沿着从H[i]到根节点的唯一一条路径,把H[i]移到适合它的位置上。在沿着路径的每一步上,都将H[i]键值和它父节点的键值H[⌊i/2⌋]相比较。   过程  Sift-up 输入  ...

我不是标题党 1917

Vue 10分钟入门VR全景显示 基于photo-sphere-viewer

文章目录前言一、引入photo-sphere-viewer?二、使用步骤1.引入库2.声明容器3.内容加载4.全部代码总结 前言 由于工作的需求,要实现全景图片的展示与预览,本来以为会是一个很难的内容,没想到使用现成的组件photo-sphere-viewer就可以轻松实现,上手只需要10分钟! 一、引入photo-sphere-viewer? 可以直接通过npm进行引入 npm install photo-sphere-viewer 二、使用步骤 1.引入库 photo-sphere-viewer

YIGE_MO的博客 5866

Converting HEAP to MyISAM in SHOW PROCESSLIST

 http://www.mysqlab.net/knowledge/kb/detail/topic/myisam/id/6149 Discussion The state "converting HEAP to MyISAM" happens when a query that needs a temporary table is converting from an in-memory

huyangg的专栏 3180

清华电子系保研面试全记录:五轮硬核考核+工程硕博专项解析(附真题)

本文详细解析了清华大学电子工程系保研面试的完整流程,重点剖析了其标志性的五轮专业面试(涵盖电路、电磁场、信号系统、计算机与AI)和综合组群面,并深入解读了工程硕博改革专项的考核要点与备战策略。文章提供了各专业组的真题示例与应对方法,旨在帮助电子信息相关专业学子系统准备,从容应对这场高强度的知识与综合素质挑战。

u0v1w2x3的博客 588

【Solidworks学习使用(1)__2022版本保姆级安装方法】

Solidworks 2020安装

coder-kimbell的博客 6257

堆 之 Sift-up和Sift-down

  1.sift-up 假定对于某个i&gt;1,H[i]变成了键值大于它父节点键值的元素,这样就违反了堆的特性。我们需要使用Sift-up运算把新的数据项移到在二叉树中适合它的位置上。 Sift-up的运算沿着从H[i]到根节点的唯一一条路径,把H[i]移到适合它的位置上。在沿着路径的每一步上,都将H[i]键值和它父节点的键值H[⌊i/2⌋]相比较。 常用于:插入操作 代码: ...

Kaka_chake的博客 2704

瑞萨RA6M5驱动ST7735屏幕避坑指南:从软件SPI到显示汉字与图形的完整流程

本文详细介绍了瑞萨RA6M5单片机驱动ST7735屏幕的完整流程,涵盖硬件连接、软件SPI控制、汉字显示及图形绘制优化等关键步骤。通过避坑指南和实用代码示例,帮助开发者解决屏幕初始化、时序控制、字库移植等常见问题,实现高效稳定的显示效果。

weixin_28705087的博客 275

AS : Java heap space

出现这个问题原因:根据异常说明OOM:javaheapspace可知,就是打包时java的堆溢出了;所以,将堆的最大值调大一些,就不容易溢出了 在项目级别的gradle.properties里面添加 org.gradle.jvmargs=-Xmx4096M 即可 ...

yeliang23的博客 836

OpenClaw(Clawdbot/Moltbot)如何正确的配置浏览器,实现对浏览器的自动化操作功能(浏览器状态为running:false怎么办)

OpenClaw(Clawdbot/Moltbot)浏览器自动化功能无效?🤖 本文详细介绍如何解决这个问题🔧,让你的OpenClaw(Clawdbot/Moltbot)真正具备"睁眼看世界"的能力,支持网页搜索、点击操作和截图等功能 ✅

XiaoqiangClub的博客 8109

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

Robot_PLC_HMI_Automation 6727

【AS环境】关于AS运行卡顿,提示内存不足,修改Xmx等参数

1、 电脑8G内存,理论上运行AndroidStudio无压力,但是最近经常出现‘未响应’情况,写代码卡的心焦2、 今天卡着卡着,就出现一个对话框,‘There is no enough memory to run this operation…..’,下面还有一些参数的修改,什么‘Xmx’等等3、 大概是分配给AS的内存不够用吧4、 网上查到解决办法,是由于 AndroidStudio 1.2.1

Vam的专栏 5264

深度解析与实战:长短时记忆网络(LSTM)在股票走势预测中的应用(基于Python + PyTorch)

本文全面探讨了LSTM在股票价格预测中的应用,从理论基础到实践操作。文章首先强调了股票市场预测的重要性,并介绍了LSTM网络结构及其在处理时间序列数据中的优势。接着,详细说明了数据预处理的关键步骤,包括数据收集、清洗、特征选择和归一化。文章还讨论了LSTM模型的构建、训练和评估,并提供了Python及PyTorch的实操案例。最后,总结了LSTM在股票预测的成果,并提出了未来研究的方向,如模型优化和特征工程,旨在帮助读者掌握LSTM在股票价格预测中的应用,并探索提升模型性能的方法。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2105

c++重拾 STL之heap(堆)

头文件#include <algorithm> 1、heap的四个函数: make_heap:建立堆 push_heap:在堆中添加数据 pop_heap:在堆中删除数据 sort_heap:堆排序 建立堆 make_heap(_First, _Last, _Comp) _First, _Last:可以随机访问的迭代器/ 指针 _Comp: 比较函数(仿函数) 默认是建立最大堆的。...

元气满满晨 3万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STL 堆heap的用法

STL中并没有把heap作为一种容器组件,heap的实现亦需要更低一层的容器组件(诸如list,array,vector)作为其底层机制。Heap是一个类属算法,包含在algorithm头文件中。虽然STL中关于heap默认调整成的是大顶堆,但却可以让用户利用自定义的compare_fuction函数实现大顶堆或小顶堆。heap的低层机制vector本身就是一个类模板,heap基于vector便实

梧桐下的四叶草 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c++ heap (堆)

C++ STL中提供了不少和排序相关的算法,包括堆排序(heap_sort)、排序(sort)、稳定排序(stable_sort)、局部排序(partial_sort),时间复杂度均为O(nlogn)。其中,对于堆排序,也提供了不少函数,像入堆push_heap、创建堆make_heap、出堆pop_heap,是否为堆is_heap等。首先要明确数据结构上堆的概念。对于一个迭代器区间上的元素,不管实际的数据结构如何,都可以逻辑上排成一个完全二叉树,如果树的每个父节点都不小于左右两个子节点,那么区间元...

JIAN_ZANG1125的博客 4358

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

堆(Heap)、栈(Stack)

前言 堆(Heap)、栈(Stack)在不同的场景下,代表不同的含义。 (1)程序内存布局场景下,堆(Heap)、栈(Stack)代表两种内存管理方式; (2)数据结构场景下,堆(Heap)、栈(Stack)表示两种常用的数据结构; 一、程序内存中的堆(Heap)、栈(Stack) Code、Data、BSS——在编译时确定;保存基本代码和数据的区域。 BSS:保存未初始化的数据; Data:保存初始化数据 1、...

1万+

C++堆(push_heap;make_heap;pop_heap;sort_heap;is_heap;is_heap_until)

一、push_heap 头文件algorithm default (1) template &amp;lt;class RandomAccessIterator&amp;gt; void push_heap (RandomAccessIterator first, RandomAccessIterator last); custom (2) template &amp;lt;class RandomAccessI...

baidu_34884208的博客 3204

C++ heap堆的使用

堆的基本操作 make_heap() == 默认最大堆,最小堆加参数greater< int >() == pop_heap() == 先pop,然后在容器中删除 == push_heap() == 先在容器中加入,再push == sort_heap() #include<iostream> #include<vector> #include<alg...

Freemanzxp 2967

C++ make_heap等堆函数的使用

二叉堆算法

sinat_31608641的博客 3455

堆(heap)系列_0x04:堆的内部结构(_HEAP=_HEAP_SEGMENT+_HEAP_ENTRY)

_HEAP=_HEAP_SEGMENT+_HEAP_ENTRY,这3种数据结构使用WinDbg进行分析

可乐松子的博客 1689

STL heap堆

STL 中与heap 有关的操作有 如下几个 : make_heap(), pop_heap(), push_heap(), sort_heap(), is_heap; is_heap() : 原型如下 : 1. bool is_heap(iterator start, iterator end); ->判断迭代器[start, end] 区间类的元素是否

chlele0105的专栏 3386

C++ 标准库中的堆(heap)

堆就是用数组实现的二叉树,堆总是一棵完全二叉树。在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。区别于二叉搜索树,二叉树左子节点必须比父节点小且右子节点必须必比父节点大(顺序为中序遍历)。 1.堆的生成:make_heap() 默认为大顶堆 less<int>();若生成小顶堆,参数为greater<int>()。 #include<iostream> using namespace std; #include&lt

qq_33970986的博客 4742
上一篇: 推荐一本值得收藏的PHP书籍
下一篇: 二叉查找树(BST)AS3版
microrain
博客等级 码龄25年 1128粉丝 194原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值