📜  C++ STL中的make_heap()(1)

📅  最后修改于: 2023-12-03 15:29:50.794000             🧑  作者: Mango

C++ STL中的make_heap()

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()函数具有很好的性能,适用于大部分的数据规模。