hello-algo/docs/chapter_heap/summary.md

22 lines
1.4 KiB
Markdown
Raw Normal View History

2023-02-26 22:45:39 +08:00
---
comments: true
---
2023-08-19 22:07:27 +08:00
# 8.4   小结
2023-02-26 22:45:39 +08:00
2023-08-29 20:57:15 +08:00
### 1.   重点回顾
2023-04-10 03:12:02 +08:00
- 堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。
- 优先队列的定义是具有出队优先级的队列,通常使用堆来实现。
2023-08-27 23:40:56 +08:00
- 堆的常用操作及其对应的时间复杂度包括:元素入堆 $O(\log n)$、堆顶元素出堆 $O(\log n)$ 和访问堆顶元素 $O(1)$ 等。
2023-04-10 03:12:02 +08:00
- 完全二叉树非常适合用数组表示,因此我们通常使用数组来存储堆。
- 堆化操作用于维护堆的性质,在入堆和出堆操作中都会用到。
- 输入 $n$ 个元素并建堆的时间复杂度可以优化至 $O(n)$ ,非常高效。
2023-12-28 17:18:37 +08:00
- Top-k 是一个经典算法问题,可以使用堆数据结构高效解决,时间复杂度为 $O(n \log k)$ 。
2023-06-25 21:11:35 +08:00
2023-08-29 20:57:15 +08:00
### 2.   Q & A
2023-06-25 21:11:35 +08:00
2024-01-08 03:06:12 +08:00
**Q**:数据结构的“堆”与内存管理的“堆”是同一个概念吗?
2023-06-25 21:11:35 +08:00
2024-01-08 03:06:12 +08:00
两者不是同一个概念,只是碰巧都叫“堆”。计算机系统内存中的堆是动态内存分配的一部分,程序在运行时可以使用它来存储数据。程序可以请求一定量的堆内存,用于存储如对象和数组等复杂结构。当这些数据不再需要时,程序需要释放这些内存,以防止内存泄漏。相较于栈内存,堆内存的管理和使用需要更谨慎,使用不当可能会导致内存泄漏和野指针等问题。