我只是想问你,进行以下比较的最有效的解决方案是什么:
我从我的功能中获取了一个值。例如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
,但我很确定对于每个数组元素都是非常不必要的,所有时间都要检查值是否在其中。
有人能告诉我更准确有效的方法吗?
此致
答案 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_set
与vector
/ find
和vector
/ binary_search
。
#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; }
}