排序和查询使用不同的容器,c++, STL

Sorting and querying using different containers, C++, STL

本文关键字:c++ STL 查询 排序      更新时间:2023-10-16

有一次我在面试时被问到这个问题,我认为面试官弄错了。

问题是:

假设有一个数据类型,其操作符为<我们有两个选择。>

  1. 将所有这些数据添加到std::set中,然后使用std::find和std::insert查询和添加元素。在这种情况下,前N个元素的插入是N*logN,每次查询和插入都是logN。

  2. 第二种是将所有这些值插入到std::list中,然后对其排序,然后在query和insert之后使用std::binary_search和insert。这里的插入如果N +排序N*logN(根据采访者)和每个binary_search和插入logN。

我已经回答了第一种情况更快,但是面试官告诉我,由于std::set是通过红黑树实现的,所以再平衡是一个昂贵的操作,因此std::list的情况更快。但是我注意到std::list的sort不能是N*logN,因为它没有随机访问迭代器。

请帮助我最终理解哪种情况更好,为什么?

可以使用merge sortO(n*log(n))中对列表进行排序。然而,一个更大的问题是,由于缺乏随机访问,二分查找不能精确地应用于列表。

仍然请注意,列表可以以许多不同的方式实现,包括使用数组作为支持,在这种情况下,您也将有随机访问(这不是std::list的情况,虽然)。

该问题的最佳解决方案是使用std::vector并对其执行二进制搜索(在对其进行排序之后)。这样你就知道有一个随机访问操作符。

编辑:因为它似乎值在您的容器可以交互地改变,预排序,然后执行二进制搜索不是一个选项。这是因为在插入新值之后,必须再次对元素进行排序。更复杂的列表版本,如跳跃列表支持这一点,但除此之外,set应该快得多。

是的,面试官错了。

是的,你应该继续面试,直到你找到一家更好的公司:-)