2017-02-21 11 views
1

私は大量のレコード(アプリケーション20K)を受け取らなければならないプロジェクトに取り組んでいます。それぞれは小数点以下のポイント(x、y)を表します。 私はPointオブジェクトとdouble値を持っていますm = user input たとえば、m = 0.1p1 = {1.21,1.32}, p2 = {1.21,1.31} p3 = {1.20, 1.32} p4 = {1.55, 1.31}のように、mよりも近い別のポイントを持つすべてのポイントを削除する必要があります.p2、p3(p1の近くのポイント)しかし、私はそれが他のポイントのいずれかとの距離が0.1よりも大きいのでp4を保つでしょう。大きなデータセットのためにClose Point C#を削除する

私はアルゴリズムを実装し、それは私はとんでもないことだと思うおり、記録の20Kのために(これを確認するために3時間以上を要し、4.5?

まで、この使用して、.NETフレームワークを行うにはどのような方法があるとされます
+2

20Kの量は、すべての大きな私には見えていないと言ってもブリュット-力で、完了するまでに3時間を取るべきではありません溶液。 – Tigran

+2

私は質問から理解することができる限り、実装にひどく間違っているはずですので、それを示す価値があります。何らかの理由でそれが大きすぎる場合、少なくともスニペット、または基本的な論理スキーム。 – Tigran

+0

@Tigran私は確信していません。https://paste.ofcode.org/hkb5YiKASmyFZsQ9ZxhuHS – TOMP

答えて

0

はここでプログラムが他に何もしない場合でも、時間もかかりますが、すべてそれ自体で、コンソールに20Kのx 20K = 400M行を出力する。Console.WriteLine文を削除

  1. しようとするいくつかのことです。もしあなたは何らかの出力を絶対に保たなければならないので、多くの処理時間をoutputting to the same line instead of scrollingで節約することができます。

  2. リストをルーピングする前にソートし、ソートされたリスト内の互いに近いものを比較するだけでよいようにループを変更することを検討してください。たとえば、Yでソートすると、外側のループは同じままですが、forステートメントをwhile (full[j].Y < full[i].Y + maxVal)に置き換えることができます。 maxValの中に要素が存在しないリストの一部に到達したら、内部ループを終了して次の値のiに移動することができます。これはあなたのパフォーマンスプロフィールをO(N^2)からO(N)...に変更します。

  3. 有効数字が7桁を超える必要がない場合は、doubleの代わりにfloatを使用することを検討してください。計算がかなり高速になります。

  4. duplicatedのメモリを事前割り当てすることを検討してください。そのリストが割り当てられたサイズを超えて増加すると、.NETは新しいリスト(おそらくガベージコレクションを引き起こす)を割り当て、古いものからすべてのバイトをコピーする必要があります。あなたは、構文のこの種を使用してスペースを事前に割り当てることができます。

    var list = new List<Point>(20000); 
    
小数点の
+1

#2を使用すると、時間が3秒に短縮されます。 – TOMP

関連する問題