哈希集可以找到O(1)的最小或最大元素?

时间:2011-12-26 18:43:37

标签: c++ stl hashmap hashtable hashset

我需要很好地理解哈希集的体系结构和功能。

与STL :: set相比,哈希集与STL :: set相比有什么优势?我认为O(1)时间做搜索。如果这是真的,为什么不使用哈希表呢?他们的区别是重复元素?或其他人?

对于STL :: set,最小/最大的搜索时间也是O(1),因为它已经被排序。

哈希集不是二叉搜索树,如何用O(1)找到最小或最大的元素?

看完之后 What is the difference between set and hashset in C++ STL?

我找不到答案。

我的想法:

何时应该使用哈希集而不是哈希表?

STL :: set是有序集。因此,获得最小/最大元素是O(1)。

如果哈希集怎么办?订购?

感谢

2 个答案:

答案 0 :(得分:3)

  

哈希集不是二叉搜索树,如何用O(1)找到最小或最大的元素?

这正是关键区别之一:您无法在常量时间内找到哈希集中的最小/最大元素。当然,您可以通过扫描整个集合在O(n)时间内完成此操作。

另一个关键区别是迭代哈希集不会按排序顺序返回元素。

答案 1 :(得分:0)

哈希集基本上是没有存储值(仅键)的哈希表,而C ++中的std::set实现为平衡二进制搜索树。

您应该阅读一些算法/计算机科学书籍中的差异,因为您似乎有一些基本的误解,例如,在二叉搜索树中,找到最小/最大元素的成本是对数O(log N) ,不是常数O(1)

根据您最常需要执行的操作,数据结构将更合适。如果你需要经常找到最小的元素,那么std::set将在O(log N)中执行操作,但是使用哈希表你需要检查所有元素,这意味着线性时间{{1} }。另一方面,如果操作不常见且常规查找(集合中的元素a)更常见,则哈希集的常量时间查找将优于集合中的O(N)查找。