vector間における効率的な値の比較
2つのベクターに入ったdoubleの網羅的な比較を行う関数をC++で書こうとしています。
(VC++ 2008)
doubleのベクター vctr_1 , vctr_2 があるとします。
vctr_1 には (100.0, 200.5 , 300.1 , 400.0 )
vctr_2 には(50.0 , 70.2, 100.1, 220.0 , 300.0 ) というdouble の値が入っていて vctr_1の値のうち、vctr_2に近い値(誤差0.2以内)が見つかるものを.新しいベクターとして返すという処理を考えています。
この場合 100 : 100.1 と300.1: 300.0 が 誤差 0.2 未満で近い値といえ、100 と300.1が格納されたベクターを返す、という処理です。
私の考えた方法はベクターaの各要素に対してベクターbの各要素をループで比較する、というものでした。
以下コード
----------------------------
//比較を行う関数。ベクター1、2 要素の比較をし誤差内の数値をベクター1からとりだし、別のベクターとして返す。
vector<double> compare_doubles_with_tol(vector<double> v1,vector<double> v2 , double tol ){
//似た値を格納するベクター
vector<double> v_match;
//ベクター1に関してループ
vector<double>::iterator it1 = v1.begin();
while( it1 != v1.end() ){
//ベクター2に関してループ
vector<double>::iterator it2 = v2.begin();
while( it2 != v2.end() ){
//誤差内の値を見つける
if( fabs(*it1 - *it2) < tol ){
v_match.push_back(*it1);
}
++it2;
}
++it1;
}
return v_match;
}
int main() {
//ベクター1
std::vector<double> vctr_1;
vctr_1.push_back(100.0);
vctr_1.push_back(200.5);
vctr_1.push_back(300.1);
vctr_1.push_back(400.0);
//ベクター2
std::vector<double> vctr_2;
vctr_2.push_back(50.0);
vctr_2.push_back(70.2);
vctr_2.push_back(100.1);
vctr_2.push_back(220.0);
vctr_2.push_back(300.0);
//誤差0.2内で似た値があるものを新たなベクターとして得る。
vector<double> matched = compare_doubles_with_tol(vctr_1,vctr_2,0.2);
for (int i = 0 ; i < matched.size() ; ++i){
cout << matched[i]<<endl;
}
return 0;
}
-------------------------
このコードで望んだ結果は得られますがループの繰り返しを行っていて処理が遅くなってしまいます。実際の仕事ではベクターの要素数が100前後のものを非常に数多く処理しなければならず、このままでは処理時間が膨大なものになってしまいそうです。
このような場合どのような処理、コードを作成すれば処理速度の向上が望めるでしょうか。
お礼
とんでもない話ですね?