2012-04-10 6 views
4

私はある参照点までの距離を線に沿って格納するベクトルを持っています。だから、私は、例えば、距離が700メートルかその距離に最も近い値の指標を求めています。下限を持つ最近傍点を見つける...しかし、データはソートされていません

私はベクトルをソートして、lower_boundを成功と一緒に使用しました。

実際にはエラーが発生するため、並べ替えられたベクトルを常に保つことはできません。データを格納するときに、たとえばその行に従わなかった可能性があるからです。

データがソートされていない場合、どうすれば最も近い値を見つけることができますか?

答えて

1

vectorをstl setにコピーしてから、要素を見つけるためのベクトルと同じロジックを使用してください。

+0

ソートされたベクトルは、ほとんど常にセットより優れています。 –

+0

したがって、ペア(ベクトルインデックス、距離)でセットを作成し、lower_boundを適用して目的のインデックスを復元しますか?それは、すべてのベクトル要素をループに反復するだけではなく、もっと複雑ではないでしょうか? –

+0

@RomanRdgz: 'std :: set'はペアを取らず、キーとして機能する要素を取ります。あなたはそれを' std :: map'と誤解します。また、ソートされた 'std :: vector'は、ほとんどの場合、すべての要素を 'std :: set'にコピーするよりも速くなるはずですが、明らかに後者ではなく後者を使うべきです。 –

3

std::vectorはシーケンスコンテナなので、できません。ソートアルゴリズムを使用してデータをsortにする必要があります。

2

std::min_elementは、3つの引数の形式で使用できます。最初の引数が2番目の引数よりも目標距離(700m)に近い場合は、trueを返すコンパレータを渡します。 min_elementから返された結果は、ターゲットに最も近いポイントになります。

もちろんこれはlower_boundより漸近的に遅いですが、ベクトルのソートの最悪の場合よりも漸近的に速いです。ベクトルを一度ソートしてから複数の異なる距離で最も近い点を検索しているときにソートしたままにしておけば、おそらくstd::sortstd::lower_boundを使うべきです。最も近い点を見つけることが一回限りの操作である場合は、min_elementで「遅い」方法を実行する方が良いかもしれません。

関連する問題