2016-07-27 3 views
2

クイック質問:同じデザインで2つの異なる結果が得られるのはなぜですか?

私は一束(雲)の座標を持っており、私は束全体の四隅の座標を見つける傾向があります。そして、私は意味のコーナーで:私は私の値を取得するには、この古いルーチンを使用

MyDesiredResult = {SmallestX、BiggestY、BiggestX、SmallestY}

、それが正しいもの
です:

しかし、私はそれを行う必要があります4回(4つの結果のために)。だから、私は一度だけ使用し、この新ルーチンにそれを変更することで、私のコードを最適化しようとしています:

List<CoordPoint> MySortedList = MyCloud.Select(c => new CoordPoint { X = c.X, Y = c.Y, Z = c.Z, Color = c.Color }).ToList(); 

MySortedList.Sort((c1, c2) => c1.X.CompareTo(c2.X));  // sort on X 
var temp = MySortedList[MySortedList.Count - 1];   // hold biggest X in a temp variable 
MyResult.Add(MySortedList[0]);       // add smallest X to my result 

MySortedList.Sort((c1, c2) => c1.Y.CompareTo(c2.Y)); ; // sort on Y 
MyResult.Add(MySortedList[MySortedList.Count - 1]);  // add biggest Y to my result 
MyResult.Add(temp);          // add biggest X to my result 
MyResult.Add(MySortedList[0]);       // add smallest Y to my result 

しかし、それは異なる結果が得られます。私は、サンプル入力、現在の出力、および希望の出力を表示したいと考えています。私はサンプル入力(巨大な負荷)をスキップし、結果を表示することができます。誰かが私が間違っていることに向かって私を指摘できますか?旧ルーチンから

結果:同じ入力について

(0,4)、(15、12)、(23、6)、(19、0)

新しいルーチン
から

結果:

(0、4)、(18、12)、(23、6)、(18、0)

enter image description here

+0

あなたは、2つの異なるコードスニペットが異なる結果を生成すると述べてきましたが、正しい結果が何であるかについては何も言及していません。 – Servy

+0

@謝りました。結果部分の前に "_P.S古いルーチンが正しい!_"と表示されます。そして、新しいルーチンは異なる結果をもたらすべきではありません!これが問題です。 –

+0

あなたの質問の根本的な前提は、ポストスクリプトにあってはいけません。 – Servy

答えて

2

私は別の質問であなたの質問にお答えします:

は何が起こります2つの点が同じY座標を持ち、Y座標が最小値または最大値の場合X座標も同様ですか?

例を示します。

(0、0)、(1、0)、(0、1)、(1、1)

あなたのオリジナルのアルゴリズムは返します:

あなたはこれらの4点を持っていたとしましょう

(0、0)、(0、1)、(1、0)、(0、0)

今の私たちは、それらのオリジナル4点を取って、それらをシャッフルしましょう:

あなたはその上で、あなたのオリジナルのアルゴリズムを実行する場合

(1、1)、(0、1)、(1、0)、(0、0)

、あなたはこれを取得します:

(0、1)、(1、1)、(1、1)、(1、0)

あなたによると、独自のアルゴリズムは正しいですが、私はそれを与えてくれました2つの異なる注文のポイントの同じセットと2つの異なる答えを得た。答えのどれが正しいのですか?実際の期待結果は何ですか?

新しいアルゴリズムの結果を提供していない理由があります。なぜなら、あなたの新しいアルゴリズムがどのように生成するのかわからないからです。私が知らない理由は、List<T>.Sortが不安定な並べ替えを実行することです。つまり、「等しい」と比較する2つの要素は必ずしも順序通りに残されません。

(0、0)、(0、1)、(1、0)、(1、1:だから、私たちの入力は、以下のすべての座標Xでソートしようとした後に有効な可能性ある(0, 0), (1, 0), (0, 1), (1, 1)た場合)

(0,1)、(0,0)、(1,0)、(1,1)

(0,1)、(0,0)、(1,1)、 (1、0)

(0,0)、(0,1)、(1,1)、(1,0)

List<T>.Sortはそれらのいずれかを生成することができます。より重複したX座標がある場合は、さらに多くの順序が可能です。これが不安定と呼ばれる理由は、ソート後に2つの等しい要素(例えば、(0, 0)および(0, 1))の相対順序が保持されないためです。ソートアルゴリズムは、その位置を入れ替えることがあります。

+0

私は読書を続ける前に何を尋ねるのか分かっていました.Dちょうどそれについて考えていました。あなたは正しいです..良いキャッチ! +1していただきありがとうございます。しかし、私には他の答えに時間を許してください。私は、Xが等しければYが等しく、Yが最大のような場合には最大のXを取る必要があると思います。 –

+0

@FirstStepこれは実際にこれらの点で何をしようとしているかによって異なります。境界ボックスの角を取得しようとしているだけであれば、新しい点を作成する必要があります。その理由は、一連の点に必ず境界ボックスの角に点が含まれるわけではないからです。 '(-1、0)、(0、1)、(1,0)、(0、-1)'を考えてみましょう。角は '(-1、-1)、(-1,1)、(1,1)、(1、-1)'であり、入力セットには含まれていません。 – Kyle

+0

それでは、私はあなたに同意しないかもしれません。私は正確に輪郭を取得しようとしています。境界線の座標を取得することで輪郭を作成することができます。輪郭の座標は '(XFromSmallestXCoord、YFromHighestYCoord)、(XfromHighestXCoord、YFromHighestYCoord)、(XFromHighestXCoord、YFromHighestXCoord)、(XFromSmallestXCoord、YFromSmallestYCoordinate)'ですが、次に問題に直ちに進みます。たとえば、SomeSmallestXCoordinateなどがある場合はどうなりますか?そして、私はもうそれ以上の問題はないと思う。 –

関連する問題