Algs4-2.4.29-同时面向最大和最小元素的优先队列

2.4.29同时面向最大和最小元素的优先队列。设计一个数据类型,支持如下操作:插入元素、删除最大元素、删除最小元素(所需时间均为对数级别),以及找到最大元素、找到最小元素(所需时间均为常数级别)。提示:用两个堆。

 
解:声明一个元素数组a,用来存放元素。每个元素有元素值、在大堆数组中的下标、在小堆中数组中的下标。
 
构建一个大堆,大堆数组元素的值是数组a的下标,数组a中最大元素值的下标保存在堆顶元素中。
 
构建一个小堆,小堆数组元素的值是数组a的下标,数组a中最小元素值的下标保存在堆顶元素中。
 
在构建完大堆后更新数组a中每个元素的 在大堆数组中的下标。这可以通过遍历大堆的每个元素,元素的值就是数组a的下标,然后将数组a这个元素的 在大堆数组中的下标设置为大堆数组的下标值。
 
在构建完小堆后更新数组a中每个元素的 在小堆数组中的下标。这可以通过遍历小堆的每个元素,元素的值就是数组a的下标,然后将数组a这个元素的 在小堆数组中的下标设置为小堆数组的下标值。
 
1)插入元素
  先在数组a中的最后增加一个元素,然后将这个元素插入大堆、小堆,在插入过程中交换过位置的元素都需要更新数
 
组a中 在大堆数组中的下标、在小堆数组中的下标。
 
2)删除最大元素、删除最小元素
  与插入元素时相同都需要调整元素的 在大堆数组中的下标 和 在小堆数组中的下标。
 
另:如果用数组a来保存元素,删除后容易留下空位,造成存储浪费。
也可以不用数组a保存元素,直接让大小堆元素指向这些元素。
posted @ 2019-10-25 13:38  修电脑的龙生  阅读(380)  评论(0编辑  收藏  举报