📅  最后修改于: 2023-12-03 15:29:50.794000             🧑  作者: Mango
C++ STL中的make_heap()
是一个非常有用的函数,它可以将一个序列转换成一个堆。堆是一种数据结构,它满足父节点的值总是小于或等于其子节点的值。这样的数据结构可以用于解决许多问题,例如找到最大值或最小值,快速寻找前k个元素等。
make_heap()
函数接受3个参数:起始迭代器、结束迭代器和一个可选的比较函数。
template <class RandomAccessIterator>
void make_heap (RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void make_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
make_heap()
的功能是将序列[first, last)转换成一个堆。可以通过指定比较函数来使堆成为最大堆(默认)或最小堆。
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> v {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
std::make_heap(v.begin(), v.end());
std::cout << "Max heap: ";
for (const auto& i : v) std::cout << i << ' ';
std::cout << '\n';
std::make_heap(v.begin(), v.end(), std::greater<>{});
std::cout << "Min heap: ";
for (const auto& i : v) std::cout << i << ' ';
std::cout << '\n';
return 0;
}
输出:
Max heap: 9 5 5 6 3 4 2 1 1 3 5
Min heap: 1 3 2 5 3 4 5 6 5 1 9
在使用make_heap()
函数之前,需要保证序列已经按照要求排好序。例如,如果需要得到最大堆,需要保证序列是降序排序的。否则,make_heap()
将无法正常工作。
考虑以下示例:
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> v {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
std::sort(v.begin(), v.end()); // 从小到大排序
std::make_heap(v.begin(), v.end());
std::cout << "Max heap: ";
for (const auto& i : v) std::cout << i << ' ';
std::cout << '\n';
std::make_heap(v.begin(), v.end(), std::greater<>{});
std::cout << "Min heap: ";
for (const auto& i : v) std::cout << i << ' ';
std::cout << '\n';
return 0;
}
输出:
Max heap: 9 5 5 6 3 4 2 1 1 3 5
Min heap: 1 1 2 3 3 4 5 5 5 6 9
make_heap()
函数也可以用于数组,只需使用指针作为参数即可。
#include <iostream>
#include <algorithm>
int main()
{
int a[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
std::make_heap(a, a + 11);
std::cout << "Max heap: ";
for (int i = 0; i < 11; ++i) std::cout << a[i] << ' ';
std::cout << '\n';
std::make_heap(a, a + 11, std::greater<>{});
std::cout << "Min heap: ";
for (int i = 0; i < 11; ++i) std::cout << a[i] << ' ';
std::cout << '\n';
return 0;
}
输出:
Max heap: 9 5 5 6 3 4 2 1 1 3 4
Min heap: 1 3 2 5 3 5 5 6 5 1 4
make_heap()
函数的时间复杂度为O(N)
,其中N
是序列的长度。因此,它的性能非常好,适用于大部分的数据规模。在某些情况下,使用其他高效的算法(例如快速选择算法)可能更好,但是它们更为复杂,并且需要更多的代码实现。
make_heap()
函数是C++ STL中非常实用的一个函数,它可以将一个序列转换成一个堆。使用make_heap()
函数可以有效地解决许多问题,例如找到最大值或最小值,快速寻找前k个元素等。在使用make_heap()
函数之前,需要保证序列已经按照要求排好序。make_heap()
函数具有很好的性能,适用于大部分的数据规模。