|
NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
|
堆算法的实现 更多...
函数 | |
| template<typename Iterator, typename Compare> | |
| NEFORCE_CONSTEXPR20 Iterator | is_heap_until (Iterator first, Iterator last, Compare comp) |
| 查找堆中破坏堆性质的首个元素 | |
| template<typename Iterator> | |
| NEFORCE_CONSTEXPR20 Iterator | is_heap_until (Iterator first, Iterator last) |
| 查找堆中破坏堆性质的首个元素 | |
| template<typename Iterator, typename Compare> | |
| NEFORCE_CONSTEXPR20 bool | is_heap (Iterator first, Iterator last, Compare comp) |
| 检查范围是否为有效堆 | |
| template<typename Iterator> | |
| NEFORCE_CONSTEXPR20 bool | is_heap (Iterator first, Iterator last) |
| 检查范围是否为有效堆 | |
| template<typename Iterator, typename Compare> | |
| NEFORCE_CONSTEXPR20 void | push_heap (Iterator first, Iterator last, Compare comp) |
| 向堆中插入元素 | |
| template<typename Iterator> | |
| NEFORCE_CONSTEXPR20 void | push_heap (Iterator first, Iterator last) |
| 向堆中插入元素 | |
| template<typename Iterator, typename T, typename Compare> | |
| NEFORCE_CONSTEXPR20 void | adjust_heap (Iterator first, iter_difference_t< Iterator > hole_index, iter_difference_t< Iterator > len, T value, Compare comp) |
| 堆调整辅助函数 | |
| template<typename Iterator, typename T> | |
| NEFORCE_CONSTEXPR20 void | adjust_heap (Iterator first, iter_difference_t< Iterator > hole_index, iter_difference_t< Iterator > len, T value) |
| 堆调整辅助函数 | |
| template<typename Iterator, typename Compare> | |
| NEFORCE_CONSTEXPR20 void | pop_heap (Iterator first, Iterator last, Compare comp) |
| 删除堆顶元素 | |
| template<typename Iterator> | |
| NEFORCE_CONSTEXPR20 void | pop_heap (Iterator first, Iterator last) |
| 删除堆顶元素 | |
| template<typename Iterator, typename Compare> | |
| NEFORCE_CONSTEXPR20 void | sort_heap (Iterator first, Iterator last, Compare comp) |
| 将堆转换为有序序列 | |
| template<typename Iterator> | |
| NEFORCE_CONSTEXPR20 void | sort_heap (Iterator first, Iterator last) |
| 将堆转换为有序序列 | |
| template<typename Iterator, typename Compare> | |
| NEFORCE_CONSTEXPR20 void | make_heap (Iterator first, Iterator last, Compare comp) |
| 创建堆 | |
| template<typename Iterator> | |
| NEFORCE_CONSTEXPR20 void | make_heap (Iterator first, Iterator last) |
| 创建堆 | |
堆算法的实现
堆是一种满足堆性质的完全二叉树,常用于实现优先队列和堆排序。
本实现严格遵循以下数据结构相关标准规范:
算法复杂度标准参考:
相关数据结构与算法文献:
根据 C++ 标准,堆是满足以下性质的范围 [first, last):
| 堆类型 | 比较函数要求 | 性质描述 |
|---|---|---|
| 最大堆 | comp(a, b) 返回 true 表示 a < b | 父节点不小于子节点 |
| 最小堆 | comp(a, b) 返回 true 表示 a > b | 父节点不大于子节点 |
**数学表示**:
**堆性质公式**(最大堆):
根据 ISO/IEC 14882:2020 §25.8,各堆操作的时间复杂度如下:
| 操作 | 函数 | 时间复杂度 | 比较次数上限 |
|---|---|---|---|
| 创建堆 | make_heap | O(n) | 最多 3n 次比较 |
| 插入元素 | push_heap | O(log n) | 最多 log(n) 次比较 |
| 删除堆顶 | pop_heap | O(log n) | 最多 2×log(n) 次比较 |
| 堆排序 | sort_heap | O(n log n) | 最多 n×log(n) 次比较 |
| 验证堆 | is_heap | O(n) | 最多 n 次比较 |
| 查找违规元素 | is_heap_until | O(n) | 最多 n 次比较 |
其中 n = last - first。
本实现采用 Floyd 的堆调整算法(Algorithm 245),其核心思想是:
相比传统方法,Floyd 算法减少了每次迭代中的元素交换次数, 将 push_heap 操作的比较次数从最多 2×log(n) 优化为最多 log(n) + 1。
| 特性 | 规范参数 |
|---|---|
| 堆类型 | 二叉堆(完全二叉树) |
| 索引基 | 0-based(C 风格数组索引) |
| 迭代器要求 | 随机访问迭代器(RandomAccessIterator) |
| 比较器要求 | 严格弱序(Strict Weak Ordering) |
| 稳定性 | 不稳定(不保证相等元素的相对顺序) |
| 内存使用 | 原地操作(O(1) 额外空间) |
根据 C++ 标准 §25.7,比较函数 comp 必须满足严格弱序(Strict Weak Ordering):
| NEFORCE_CONSTEXPR20 void adjust_heap | ( | Iterator | first, |
| iter_difference_t< Iterator > | hole_index, | ||
| iter_difference_t< Iterator > | len, | ||
| T | value, | ||
| Compare | comp ) |
堆调整辅助函数
| Iterator | 随机访问迭代器类型 |
| T | 元素值类型 |
| Compare | 比较函数类型 |
| first | 堆起始迭代器 |
| hole_index | 空洞位置索引 |
| len | 堆长度 |
| value | 要调整的值 |
| comp | 比较函数对象 |
在指定位置向下调整堆,然后在调整后的位置向上调整。 用于删除堆顶元素后的堆调整。
被这些函数引用 adjust_heap(), make_heap() , 以及 partial_sort_copy().
| NEFORCE_CONSTEXPR20 bool is_heap | ( | Iterator | first, |
| Iterator | last ) |
检查范围是否为有效堆
| Iterator | 随机访问迭代器类型 |
| first | 范围起始迭代器 |
| last | 范围结束迭代器 |
引用了 is_heap_until().
| NEFORCE_CONSTEXPR20 bool is_heap | ( | Iterator | first, |
| Iterator | last, | ||
| Compare | comp ) |
检查范围是否为有效堆
| Iterator | 随机访问迭代器类型 |
| Compare | 比较函数类型 |
| first | 范围起始迭代器 |
| last | 范围结束迭代器 |
| comp | 比较函数对象 |
引用了 is_heap_until().
| NEFORCE_CONSTEXPR20 Iterator is_heap_until | ( | Iterator | first, |
| Iterator | last ) |
查找堆中破坏堆性质的首个元素
| Iterator | 随机访问迭代器类型 |
| first | 堆起始迭代器 |
| last | 堆结束迭代器 |
默认使用小于比较,创建最大堆。
引用了 is_heap_until().
| NEFORCE_CONSTEXPR20 Iterator is_heap_until | ( | Iterator | first, |
| Iterator | last, | ||
| Compare | comp ) |
查找堆中破坏堆性质的首个元素
| Iterator | 随机访问迭代器类型 |
| Compare | 比较函数类型 |
| first | 堆起始迭代器 |
| last | 堆结束迭代器 |
| comp | 比较函数对象 |
检查范围 [first, last) 是否满足堆性质,返回第一个破坏堆性质的元素。 堆性质:
引用了 is_invocable_v , 以及 is_ranges_rnd_iter_v.
被这些函数引用 is_heap(), is_heap() , 以及 is_heap_until().
| NEFORCE_CONSTEXPR20 void make_heap | ( | Iterator | first, |
| Iterator | last, | ||
| Compare | comp ) |
创建堆
| Iterator | 随机访问迭代器类型 |
| Compare | 比较函数类型 |
| first | 范围起始迭代器 |
| last | 范围结束迭代器 |
| comp | 比较函数对象 |
将范围 [first, last) 重新排列,使其满足堆性质。 从最后一个非叶子节点开始,向前调整每个节点。
引用了 adjust_heap().
被这些函数引用 make_heap(), partial_sort() , 以及 partial_sort_copy().
| NEFORCE_CONSTEXPR20 void pop_heap | ( | Iterator | first, |
| Iterator | last, | ||
| Compare | comp ) |
删除堆顶元素
| Iterator | 随机访问迭代器类型 |
| Compare | 比较函数类型 |
| first | 堆起始迭代器 |
| last | 堆结束迭代器 |
| comp | 比较函数对象 |
将堆的最大(或最小)元素移动到 last-1 位置, 并使范围 [first, last-1) 成为有效堆。
被这些函数引用 priority_queue< T, Sequence, Compare >::pop(), pop_heap() , 以及 sort_heap().
| NEFORCE_CONSTEXPR20 void push_heap | ( | Iterator | first, |
| Iterator | last, | ||
| Compare | comp ) |
向堆中插入元素
| Iterator | 随机访问迭代器类型 |
| Compare | 比较函数类型 |
| first | 堆起始迭代器 |
| last | 堆结束迭代器 |
| comp | 比较函数对象 |
假设范围 [first, last-1) 是有效堆,将 *(last-1) 插入堆中。 调用后范围 [first, last) 是有效堆。
被这些函数引用 priority_queue< T, Sequence, Compare >::emplace(), priority_queue< T, Sequence, Compare >::push(), priority_queue< T, Sequence, Compare >::push() , 以及 push_heap().
| NEFORCE_CONSTEXPR20 void sort_heap | ( | Iterator | first, |
| Iterator | last, | ||
| Compare | comp ) |
将堆转换为有序序列
| Iterator | 随机访问迭代器类型 |
| Compare | 比较函数类型 |
| first | 堆起始迭代器 |
| last | 堆结束迭代器 |
| comp | 比较函数对象 |
通过反复弹出堆顶元素,将堆转换为升序(或降序)序列。 操作后,范围 [first, last) 不再满足堆性质,而是已排序。
引用了 pop_heap().
被这些函数引用 partial_sort(), partial_sort_copy() , 以及 sort_heap().