Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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++ 无序集合问题_C++_Set_Unordered Set - Fatal编程技术网

C++ 无序集合问题

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

有人能解释一下无序的集合是如何工作的吗?我也不知道一套是如何工作的。我的主要问题是它的find函数的效率如何

例如,这个系统的总运行时间是多少

    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;icout所有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,因此最好尝试这两种方法,并在实际运行场景中对其进行分析。

答案是否涵盖了您的问题,还是仍不清楚?答案是否涵盖了您的问题,还是仍不清楚?我相信对于
无序_映射
,函数将
映射到存储
的位置。但是对于
无序集
,它是如何工作的?我们只需要检查它的存在,而不是对应的值。我相信对于
无序映射
,函数将
映射到
的位置>是存储的。但是它如何用于
无序集
——我们只需要检查它的存在,而不是相应的值?