2016-07-28 7 views
0

が同じバケット内のすべての点が(相互に同一のユークリッドノルムを有する場合、私はPointstruct Point { double x; double y;} あるIがグループ(バケット)にそのようなベクターを分割したいstd::vector<Point>があるとポイントdist(PointA、PointB)== X、ここでXは定数)。パーティションのstd ::ベクトルは、

struct ClosePoints 
{ 
    bool operator()(Point const& A, Point const& B) const 
    { 
     bool same = dist(A,B) < x; 
     //If not close enough use lexical sort 
     return same ? false : std::tie(A.x, A.y) < std::tie(B.x,); 
    } 
} 

パーティショニングコード:私は、カスタムのソート演算子で、このようなタスクのためstd::mapを使うことにしましたいくつかのテストの後

std::map<Point, std::list<Point>, ClosePoints> map; 
for(const auto& p : pointsVector) 
    map[p].push_back(p); 

と私はいくつかのポイントが与えられ従うことに気付きましたバケツを印刷しますユークリッドのノルム限界Xは異なるバケットで終了しました。 私はそれがなぜそうであるか把握できないのですか?

+1

問題を再現できるテスト入力を含め、完全でコンパイル可能で実用的な例を提供することをお勧めします。 – vordhosbn

+0

1) 'x'とは何ですか? 2) 'dist()'とは何ですか? 3) 'dist(A、B) PaulMcKenzie

+0

あなたは演算子が 'A <= A + eps'と' A + eps <= A + 2 * eps'という厳密な順序に従わず、 'A <= A + 2 * eps'ではありません。 – Jarod42

答えて

2

定義した比較演算子が等価関係を提供しないという問題があります。例えば、AとCに近い点Bを持つことができますが、AとCの点は互いに遠く離れている可能性があります。したがって、BとAとCを比較すると、Bと同じバスケットに入れられます。ただし、AとCを最初に比較すると、結果は予測不可能になります。

+0

これは正しいです一般的なケースが、私の場合(私が取り組んでいるデータ)のような点ABC (A、B)(B、C)(C、A)はすべて互いに同じ距離を持ちます。 – JobNick

+0

@JobNick OK、お互いに距離があるサブセットxとし、各サブセットを半径xのボールに配置することができます。あなたのロジックは正しいです。しかし、オペレータの作業を行うためには、異なるサブセットを注文する必要があります。これは解を有していない。なぜなら、オペレータはサブセット全体の幾何学的特性、例えば、全要素の平均座標、サブセット全体のある座標の最小または最大などに基づいているからである。それは容易に証明することができた。 – slav

+0

問題は要素挿入の順序だと思います。おそらく、ある時点で、ツリーの再バランス自体が、すでに代表セットを持つ要素の挿入によって、それ自身のツリーノード(セット)が作成されます。 – JobNick

関連する問題