有效地获取C++链表中最大的3个整数(未排序)

Efficiently get largest 3 integers in C++ Linked List (unsorted)

本文关键字:整数 3个 排序 C++ 获取 链表 有效地      更新时间:2023-10-16

我听说有些std函数确实给出了数组中最大的n个整数,但链表呢?

我认为一个解决方案是有几个for循环来迭代链表,但似乎在C++库中可以有一个更简单的解决方案。

谢谢。

如果你不能使用另一种数据结构:,我会这样做

typedef std::list<int> IntList;
InstList list = <your_values>;
int top[3];
for (size_t i = 0; i < 3; i++)
    top[i] = std::numeric_limits<int>::min();
IntList::iterator it, end;
for (it = list.begin(), end = list.end(); it != end; ++it) {
    const int& value = *it;
    if (value > top[2]) {
        top[0] = top[1];
        top[1] = top[2];
        top[2] = value;
    } else if (value > top[1]) {
        top[0] = top[1];
        top[1] = value;
    } else if (value > top[0]) {
        top[0] = value;
    }
}

也许可以考虑使用priority_queue

基本思想是维护一个完全由N数字组成的排序列表、优先级队列或堆。您将列表中的第一个N值推入其中,然后对其余值进行迭代。如果您遇到的项目大于队列中的最小值(或其他值(,则删除该元素并将新元素推入。

如果您只是在寻找N=3,那么使用简单的数组可能比优先级队列或其他任何东西都要好。只需进行两次比较,就可以确定该数组中的哪个元素是最小的。你总是记得最小元素的索引,只有当你替换它时才会更新它

有趣的是,对于按升序排序的列表,这种方法的性能最差。然而,它本质上仍然是线性时间复杂性。

相关文章: