Atlanx
Mitglied
Einordnung: Algorithmusproblem unter Verwendung von c++
(Da ich hier keinen Unterbereich fuer Algorithmen gefunden habe und ich in c++ programmiere, hab ich das mal hier reingestellt.)
Hallo, ich habe hier ein interessantes Problem beim Einsortieren von Paaren, die der Ordnung A < B unterliegen.
Es geht darum Polygonflaechen, zur Vereinfachung nehmen wir einfach mal Kreise, so in eine Liste einzusortieren, dass die Ordnung gewahrt bleibt.
Das heisst, am Schluss soll eine Liste L* herauskommen, in der am Anfang das Polygon steht, dass zuerst gezeichnet werden soll und am Ende das Polygon, dass zuletzt gezeichnet werden soll, so dass weiter hinten liegende Polygone nicht andere Polygone im Vordergrund ueberdecken.
Als Ausgangsmaterial habe ich eine unsortierte Liste, in der jeweils Paare gespeichert sind mit der Ordnung A < B , was bedeuted, dass B weiter hinten liegt und somit zuerst gezeichnet werden muss.
[Siehe Anhang Bild 1]
Beispiel der Ausgangsliste: L = AD, CD, BC, CA, EB, FE, FD
Eine Loesung: S = FEBCAD
Hat jemand einen Vorschlag(z.B. Sortieralgorithmen, Baumalgorithmen), wie ich da am besten rangehen soll, um das moeglichst schnell zu sortiern. (One-Pass waere halt schoen)
-------------------------------------
Meine erste Loesung sieht so aus, funktioniert aber nur, wenn die Struktur einen echten Baum ergibt, also keine Elemente mit mehr als 2 Aesten verbunden sind, wie das im dargestellten Fall der Fall ist.
Folgendes funktioniert also mit einer 4 elementigen Liste L = AD, CD, BC, CA
Algorithmus:
Liste S = NULL;
for j == 1 to k
{
if Aj element von S & Bj nicht element von S dann fuege Bj direkt hinter Aj in die Liste ein
if Aj nicht element von S & Bj element von S dann fuege Aj direkt vor Bj in die Liste ein
if Aj element von S & Bj element von S UND wenn sie in der falschen Ordnung sind,
dann loesche Element Bj aus der Liste S und ersetze Aj durch das Paar Aj,Bj
}
Ablauf:
L = AD, CD, BC, CA
1. AD > S = AD
2. CD > S = SCD
3. BC > S = ABCD
4. CA > S = C ist in der Liste und A, aber in der falschen Reihenfolge
>>> A loeschen und C durch das Paar CA ersetzen
S = BCAD
Fertig, und Ordnung stimmt. Aber wie gesagt geht das nur mit echten Baumstrukturen.
Irgendwelche Vorschlaege oder Denkanstoesse?
Vielen Dank.
(Da ich hier keinen Unterbereich fuer Algorithmen gefunden habe und ich in c++ programmiere, hab ich das mal hier reingestellt.)
Hallo, ich habe hier ein interessantes Problem beim Einsortieren von Paaren, die der Ordnung A < B unterliegen.
Es geht darum Polygonflaechen, zur Vereinfachung nehmen wir einfach mal Kreise, so in eine Liste einzusortieren, dass die Ordnung gewahrt bleibt.
Das heisst, am Schluss soll eine Liste L* herauskommen, in der am Anfang das Polygon steht, dass zuerst gezeichnet werden soll und am Ende das Polygon, dass zuletzt gezeichnet werden soll, so dass weiter hinten liegende Polygone nicht andere Polygone im Vordergrund ueberdecken.
Als Ausgangsmaterial habe ich eine unsortierte Liste, in der jeweils Paare gespeichert sind mit der Ordnung A < B , was bedeuted, dass B weiter hinten liegt und somit zuerst gezeichnet werden muss.
[Siehe Anhang Bild 1]
Beispiel der Ausgangsliste: L = AD, CD, BC, CA, EB, FE, FD
Eine Loesung: S = FEBCAD
Hat jemand einen Vorschlag(z.B. Sortieralgorithmen, Baumalgorithmen), wie ich da am besten rangehen soll, um das moeglichst schnell zu sortiern. (One-Pass waere halt schoen)
-------------------------------------
Meine erste Loesung sieht so aus, funktioniert aber nur, wenn die Struktur einen echten Baum ergibt, also keine Elemente mit mehr als 2 Aesten verbunden sind, wie das im dargestellten Fall der Fall ist.
Folgendes funktioniert also mit einer 4 elementigen Liste L = AD, CD, BC, CA
Algorithmus:
Liste S = NULL;
for j == 1 to k
{
if Aj element von S & Bj nicht element von S dann fuege Bj direkt hinter Aj in die Liste ein
if Aj nicht element von S & Bj element von S dann fuege Aj direkt vor Bj in die Liste ein
if Aj element von S & Bj element von S UND wenn sie in der falschen Ordnung sind,
dann loesche Element Bj aus der Liste S und ersetze Aj durch das Paar Aj,Bj
}
Ablauf:
L = AD, CD, BC, CA
1. AD > S = AD
2. CD > S = SCD
3. BC > S = ABCD
4. CA > S = C ist in der Liste und A, aber in der falschen Reihenfolge
>>> A loeschen und C durch das Paar CA ersetzen
S = BCAD
Fertig, und Ordnung stimmt. Aber wie gesagt geht das nur mit echten Baumstrukturen.
Irgendwelche Vorschlaege oder Denkanstoesse?
Vielen Dank.