2016-07-27 18 views
2

Schnelle Frage:Warum bekomme ich zwei verschiedene Ergebnisse für das gleiche Design?

Ich habe ein Bündel (Wolke) von Koordinaten und ich neige dazu, die vier Eckkoordinaten des ganzen Bündels zu finden. Und Ecke meine ich:

MyDesiredResult = {SmallestX, BiggestY, BiggestX, SmallestY}

Ich benutze diese Old Routine meine Werte zu erhalten und es ist die richtige:

double smallestX = MyCloud[0].X;  // assing X of first element to my result controller 
var tempCoordPoint = MyCloud[0];  // assign first element to my result controller 

for (int i = 0; i < MyCloud.Count; i++) 
{ 
    if (smallestX > MyCloud[i].X)  // find minimum X 
    { 
     smallestX = MyCloud[i].X; 
     tempCoordPoint = MyCloud[i]; 
    } 
} 

MyResult.Add(tempCoordPoint);   // add to my list 

Allerdings würde ich, dass viermal (für die vier Treffer) tun müssen. So versuche ich, meinen Code zu optimieren, indem es auf diese New Routine Veränderung, die ich nur einmal verwenden:

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 

Aber es gibt unterschiedliche Ergebnisse. Ich möchte eine Beispieleingabe, eine aktuelle Ausgabe und eine gewünschte Ausgabe zeigen. Ich kann die Beispieleingabe überspringen (große Last) und die Ergebnisse anzeigen. Kann mir jemand auf das hinweisen, was ich falsch mache?

Für den gleichen Eingang:

Ergebnis aus Alt Routine:

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

Ergebnis aus New Routine:

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

enter image description here

+0

Sie haben angegeben, dass zwei verschiedene Code-Snippets zu unterschiedlichen Ergebnissen führen, jedoch nichts über die korrekten Ergebnisse aussagen. – Servy

+0

@Servy tat ich. Siehe vorher den Ergebnisteil "_P.S Die alte Routine ist die richtige! _". Und die neue Routine sollte nicht zu anderen Ergebnissen führen! Das ist das Problem. –

+0

Die grundlegende Prämisse Ihrer Frage sollte nicht in einem Post-Skript sein. – Servy

Antwort

2

werde ich Ihre Frage mit einer anderen Frage beantworten:

Was passiert, Wenn zwei Punkte die gleiche Y-Koordinate haben und die Y-Koordinate das Minimum oder Maximum ist? Ebenso für die X-Koordinate?

Lassen Sie mich mit einem Beispiel veranschaulichen.Angenommen, Sie haben diese 4 Punkte hatten:

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

Ihr ursprünglicher Algorithmus zurückkehren würde:

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

lassen sie uns jetzt sagen, dass wir diese ursprünglichen 4 Punkte nahm und mischte sie:

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

Wenn Sie Ihren ursprünglichen Algorithmus auf dem ausführen, werden Sie diese:

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

nach Sie ist der ursprüngliche Algorithmus korrekt ist, aber ich habe es nur gegeben die gleiche Menge von Punkten in zwei verschiedenen Ordnungen und erhielt zwei verschiedene Antworten. Also welche der Antworten ist richtig? Was ist das tatsächlich erwartete Ergebnis?

Jetzt gibt es einen Grund, warum ich die Ergebnisse Ihres neuen Algorithmus nicht zur Verfügung gestellt habe und das liegt daran, dass ich nicht weiß, was Ihr neuer Algorithmus produzieren würde. Der Grund, warum ich nicht weiß, ist, dass List<T>.Sort eine instabile Sortierung durchführt. Das bedeutet, dass zwei Elemente, die "gleich" vergleichen, nicht notwendigerweise in der Reihenfolge bleiben. Also, wenn unser Eingang war (0, 0), (1, 0), (0, 1), (1, 1) alle folgenden gelten Möglichkeiten, nachdem sie von X zu sortieren versuchen koordinieren:

(0, 0), (0, 1), (1, 0), (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 könnte irgendeinen von denen erzeugen. Wenn Sie mehr doppelte X-Koordinaten haben, haben Sie noch mehr mögliche Ordnungen. Der Grund, warum dies als instabil bezeichnet wird, liegt darin, dass die relative Reihenfolge zweier gleicher Elemente (z. B. (0, 0) und (0, 1)) nach dem Sortieren nicht erhalten bleibt. Der Sortieralgorithmus könnte ihre Positionen tauschen.

+0

Ich wusste, was wirst du fragen, bevor ich weiterlesen: D Ich habe gerade darüber nachgedacht. Du hast Recht .. Guter Fang! +1 und danke.Bitte erlauben Sie mir etwas Zeit für andere Antworten, ich denke, ich werde das größte 'X' für Fälle wie' Y's sind gleich und am größten 'Y' nehmen müssen, wenn' X's gleich sind und so weiter. Arbeiten Sie daran –

+0

@FirstStep Das hängt davon ab, was Sie eigentlich mit diesen Punkten machen wollen. Wenn Sie nur versuchen, die Ecken der Begrenzungsbox zu erhalten, müssen Sie neue Punkte erstellen, da eine Reihe von Punkten nicht unbedingt Punkte an den Ecken der Begrenzungsbox enthält. Betrachte '(-1, 0), (0, 1), (1, 0), (0, -1)'; die Ecken sind '(-1, -1), (-1, 1), (1, 1), (1, -1)', von denen keiner in der Eingabesatz ist. – Kyle

+0

Nun, ich stimme dir vielleicht nicht zu. Ich versuche genau die Kontur zu bekommen. Und wenn ich die Grenzen der Koordinaten erhalte, kann ich meine Kontur erstellen. Die Koordinaten der Kontur wären '(XFromSmallestXCoord, YFromHighestYCoord), (XfromHighestXCoord, YFromHighestYCoord), (XFromHighestXCoord, YFromHighestXCoord), (XFromSmallestXCoord, YFromSmallestYCoordinate)' aber dann gehen wir direkt zum Problem. Was ist zum Beispiel, wenn wir MultipleSmallestXCoordinate und so weiter haben. Und ich denke, es spielt keine Rolle mehr. –

Verwandte Themen