排序和查询使用不同的容器,c++, STL
Sorting and querying using different containers, C++, STL
有一次我在面试时被问到这个问题,我认为面试官弄错了。
问题是:
假设有一个数据类型,其操作符为<我们有两个选择。>
-
将所有这些数据添加到std::set中,然后使用std::find和std::insert查询和添加元素。在这种情况下,前N个元素的插入是N*logN,每次查询和插入都是logN。
-
第二种是将所有这些值插入到std::list中,然后对其排序,然后在query和insert之后使用std::binary_search和insert。这里的插入如果N +排序N*logN(根据采访者)和每个binary_search和插入logN。
我已经回答了第一种情况更快,但是面试官告诉我,由于std::set是通过红黑树实现的,所以再平衡是一个昂贵的操作,因此std::list的情况更快。但是我注意到std::list的sort不能是N*logN,因为它没有随机访问迭代器。
请帮助我最终理解哪种情况更好,为什么?
可以使用merge sort
在O(n*log(n))
中对列表进行排序。然而,一个更大的问题是,由于缺乏随机访问,二分查找不能精确地应用于列表。
仍然请注意,列表可以以许多不同的方式实现,包括使用数组作为支持,在这种情况下,您也将有随机访问(这不是std::list
的情况,虽然)。
该问题的最佳解决方案是使用std::vector
并对其执行二进制搜索(在对其进行排序之后)。这样你就知道有一个随机访问操作符。
编辑:因为它似乎值在您的容器可以交互地改变,预排序,然后执行二进制搜索不是一个选项。这是因为在插入新值之后,必须再次对元素进行排序。更复杂的列表版本,如跳跃列表支持这一点,但除此之外,set应该快得多。
是的,面试官错了。
是的,你应该继续面试,直到你找到一家更好的公司:-)
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 在C++中迭代 STL 集时出现奇怪的问题<CStudent>
- 如何在 C++17 STL 并行算法中处理调度?
- 在学习数据结构之前对STL有一个了解是好的吗?
- C++ STL 排序会检查 NaN 吗?