在数组中比较/搜索多个整数的最佳解决方案

时间:2018-06-04 10:40:40

标签: c++ performance c++11 compare lookup

我只是想问你,进行以下比较的最有效的解决方案是什么:

我从我的功能中获取了一个值。例如class DataPointSerializer(serializers.ModelSerializer): representation = serializers.SerializerMethodField() class Meta: model = DataPoint fileds = ('representation',) def get_representation(self,instance): data = [] model_one = model_one.objects.all() calculation using model_one model_two.objects.filter(by calculated data) construct JSON data.append(construct JSON) return data 。现在我想将它与多个整数进行比较,如果它是相同的(6),否则(true)就像一个典型的false

现在,我使用了if-statement,但我很确定对于每个数组元素都是非常不必要的,所有时间都要检查值是否在其中。

有人能告诉我更准确有效的方法吗?

此致

3 个答案:

答案 0 :(得分:1)

正如@Sam Varshavchik已经在评论中提到的那样,您可以使用std::unordered_set<>存储数组中的所有值及其std::unordered_set::find()进行查找,其中常量时间复杂性。

以下是示例代码:

#include <iostream>
#include <unordered_set>

int fun()
{
   /* return some integer */
   return 1;
}

int main()
{
   std::unordered_set<int> Arr = {1,2,3,4,5,6};
   std::cout << std::boolalpha << (Arr.find( fun() ) != Arr.cend());
   // or
   // (Arr.find( fun() ) != Arr.cend()) ?  std::cout << "Found\n": std::cout << "Not Found\n";

   return 0;
}

答案 1 :(得分:1)

要添加到之前的答案,这里是一个简单的基准,比较unordered_setvector / findvector / binary_search

Live Demo

#include <iostream>

#include <algorithm>
#include <vector>
#include <unordered_set>
#include <random>
#include <boost/timer/timer.hpp>

std::random_device rd;     // only used once to initialise (seed) engine
std::mt19937 rng(rd());    // random-number engine used (Mersenne-Twister in this case)
std::uniform_int_distribution<int> uni(0, 6); // guaranteed unbiased

int fun()
{
   /* return some integer */
   return uni(rng);
}

const size_t nTries = 1000000;
int main()
{  
   volatile bool isFound;
   { // unordered_set
   std::unordered_set<int> vals = {1,2,3,4,5,6};
   {
   boost::timer::auto_cpu_timer timer;
   for(volatile size_t i=0; i<nTries; i++)
       isFound = (vals.find(fun()) != vals.cend());
   }     
   }

   { // vector
   std::vector<int> vals = {1,2,3,4,5,6};
   {
   boost::timer::auto_cpu_timer timer;
   for(volatile size_t i=0; i<nTries; i++)
       isFound = (std::find(vals.cbegin(), vals.cend(), fun()) != vals.cend());
   }
   }

   { // vector, binary search
   std::vector<int> vals = {1,2,3,4,5,6};
   std::sort (vals.begin(), vals.end());
   {
   boost::timer::auto_cpu_timer timer;
   for(volatile size_t i=0; i<nTries; i++)
       isFound = std::binary_search (vals.cbegin(), vals.cend(), fun());
   }
   }
   return 0;
}

数字变化很大,gcc和clang表现不同,但似乎使用unordered_set是一个安全的选择。

答案 2 :(得分:-1)

感谢您的建议!

我的新解决方案(@SamVarshavchik建议)现在看起来像这样:

std::unorderet_set<int> values= { 7, 8, 10, 13, 14, 16, 60, 17, 19, 24, 26, 27, 28, 33, 34, 39 };

bool check_value() {


    if (values.find( grabvalues() ) != values.cend()) { return true; }
    else { return false; }


}