Effiziente Zyklendetektion in Graphen
2005-03-12 21:42
Anarch
Moin!
Vorgeschichte:
Ich bastel gerade an einem prototypbasierten Objektsystem. Dabei habe ich das Problem, dass ich gerne bei Mehrfachvererbung (Mehrfachdelegation) einen Fehler werfen würde, wenn ein Slot von mehr als einem Prototypobjekt angeboten wird. Da die Prototypbeziehung ähnlich wie Self dynamisch modifizierbar ist, habe ich einen vollständigen Graphen und keinen gerichteten azyklischen Graphen; zudem muss ich wegen der möglichen dynamischen Änderung diese Prüfung bei jedem Slotzugriff machen.
Problem:
a) Markierungen der Objekte ist nicht möglich, da das nicht Threadsicher ist.
b) Ich kann die Objekte nicht hashen und auch keine totale Ordnung definieren, von daher keine Table und kein Tree für den lookup (wobei hierbei der Effizienzgewinn wegen des für gewöhnlich recht kleinen Graphen fraglich ist).
c) Der Algorithmus zur Zyklendetektion mit einem "Läufer" ist ungeeignet, da das bei unglücklicher Zyklenlänge recht lange dauern kann bis der terminiert. Ein Zyklus ist ja per se noch kein Fehler.
Bleibt
d) Visited-Liste mit O(n^2) Zeit und O(n) Platzkomplexität. Insbesondere die Alloziierung der Liste beisst dabei.
Frage:
Kennt jemand einen effizienteren Algorithmus?
Vorgeschichte:
Ich bastel gerade an einem prototypbasierten Objektsystem. Dabei habe ich das Problem, dass ich gerne bei Mehrfachvererbung (Mehrfachdelegation) einen Fehler werfen würde, wenn ein Slot von mehr als einem Prototypobjekt angeboten wird. Da die Prototypbeziehung ähnlich wie Self dynamisch modifizierbar ist, habe ich einen vollständigen Graphen und keinen gerichteten azyklischen Graphen; zudem muss ich wegen der möglichen dynamischen Änderung diese Prüfung bei jedem Slotzugriff machen.
Problem:
a) Markierungen der Objekte ist nicht möglich, da das nicht Threadsicher ist.
b) Ich kann die Objekte nicht hashen und auch keine totale Ordnung definieren, von daher keine Table und kein Tree für den lookup (wobei hierbei der Effizienzgewinn wegen des für gewöhnlich recht kleinen Graphen fraglich ist).
c) Der Algorithmus zur Zyklendetektion mit einem "Läufer" ist ungeeignet, da das bei unglücklicher Zyklenlänge recht lange dauern kann bis der terminiert. Ein Zyklus ist ja per se noch kein Fehler.
Bleibt
d) Visited-Liste mit O(n^2) Zeit und O(n) Platzkomplexität. Insbesondere die Alloziierung der Liste beisst dabei.
Frage:
Kennt jemand einen effizienteren Algorithmus?