用链表表示的可合并最大堆

本文探讨了如何使用链表实现可合并堆,并分析了在链表已排序、未排序以及未排序且动态集合不相交三种情况下,INSERT、MAXIMUM、EXTRACT-MAX和UNION操作的时间复杂度。在已排序的情况下,INSERT和EXTRACT-MAX操作的时间复杂度为O(nlgn),MAXIMUM操作的时间复杂度为O(1);而在未排序的情况下,MAXIMUM操作的时间复杂度上升到O(n)。UNION操作在最坏情况下时间复杂度为O((n^2)lgn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关问题:(利用链表实现可合并堆) 可合并堆支持以下操作:MAKE-HEAP(创建一个空的可合并堆),INSERT,MAXIMUM,EXTRACT-MAX和UNION。说明在下列前提下如何用链表实现可合并堆。试着使各操作尽可能高效。分析每个操作按动态集合规模的运行时间。

由于对于堆操作需要查找父结点,以及左右孩子结点,所以本程序中用到了非递归非辅助栈的遍历与查找操作,它需要O(nlgn)时间,

a.链表已排序。

INSERT:尽管链表已排序。但是由于插入时,需要查找其父结点,所以运行时间也要O(nlgn)

MAXIMUM:因为已经排序,所以我们直接返回根结点即可找到最大值。

EXTRACT-MAX:删除时,涉及到了第一个结点(根结点)和最后一个结点(最小值结点),由于没有保存最后一个结点,所以又要进行查询操作,这样时间还是O(nlgn)时间,

UNION:用遍历树形链表的方法进行循环将第一颗树的结点插入到第二颗树中,那么总的运行时间为O((n^2)lgn).

b.链表未排序。

需要说明的就是MAXIMUM函数运行时间达到了O(n),因为在查询最大值前,要进行建堆操作。其他操作都一样。

c.链表未排序,且待合并的动态集合是不想交的。

不相交,就是没有相同元素,省略了对相同数据进行可合并堆的各种操作。

以下代码展示了链表未排序时的可合并堆的各项操作。

#include <iostream>
using namespace std;
#define LEN sizeof(struct Tree)
int heap_size1=0, heap_size2=0;;
#define Print 0
#define search 1
struct Tree*head1=NULL;
struct Tree*head2=NULL;
struct Tree
{
    int key;
    int num;
    struct Tree*lchild;
    struct Tree*rchild;
    struct Tree*parent;
};
void Make_heap(struct Tree*&p)
{
    p=NULL;
}
int PARENT(int i)  
{  
    return i/2;  
}
int LEFT(int i)  
{  
    return 2*i;  
}  
int RIGHT(int i)  
{  
    return 2*i+1;  
}   
void create(struct Tree **p,int flag)
{
	static struct Tree *head=NULL;
	static struct Tree *p1
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值