【发布时间】:2021-10-15 21:53:57
【问题描述】:
我想制作一个包含少量元素的容器,我将只检查一个元素是否是该集合的一部分。 我知道如果集合足够大,向量将不是合适的容器,因为每项研究都是最坏情况的 O(n),并且有更好的选择使用散列函数或二叉树。 但是我想知道如果我的集合中的元素很少(例如只有 5 个)并且我事先知道会发生什么,将容器实现为具有散列函数的结构是否值得? 也许如果集合不够大,必须应用散列函数带来的开销大于必须遍历 5 个元素。
例如在 C++ 中使用 std::unordered_set 而不是 std::vector。 一如既往,谢谢你
【问题讨论】:
-
如果您的数据集很小,即少于 CPU 缓存,则使用向量很难被击败。 CPU 是为进行线性遍历而构建的。此外,请避免使用
std::unordered_nnn容器。它们必须实现,它们基本上是std::vector<std::list<T>>,这不是一个很好的数据结构。 -
如果您有反映实际使用情况的数据,您应该同时实现和配置文件以确定哪个对程序的访问行为最有效。
-
要找到权衡取舍的关键点,唯一知道的方法就是尝试两种方法并进行衡量。
-
这是你需要测试和测量的东西,因为它取决于你正在做什么的细节。通常,当数据集的大小很小时,使用什么容器并不重要,因为任何一个容器都能充分发挥作用。
-
恐怕这不仅取决于大小,还取决于元素的类型。对于复杂类型,每次比较都可能很昂贵,而哈希可以被缓存(+ 表示集合)。另一方面,对于整数数据,在短数组中搜索整数相当快(+ 表示向量)。
标签: c++