2011-02-03 34 views
2

我正在開發的程序旨在處理大量的數據並生成至少2^34個布爾數據。這些靜態生成的數據在整個程序運行過程中被清除(只有一部分在每個實例中被排序),並且最後將最少2^21行統計數據的向量傳遞到最後階段以供進一步處理。C++ STL矢量分類 - 破壞和清零

但是,某些輸入數據的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); 
     } 
    } 
}; 

樣品的行將被破壞的數據(即, N無特定的順序):

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 

破壞&通過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); 
     } 
    } 
}; 

Thnaks到@馬克-B,@btilly,@大衛-索恩利,@sth & @丹尼爾 - 加拉格爾

+0

在哪裏是否創建了矢量,以及它是如何在你的程序中傳遞的? – sth 2011-02-03 19:10:01

+0

當你使用`stable_sort`的時候你會得到腐敗嗎? – 2011-02-03 19:12:18

+0

絕對沒有代碼顯示使用單詞`vector`,請顯示`statistics`的定義和如何添加一些樣本值然後顯示如何打印結果我們可以幫助t母雞。 – 2011-02-03 19:16:42

回答

4

您的比較器沒有執行嚴格的弱排序。例如,兩項AB等於col_Sensitivitycol_PrecisionA < BB < A是正確的。正如你可以想象的,試圖用一個實際上不提供排序的排序函數進行排序可能會產生未定義的行爲。

由於(和報價)@大衛索恩利用於標準參考:

標準,爲25.3/3部分:「對於 算法正確工作,補償具有 誘導嚴格弱序在 的值。「這意味着,並非 有嚴格的弱序是 未定義(標準說什麼)

我覺得在這種情況下,你只是想徹底刪除所有的小量檢查:

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); 
    } 
}}; 
4

的STL排序可以損壞數據,如果比較操作者可以產生不一致的結果,例如x <ÿ < z < x。

您的比較運算符可能會產生不一致的結果。