我正在开发的程序旨在处理大量数据并生成至少2 ^ 34个布尔数据。这些数据静态生成&在整个程序运行期间清除(每个实例只分配一部分),最后将最少2 ^ 21行统计数据的向量传递到最后阶段进行进一步处理。
但是,某些输入数据的STL排序失败。排序完成其过程后,某些向量行将被清零或损坏。似乎我唯一的选择是尝试对混合Quicksort / Insertion排序算法进行硬编码。
如果你表达自己的想法,我感激不尽。欢呼声。
最后阶段数据的数据结构:
struct statisticalValues{
unsigned long long id; //index id
unsigned int col_Sum; //Sum: total number of 1s for each combination
unsigned int col_Relevancy; //Relevancy = total number of 1s produced by (Comb AND Rel)
float col_Sensitivity; //Sensitivity= Relevancy / X
float col_Precision; //Precision= Relevancy / Sum
};
extern vector<statisticalValues> statistics;
调用STL排序:
sort(statistics.begin(), statistics.end(), BySensitivity());
比较标准:
#define EPSILON 0.0001 // user-defined tolerance for equality of floating-point numbers
struct BySensitivity {
bool operator()(statisticalValues const &a, statisticalValues const &b) const {
float sensitivityDif = b.col_Sensitivity - a.col_Sensitivity;
if((sensitivityDif < EPSILON) && (sensitivityDif > -EPSILON)){
return ((b.col_Precision - a.col_Precision) < EPSILON);
}else{
return (sensitivityDif < -EPSILON);
}
}
};
将被破坏的样本数据行(无特定顺序):
id,col_Sum,col_Relevancy,col_Sensitivity,col_Precision
1568676,5353,3696,94.166,69.045
1770228,5353,3696,94.166,69.045
2040533,5353,3696,94.166,69.045
2053376,5353,3696,94.166,69.045
1231712,4668,3425,87.261,73.372
1946656,4668,3425,87.261,73.372
1948021,4668,3425,87.261,73.372
腐败后&amp;通过STL排序归零:
id,col_Sensitivity,col_Precision
10540996614775448722,5.8399e-34,5.8399e-34
8589934369,0.0000,0.0000
0,0.0000,0.0000
0,0.0000,0.0000
0,0.0000,0.0000
0,0.0000,0.0000
0,0.0000,0.0000
实施建议修改后:
比较标准:
struct BySensitivity {
bool operator()(statisticalValues const &a, statisticalValues const &b) const {
float sensitivityDif = b.col_Sensitivity - a.col_Sensitivity;
if((sensitivityDif <= EPSILON) && (sensitivityDif >= -EPSILON)){
return ((b.col_Precision - a.col_Precision) < -EPSILON);
}else{
return (sensitivityDif < -EPSILON);
}
}
};
向@ Mark-B,@ obtilly,@ David-Thornley,@ sth&amp; @ Daniel-Gallagher
答案 0 :(得分:4)
如果比较运算符可以产生不一致的结果,例如x <1,则STL排序可以破坏数据。 y&lt; z&lt; X
您的比较运算符可能会产生不一致的结果。
答案 1 :(得分:4)
您的比较器没有实现严格的弱排序。例如,两个A
和B
项col_Sensitivity
和col_Precision
,A
&lt; B
B
和A
&lt; struct BySensitivity {
bool operator()(statisticalValues const &a, statisticalValues const &b) const {
float sensitivityDif = b.col_Sensitivity - a.col_Sensitivity;
if(sensitivityDif == 0.0)){
return ((b.col_Precision - a.col_Precision) < 0.0);
}else{
return (sensitivityDif < 0.0);
}
}};
是真的。可以想象,尝试使用实际上不提供排序的sort函数进行排序会产生未定义的行为。
感谢(和引用)@David Thornley的标准参考:
标准,25.3 / 3的一部分:“对于 算法正常工作,comp有 诱导严格的弱序 价值观。“这意味着没有 严格的弱顺序是 undefined(标准没有说明)。
我认为在这种情况下你只想完全删除所有的epsilon检查:
{{1}}