最近学习了很多东西(深入学习操作系统中), 博客的更新也搁置了一段时间, 主要是学习占用了大量的时间 (学的越多, 也发现自己不会的越多, 就像苏格拉底说的"我只知道我一无所知");
今天主要分析一下左偏树和斜堆, 这两个数据结构是二叉堆的进化版, 一方面能够实现与二叉堆相同的功能, 代码结构也比较简单; 另一方面它们的合并操作的时间复杂度为O(logn), 而普通二叉堆实现合并操作的时间复杂度为O(n);
左偏树的性质:
--本节点的键值key小于其左右子节点键值key(与二叉堆相同);
--本节点的左子节点的距离大于等于本节点的右子节点(这意味着每个节点中除了要存储键值外, 还需要一个额外的dist存储距离);
--节点的距离是其右子节点的距离+1(这意味着, 一个节点的dist是从它出发到达最近终端节点的距离);
斜堆的性质:
--本节点的键值key小于其左右子节点键值key;
--斜堆节点不存储距离dist值, 取而代之的是在每次合并操作时都做swap处理(节省了存储空间);
核心操作: 合并操作(插入操作, 取最小操作都是基于合并操作);
左偏树(堆)merge函数具体实现:
--采用递归实现;
--每层递归中, 当roota->val > rootb->val时, 交换roota和rootb;