数据结构:堆与字典树的奥秘
堆作为优先队列
数组实现法是较为常见的方式,用数组实现树是很有趣的。实际上,任何类型的二叉树都能用数组来实现,例如之前提到的二叉搜索树。不过,堆是首个使用数组实现具有优势的二叉树,因为它能让我们轻松找到最后一个节点。
优先队列的主要功能是让我们能立即访问队列中优先级最高的元素。以急诊室为例,我们会优先处理病情最严重的患者。这就是为什么堆非常适合用于实现优先队列,堆能让我们直接访问优先级最高的元素,该元素总是位于根节点。每次处理完优先级最高的元素(并将其从堆中移除)后,次高优先级的元素会浮到堆顶,等待下一次处理。而且,堆在保持快速插入和删除操作的同时,这两种操作的时间复杂度均为 $O(log N)$。
与之对比,有序数组为了确保每个新元素处于正确位置,插入操作的时间复杂度为 $O(N)$,速度要慢得多。堆的弱序性其实是它的优势所在,它不需要完全有序,这使得我们能在 $O(log N)$ 的时间内插入新元素。同时,堆的有序程度足以让我们在任何时候都能访问到所需的元素,即堆中的最大值。
不同类型的树能优化不同类型的问题。二叉搜索树在保持快速搜索的同时,将插入成本降至最低;而堆则是构建优先队列的理想工具。
以下是一些关于堆的练习题:
1. 画出在给定堆中插入值 11 后的堆结构。
2. 画出删除给定堆的根节点后的堆结构。
3. 假设按 55、22、34、10、2、99、68 的顺序将这些数字插入堆中构建一个新堆。若将这些数字逐个从堆中弹出并插入到一个新数组中,这些数字在新数组中的顺序是怎样的?
字典树的魅力
你是否好奇智能手机的自动补全功能是如何工
超级会员免费看
订阅专栏 解锁全文
906

被折叠的 条评论
为什么被折叠?



