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 的位置

下面,我们看一个例子:

首先,下面这张表是数组原始的样子:

0 1 2 3 4 5 6 7 8 9 10 index 1 2 3 4 5 6 7 8 9 10 data 15 17 19 13 22 16 28 30 41 62

Heapify 以后:

0 1 2 3 4 5 6 7 8 9 10 index 10 9 7 8 5 6 3 1 4 2 data 15 17 19 13 22 16 28 30 41 62

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 这个函数是可以进行优化的。

原创粉丝点击