索引优先队列

索引优先队列实现思想:
步骤一:
存储数据时,给每个数据元素关联一个整数,eg:insert(int k,T t) ,k是t关联的整数,通过k快速获取到队列t元素
用一个T[]items数组来保存元素,在intsert(int k,T t)完成插入时,把k看作item数组的索引,把t元素放到item数组索引k处,根据k获取元素t时直接拿到item[k]
存放:[“S”,“O”,“R”,“T”,“E”,“X”,“A”,“M”,“P”,“L”,“E”]
T[]items:用来保存数据元素:
0 1 2 3 4 5 6 7 8 9 10 11
S O R T E X A M P L E

步骤二:
item数组中元素随机无序,增加一个数组int[]pq,来保存每个元素在items数组中索引,pq数据需要堆有序,即pq[1]对应的数据元素items[pq[1]]要小于pq[2]和pq[3]对应的元素,items[pq[2]]和items[pq[3]]
T[]items:
0 1 2 3 4 5 6 7 8 9 10 11
S O R T E X A M P L E

int[]pq:存放元素在items里面的索引(堆调整后的顺序)
0 1 2 3 4 5 6 7 8 9 10 11
… 6 10 4 9 7 1 8 2 0 3 5

堆有序:items[pq[i]]小于等于items[pq[2i]]和items[pq[2i+1]]

步骤三:
通过步骤二的分析,我们发现,其实我们通过上浮和下沉做堆调整的时候,其实调整的是pq数组。如果需要对items中的元素进行修改,比如items[0]=“H”,需要对pq中的数据做堆调整,而且是调整pq[9]中元素的位置,但现在就会遇到一个问题,我们修改的是items数组中0索引处的值,如何快速的知道需要挑中pq[9]中的元素位置?
最直观想法就是遍历pq数组,拿出每一个元素和0做比较,如果当前元素是0,那么调整该索引处元素即可,但是效率很低。
另外增加一个数组,int[]qp,用来存储pq的逆序;例如:
在pq数组中:pq[1]=6;
那么qp数组中,把6作为索引,1作为值,结果是:qp[6]=1;
T[]items:
0 1 2 3 4 5 6 7 8 9 10 11
S O R T E X A M P L E

int[]pq:存放元素在items里面的索引(堆调整后的顺序)
0 1 2 3 4 5 6 7 8 9 10 11
… 6 10 4 9 7 1 8 2 0 3 5

int[]qp存储pq数组的逆序:
0 1 2 3 4 5 6 7 8 9 10 11
9 6 8 10 3 11 1 5 7 4 2 …

当有了pq数组后,如果修改items[0]=“H”,那么就可以先通过索引0,在qp数组中找到qp的索引:qp[0]=9,那么直接调整pq[9]即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CZ37

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值