4-8 索引堆(最大索引堆)
来源:互联网 发布:windows官方网 编辑:程序博客网 时间:2024/06/06 20:58
最大索引堆
change 操作:
首先我们来解释一下 change 操作,在实际应用中,我们除了有 insert 和 extract 这两个操作以外,我们数组中的元素很可能是动态变化的,在变化的过程中,如何保持最大堆的性质,这就是我们要讨论的问题。
最大索引堆的特性
1、最大索引堆的内部维护了一个索引数组,这个索引数组构成了一个最大堆;
2、使用最大索引堆的时候,可以很好地支持 change 这个操作,即我们想改改数组中的第几个元素的值,此时,根据最大索引堆的定义,内部的索引数组就会发生重组,来保证这个索引数组是一个最大堆;
3、最大索引堆中的 data 数组是由用户定义的,用户的 insert、extract、和 change 操作只会很单纯地插入、取出和修改 data 中的元素,程序员来维护内部的索引数据,使之构成最大堆 ;
4、最大索引堆的一个重要应用就是动态地维护了最大堆的定义。
最大索引堆是一个相对于普通堆更加高级的数据结构。普通的堆有什么问题呢?将数据构建成一个堆的过程叫 Heapify。Heapify 的前后元素的位置发生改变:局限性:1、如果元素是非常复杂的结构(例如是字符串),交换这件事情会产生大量的性能消耗。2、元素位置发生改变以后,很难索引到它。
以最大索引堆为例。
(1)构建堆的过程只是索引数组的位置发生了交换。
(2)如果想对堆中的数据进行一些操作,我们可以非常容易地索引到元素。
(3)进行比较的时候比较的是 data 的数据,但是在进行交换的时候,交换的是 index 的位置。
下面,我们看一个例子:
首先,下面这张表是数组原始的样子:
Heapify 以后:
index[1] = 10 ,表示 data[10] 在堆中的位置是 1 i,抽象成概念就是:
indexes[x] = i ,表示索引 i 的元素在堆中的位置是 x
改造最大堆的结构,构建一个索引堆。
(1)index[] 声明,并且在构造函数中开辟空间。
(2)插入:我们插入一个元素的时候,同时要指定这个元素的索引i。
传入的 i 对用户而言是从 0 开始
(3)删除
支持的特殊操作:
(4)返回最大元素的索引
extractMaxIndex()
(5)给定索引获得 Item
(6)change
为了维持堆的性质:尝试向上挪一下 shift up,向下挪一下 shift down。
找到一个 j 满足:indexes[j] = i,j 表示 data[i] 在堆中的位置,之后 shift up(j),然后 shift down(j)
change 这个函数是可以进行优化的。
- 4-8 索引堆(最大索引堆)
- 4-9 索引堆的优化(索引最大堆的表示)
- 索引堆
- 索引堆
- 索引堆
- java实现最大索引堆(最大堆的优化版)
- 最大堆、索引堆、二叉搜索树的JavaScript实现
- Index Heap(索引堆)
- 索引堆排序
- 堆排序(最大堆)
- 堆排序(最大堆)
- 堆排序(最大堆)
- (表-上)堆表 索引组织表 聚簇表
- 基于哈希表的索引堆变形(Hackerrank: QHEAP1)
- 堆表和索引组织表区别
- 堆表和索引组织表区别
- 堆表和索引组织表区别
- 堆表和索引组织表区别
- 手写体数字识别(一)知识准备
- 《算法与数据结构》学习笔记 4-7 排序算法总结
- find查找子串位置
- 整理docker及Hadoop脚本(一)
- jQuery加载方法以及ajax的使用
- 4-8 索引堆(最大索引堆)
- Linux下学习MySQL命令的笔记
- 1018. 锤子剪刀布 (20)--PAT乙级
- java基础复习1(变量 数据类型 控制语句)
- do{...}while(0)的意义和用法
- 【总结】Spring原理剖析
- 4-9 索引堆的优化(索引最大堆的表示)
- Microsoft Visual Studio 2015已停止工作
- 缓存问题