Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 散列集可以找到O(1)的最小或最大元素?_C++_Stl_Hashmap_Hashtable_Hashset - Fatal编程技术网

C++ 散列集可以找到O(1)的最小或最大元素?

C++ 散列集可以找到O(1)的最小或最大元素?,c++,stl,hashmap,hashtable,hashset,C++,Stl,Hashmap,Hashtable,Hashset,我需要很好地理解哈希集的结构和功能 与STL::set相比,哈希集与STL::set相比有什么优势?我认为是时候做搜索了。如果这是真的,为什么不使用哈希表呢?它们的区别是复制元素吗?还是其他 对于STL::set,最小/最大的搜索时间也是O(1),因为它已被排序 哈希集不是二叉搜索树,如何用O(1)查找最小或最大的元素 读后 我找不到答案 我的想法是: 什么时候应该使用哈希集而不是哈希表 集合是有序集合。所以,得到最小/最大元素是O(1) 如果是哈希集呢?订了吗 谢谢 哈希集不是二叉搜索树,如

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

与STL::set相比,哈希集与STL::set相比有什么优势?我认为是时候做搜索了。如果这是真的,为什么不使用哈希表呢?它们的区别是复制元素吗?还是其他

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

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

读后

我找不到答案

我的想法是:

什么时候应该使用哈希集而不是哈希表

集合是有序集合。所以,得到最小/最大元素是O(1)

如果是哈希集呢?订了吗

谢谢

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

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

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

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

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


另一个关键区别是,在哈希集上的迭代不返回排序顺序的元素。

< P>散列集基本上是一个没有存储值(仅键值)的哈希表,而 STD::C++中的SET</代码>被实现为平衡二叉搜索树。p> 您应该阅读一些算法/计算机科学书籍中的差异,因为您似乎有一些基本的误解,例如,在二元搜索树中,查找最小/最大元素的成本是对数
O(logn)
,而不是常数
O(1)


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

哈希集基本上是一个没有存储值(仅键)的哈希表,和<>代码STD::C++中的SET</代码>被实现为平衡二叉搜索树。 您应该阅读一些算法/计算机科学书籍中的差异,因为您似乎有一些基本的误解,例如,在二元搜索树中,查找最小/最大元素的成本是对数
O(logn)
,而不是常数
O(1)


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

是什么让您认为可以在O(1)中找到最大或最小的元素?无法理解,您只希望O(1)中的最小/最大元素或O(1)中的查找或两者都是O(1)?哈希集是如何工作的?(这与哈希表的工作原理基本相同。)这就是答案。链接帖子中的第一个答案回答了这里的问题:“基本上是随机的”,“不是有序的”。是什么让你认为你可以在O(1)中找到最大或最小的元素?我不明白,你只想在O(1)中找到最小/最大的元素,或者在O(1)中查找,或者两者都是O(1)?哈希集是如何工作的?(这与哈希表的工作原理基本相同。)这就是答案。链接帖子中的第一个答案回答了这里的问题:“基本上是随机的”,“不是有序的”。为什么在
std::set
中找到最小/最大的元素不是O(1)
set.begin()
set.rbegin()
是您的朋友。@Xeo,除非集合包含特定的优化,否则树可能需要O(logn)来查找第一个或最后一个元素。@Xeo,您可能是对的-根据此引用,set.begin和set.rbegin需要具有恒定的复杂性。不过,我不确定是否要相信这个推荐人@Mark:C++03和C++11标准要求容器和可逆容器的
C.begin()
C.rbegin()
具有恒定的复杂性(有关要求,请参见C++03§23.1 p5和p9以及C++11§23.2.1 p4和p9,以及满足要求
std::set
的C++03§23.3.3 p2和C++11§23.4.6.1 p2)。为什么不在
std::set
set.begin()和
set.rbegin()中找到最小/最大的元素不是O(1)
是您的朋友。@Xeo,除非集合包含树可能需要的特定优化O(log n)若要查找第一个或最后一个元素。@Xeo,您可能是对的-根据此引用,set.begin和set.rbegin需要具有恒定的复杂性。但我不确定是否信任该引用。@Mark:至少有一个最近的标准草案要求
begin
end
f具有恒定的复杂性