作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小堆:
std::vector<int> h;
...
std::make_heap(h.begin(), h.end(), std::greater<int>());
std::push_heap
和
std::pop_heap
,但在极少数情况下,我需要在最小堆中找到最大元素。我可以用
std::max_element
做到这一点:
std::max_element(h.begin(), h.end());
最佳答案
TL; DR 在最小堆中,最大元素位于叶节点 X中。因此,您可以将搜索限制在堆元素的大约一半,即,通过限制搜索最大元素到叶节点:
auto max_it = std::max_element(first_leaf_it, h.end());
template<typename RandomIt>
auto min_heap_max_element(RandomIt first, RandomIt last) {
auto n = last - first;
if (n < 2)
return first;
auto first_leaf_it = first + (n - 2) / 2 + 1;
return std::max_element(first_leaf_it, last);
}
auto max_it = min_heap_max_element(h.begin(), h.end());
h.end()
指向的那个元素)显然是一个叶节点,它的父元素是最后一个非叶子节点,因为如果在该叶子节点之后有一个非叶子节点,则我们假定该元素为堆的最后一个元素不是最后一个元素,这是一个矛盾。
(h.size() - 2) / 2
,因此第一个叶子节点的索引为
(h.size() - 2) / 2 + 1
。
关于c++ - 在最小堆中查找最大元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59858719/
我是一名优秀的程序员,十分优秀!