2.4.29同时面向最大和最小元素的优先队列。设计一个数据类型,支持如下操作:插入元素、删除最大元素、删除最小元素(所需时间均为对数级别),以及找到最大元素、找到最小元素(所需时间均为常数级别)。提示:用两个堆。
解:声明一个元素数组a,用来存放元素。每个元素有元素值、在大堆数组中的下标、在小堆中数组中的下标。
构建一个大堆,大堆数组元素的值是数组a的下标,数组a中最大元素值的下标保存在堆顶元素中。
构建一个小堆,小堆数组元素的值是数组a的下标,数组a中最小元素值的下标保存在堆顶元素中。
在构建完大堆后更新数组a中每个元素的 在大堆数组中的下标。这可以通过遍历大堆的每个元素,元素的值就是数组a的下标,然后将数组a这个元素的 在大堆数组中的下标设置为大堆数组的下标值。
在构建完小堆后更新数组a中每个元素的 在小堆数组中的下标。这可以通过遍历小堆的每个元素,元素的值就是数组a的下标,然后将数组a这个元素的 在小堆数组中的下标设置为小堆数组的下标值。
1)插入元素
先在数组a中的最后增加一个元素,然后将这个元素插入大堆、小堆,在插入过程中交换过位置的元素都需要更新数
先在数组a中的最后增加一个元素,然后将这个元素插入大堆、小堆,在插入过程中交换过位置的元素都需要更新数
组a中 在大堆数组中的下标、在小堆数组中的下标。
2)删除最大元素、删除最小元素
与插入元素时相同都需要调整元素的 在大堆数组中的下标 和 在小堆数组中的下标。
与插入元素时相同都需要调整元素的 在大堆数组中的下标 和 在小堆数组中的下标。
另:如果用数组a来保存元素,删除后容易留下空位,造成存储浪费。
也可以不用数组a保存元素,直接让大小堆元素指向这些元素。
也可以不用数组a保存元素,直接让大小堆元素指向这些元素。