C++ 无序集合问题
有人能解释一下无序的集合是如何工作的吗?我也不知道一套是如何工作的。我的主要问题是它的find函数的效率如何 例如,这个系统的总运行时间是多少C++ 无序集合问题,c++,set,unordered-set,C++,Set,Unordered Set,有人能解释一下无序的集合是如何工作的吗?我也不知道一套是如何工作的。我的主要问题是它的find函数的效率如何 例如,这个系统的总运行时间是多少 vector<int> theFirst; vector<int> theSecond; vector<int> theMatch; theFirst.push_back( -2147483648 ); theFirst.push_back(2); theFirst.p
vector<int> theFirst;
vector<int> theSecond;
vector<int> theMatch;
theFirst.push_back( -2147483648 );
theFirst.push_back(2);
theFirst.push_back(44);
theSecond.push_back(2);
theSecond.push_back( -2147483648 );
theSecond.push_back( 33 );
//1) Place the contents into a unordered set that is O(m).
//2) O(n) look up so thats O(m + n).
//3) Add them to third structure so that's O(t)
//4) All together it becomes O(m + n + t)
unordered_set<int> theUnorderedSet(theFirst.begin(), theFirst.end());
for(int i = 0; i < theSecond.size(); i++)
{
if(theUnorderedSet.find(theSecond[i]) != theUnorderedSet.end())
{
theMatch.push_back( theSecond[i] );
cout << theSecond[i];
}
}
向量优先;
第二向量;
矢量匹配;
第一个。推回(-2147483648);
第一,推回(2);
第一,推回(44);
第二次推回(2);
第二次推回(-2147483648);
第二次推回(33);
//1) 将内容放入一个无序集,即O(m)。
//2) O(n)向上看,就是O(m+n)。
//3) 将它们添加到第三个结构中,这就是O(t)
//4) 总的来说,它变成了O(m+n+t)
无序\设置无序集(first.begin(),first.end());
对于(int i=0;i cout所有std::unordered_*()数据类型都使用散列来执行查找。看看Boost关于这个主题的文档,我想你会很快理解的
所有std::unordered_*()数据类型都使用散列来执行查找。请参阅Boost关于该主题的文档,我想您会很快理解它
无序集
和所有其他的无序集
数据结构都使用散列,正如@Sean所提到的。散列包括摊销的常量插入时间和接近常量的查找时间。散列函数本质上获取一些信息并从中生成一个数字。从某种意义上说,它是一个函数,same输入必须产生相同的输出。但是,不同的输入可能会产生相同的输出,从而导致所谓的冲突。对于“完美哈希函数”(即没有冲突的函数),查找将保证时间恒定。实际上,输入编号来自存储在结构中的元素(假设它是值,它是一种基本类型)并将其映射到数据结构中的某个位置。因此,对于给定的键,该函数将您带到元素存储的位置,而无需进行任何遍历或搜索(为简单起见,此处忽略冲突),因此时间恒定。这些结构有不同的实现(开放寻址、链接等)参见。我还推荐Skiena的第3.7节。现在,关于大O复杂度,你是对的,你有O(n)+O(n)+O(重叠大小)。由于重叠不能大于m和n中的较小者,所以整体复杂度可以表示为O(kN),其中n是m和n之间的最大值。因此,O(n).同样,这是“最佳情况”,没有冲突,并且具有完美的哈希
另一方面,set
和multi\u set
使用二叉树,因此插入和查找通常是O(logN)。哈希结构与二叉树结构的实际性能取决于N,因此最好尝试这两种方法,并在实际运行场景中对其进行分析。无序集
和所有其他无序
数据结构都使用哈希,如@Sean所述。哈希包括为插入,以及接近恒定的查找时间。哈希函数本质上获取一些信息并从中生成一个数字。从某种意义上讲,它是一个函数,相同的输入必须产生相同的输出。但是,不同的输入可能会导致相同的输出,从而导致所谓的冲突。查找将被保证为“完美散列函数”是一个没有冲突的函数。实际上,输入数字来自存储在结构中的元素(比如说它的值,它是一个基本类型)并将其映射到数据结构中的某个位置。因此,对于给定的键,该函数将您带到元素存储的位置,而无需进行任何遍历或搜索(为简单起见,此处忽略冲突),因此时间恒定。这些结构有不同的实现(开放寻址、链接等)请参阅。我还推荐Skiena的第3.7节。现在,关于大O复杂性,你是对的,你有O(n)+O(n)+O(重叠的大小)。由于重叠不能大于m和n中的较小者,所以整体复杂性可以表示为O(kN),其中n是m和n之间的最大值。因此,O(n)。同样,这是“最佳情况”,没有冲突,并且具有完美的哈希
另一方面,set
和multi\u set
使用二叉树,因此插入和查找通常是O(logN)。哈希结构与二叉树结构的实际性能取决于N,因此最好尝试这两种方法,并在实际运行场景中对其进行分析。答案是否涵盖了您的问题,还是仍不清楚?答案是否涵盖了您的问题,还是仍不清楚?我相信对于无序_映射
,函数将键
映射到存储值
的位置。但是对于无序集
,它是如何工作的?我们只需要检查它的存在,而不是对应的值。我相信对于无序映射
,函数将键
映射到值
的位置>是存储的。但是它如何用于无序集
——我们只需要检查它的存在,而不是相应的值?