Autor Beitrag
TM4rkuS
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 02.04.10 18:47 
Mein Problem:
Ich habe eine variable Anzahl an variabler Zahlen, der Einfachheit halber nehme ich hier 2 3er-Zahlen-Blöcer (in der Praxis werden es dann aber auch schonmal 300) Zahlen
100, 400, 900
200, 600, 700.

Jetzt will ich, dass die ersten Zahlen den zweiten auf zweierlei Weisen zugeordnet werden:

1.
mit so niedrigen Abständen wie möglich, aber möglichst eng beieinander:
100 - 200 -> Diff 100
400 - 600 -> Diff 200
900 - 700 -> Diff 200

2.
mit so großen Abständen wie möglich, aber möglichst eng beieinander:
100 - 600 -> Diff 500
400 - 700 -> Diff 300
900 - 200 -> Diff 700

Falsch wäre hier zum Beispiel:
100 - 700 -> Diff 600
400 - 600 -> Diff 200
900 - 200 -> Diff 700
Begründung: Die Differenz der Differenzen ist größer, als beim ersten Beispiel, nämlich hier 700 - 200 = 500 und oben 700 - 300 = 400.

Wenn sich das bei vielen Zahlenpaaren nicht vermeiden lässt, um bspw den Gesamtschnitt aufrecht zu erhalten, dann sind solche "Ausreißer" kein Problem, aber generell eher unvorteilhaft. Selbiges gilt natürlich auf für das erste Szenario

Ich hoffe, ich habe mein Problem sinnvoll und deutlich dargestellt. Ich wusste nicht, nach welchen Schlagwörtern ich hätte suchen sollen, deshalb habe ich einfach einen eigenen Thread eröffnet. Wenn diese Frage schon einmal beantwortet wurde, hätte ich gerne einen Verweis dorthin. Danke im Voraus =)

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Mhm, sorry wegen des Doppelpostings, aber ich wollt nur mal mitteilen, dass das Szenrio jetzt so richtig ist^^


Zuletzt bearbeitet von TM4rkuS am Fr 02.04.10 19:20, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.04.10 19:30 
// EDIT:
Wie meinst du das "aber möglichst eng beieinander"? Dass die Differenzen selbst möglichst eng beieinander liegen sollen?
TM4rkuS Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 02.04.10 19:39 
Genau. Man kann bei diesen Werten ja durchaus höhere Differenzen erreichen, wie im letzten (falschen) Beispiel gezeigt, aber das hätte zur Folge, dass andere Differenzen wiederum kleiner werden würden, und das möchte ich nach Möglichkeit verhindern.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.04.10 19:56 
Für den ersten Fall ist es einfach:
Beide Arrays sortieren und dann diese in der selben Reihenfolge kombinieren. Da kommt dann auch immer die richtige Lösung heraus.

Für den maximalen Abstand funktioniert das so nicht. Und zwar weil bei umgekehrter Reihenfolge in der Mitte die mittelgroßen Werte beider Arrays aufeinander losgelassen würden.

Da es um absolute Abstände geht, schlage ich als Lösung vor das ganze versetzt zu kombinieren. Das heißt du verschiebst das Array um die Hälfte, kombinierst also die erste Zahl des ersten Arrays mit der mittleren des zweiten usw. (und fängst dann nach der Hälfte des ersten Arrays also am Anfang des zweiten an). So kombinierst du die kleinsten Zahlen mit relativ großen des zweiten Arrays und die Größeren mit den Kleinen des zweiten Arrays. Das aber ohne kleine Abstände wie bei einer umgekehrten Sortierung, da immer das halbe Array zwischen den Zahlen liegt vom Index her.
TM4rkuS Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 02.04.10 20:14 
Okay, danke schonmal für diese Lösung =)
Der Ansatz ist super, und eigentlich müsste ich so auch weiter kommen, aber mein Gehirn streikt gerade.
Wie mache ich das jetzt, wenn ich jetzt Koordinaten-system habe, wie verfahre ich dann?

Also wenn ich jetzt wieder 2 Blöcke hab:

100|100
200|100
100|200

und

100|150
150|200
200|150

Hier würde dann so sortiert:

100|100 - 100|150
200|100 - 200|150
100|200 - 150|200

Müsste ich dann einfach die erste Koordinate mit allen anderen vergleichen (indem jeweils die Strecke im Koordinatensystem errechnet wird) und dann diejenige andere Koordinate nehmen, die von der ersten am wenigsten weit entfernt ist? Danach würde ich die errechnete Koordinate einfach aus allen anderen Berechnungen ausschließen, etwa indem ich einfach diese Zeile aus dem Array lösche. Geht das so?