oha, doch Nachbarn der gleichen Stufe 2, Mist,
und da habe ich es ja einmal mehr viel zu einfach angegangen,
eher die minimale als maximale Tiefe, wie für Baum nötig,
dann schlage ich immer noch spontan vor, ich hoffe das geht dir nicht zu sehr gegen den Sinn deines Threads, vielleicht nur professionelle Links zu bekommen
:
etwas in Richtung deiner Breitensuche, nur etwas anders, nur von außen angefangen,
und noch optimiert um hoffentlich die Arbeit etwas zu reduzieren
dein Beispiel vergrößere ich auf
U1--O1
|
U2--O2
|
U3--O3
|
P4--Q4--R4--S4--T4--A4--B4--C4--D4--U4--O4
|
U5--O5
|
U6--O6
|
U7--O7
|
U8--O8
|
U9--O9
die Bezeichungen sind hier nur Deutlichkeit, haben keine Funktion
(zwischendurch auch paar mal am Beispiel geändert, nicht wundern wenn mal falsche Knotennamen genannt werden)
begonnen wird immer noch bei den gefundenen Blättern, O1-O9, Tiefe 1, auch O4,
danach geht es zu allen U, auch U4, eben die Nachbarn,
die neue Nachbarmenge bestimmen, enthält nun zahlreiche bekannte Elemente, die weiter verfolgt werden müssen,
nahe deiner Breitensuche wäre erstmal die Variante, von jedem Startpunkt aus in alle Richtungen zu arbeiten:
etwa von O8 bis runter nach O9 mit Tiefe dort dann 4, auf dem Weg 1, 2, 3,
diese Tiefen müssen mit den Kanten verbunden werden (hier vielleicht noch nicht wichtig,
aber für später, gleich mal eingeführt):
U9 hat von oben (durch die Suche von O8 kommend) her die Tiefe 3, von rechts her Tiefe 2,
später kommt von O7 aus die Suche nach O9 vorbei, U9 bekommt dann überschrieben, da größer,
Tiefe 4 von oben kommend usw.,
zwischen O9 und O4 ist letzlich der längste Weg,
O4 hat von links die höchste Tiefe 17 oder so, O9 von links auch,
das Ziel ist nun der Knoten, welcher von allen Seiten die niedrigsten Eingänge hat,
O4 und O9 mit 17 sicher nicht, U9 und U4 mit Tiefe 16 auch nicht,
das Optimum liegt bei R4 oder so, keine Kante dürfte mehr als 9 haben oder so,
das ist dein Ziel, ein erster neuer Algorithmus (edit: unten wird letztlich noch anderes draus, nur zu verstehen (falls überhaupt) wenn alles gelesen),
vielleicht jetzt schon bisschen besser als n^2, kannst du ja evtl. testen, allein durch Zählen,
aber in erster Linie hoffe ich auf Korrektheit
-----
Optimierung:
nicht sklavisch von allen Blättern aus überall hinwandern, sondern anhand der Zwischenergebnisse
überflüssige Arbeit vermeiden, hier werden nun die Tiefen an Kanten wichtig,
vorher hätte wohl doch auch nur eine Tiefe pro Knoten gereicht:
nachdem alle O gefunden sind bekommen alle U auf einer Kante die Tiefe 2,
im nächsten Schritt gibt es auch noch keine Konflikte,
von U8 aus etwa bekommt U7 mit der unteren Kante die Tiefe 3,
von U7 aus bekommt U8 mit der oberen Kante die Tiefe 3 usw.,
alle U sind nun ziemlich 'bedient',
wobei aber etwa U4 von links noch nichts hat, U3 von unten noch nichts usw.
dabei muss irgendwie gemerkt werden, welche Aktionen/ Prozesse noch 'laufen', weiter wandern wollen,
die müssen ihre Richtung und Tiefe kennen usw.,
was war weiter oben vor der Optimierung auch schon nötig, nicht zu genau beschrieben
im nächsten Schritt gibt es jedenfalls erstmals gewisse Kollisionen,
etwa hatte ja U8 von unten aus die Kante mit 3 bezeichnet, das läuft nun weiter nach U7,
dort gibt es bereits einen ProzessO8 der von O8 kommend eine 3 an die Südkante von U7 schrieb,
der neue ProzessO9, von O9 gestartet, ist nun mit 4 an dieser Kante überlegen,
daran muss festgestellt werden, dass ProzessO8 abgebrochen werden kann, muss gar nicht mehr
weit bis O4, O1 usw. laufen, ProzessO9 wird in jedem Fall besser sein,
die ganze Arbeite von ProzessO8 kann eingestampft werden, zumindest in Richtung von U7 nach oben,
alles was in diesem Zusammenhang läuft, vielleicht schon verzweigt mehrere Wege, aber hoffentlich gemerkt
mit U7 als Zwischenstation, wird nicht weiter verfolgt,
die eingetragenen Kantenwerte usw. (wobei ich inzwischen bezweifle, dass man das so direkt umsetzt)
können stehenbleiben, werden bald von ProzessO9 überschrieben,
in diesem, noch nicht gerade 100% genauen Sinne, laufen mit der Zeit immer weniger Prozesse,
ein paar überleben aber, auch sind die Richtungen zu beachten
wenn etwa ProzessO9 bei P4 von unten ankommt, dann sind die ProzesseO5-O8 Geschichte (zumindest in nördliche Richtungen),
von oben aber läuft noch der sich durchgesetzte ProzessO1, ist schon nach rechts bis R4 gelangt,
im nächsten Schritt wird auch der gekillt, ProzessO9 ist besser in diese Richtung,
ProzessO1 läuft aber noch in südliche Richtung nach U5 usw. weiter, das ist wichtig,
wäre der 4er-Strang kürzer, hätte ProzessO1 den Prozess von dort vielleicht gekillt oder andersrum,
ich habe ihn hier extra lang gelassen so dass der noch längst nicht da ist
und erst später ProzessO1 ersetzt
soweit mal wieder ein Punkt, ist viel zu lang geworden, ich kann verstehen falls du das nicht mögen solltest
,
aber ist eine Variante, gibts vielleicht sogar offiziell
-----
und noch länger:
weitere Optimierungen, die mir noch einfallen:
wenn es Ketten wie die 4er hier gibt, mit nur einen Nachfolger jeweils, dann die bevorzugt bis zur
ersten Kreuzung führen, das würde hier verhindern, dass ProzessO1 alles bis nach ganz unten
durchrechnet, bis dann ProzessO4 alles überschreibt,
anderseits tritt das in der Realität wohl nicht so oft auf,
reizvoll wäre andersrum noch, dass ProzessO1 vielleicht schon weit kommt/ fertig ist nach Süden,
beim Kill durch ProzessO4 dann aber alle Ergebnisse 1:1 übernommen werden, nur mit höherer Tiefe,
was anderes kann ja kaum rauskommen wenn ProzessO1 da selber nochmal langläuft,
----
vielleicht ist es generell sinnvoll (um den obigen Ablauf weitgehend auf den Kopf zu stellen!),
erstmal einen Prozess komplett durchlaufen zu lassen:
zufällig gewählt z.B. ProzessO7 als ersten, der hat viele Wege zu alle Ecken,
im wesentlichen drei (wie intern modeliert lasse ich offen), nach O9 im Süden,
nach O4 und nach O1, aber auch zu allen anderen O Teilwege,
danach ist zufällig ProzessO8 dran, der kommt erst normal bis U8, von rechts hatte U8 ja bisher gar nichts,
von U8 nach oben, also die untere Kante von U7, ist auch noch unbesetzt,
nach unten aber, Richtung U9, hat ProzessO7 schon einen stattlichen Weg/ eine Tiefe gesetzt, die ProzessO8
nicht toppen kann, da aufhören,
nach oben zu U7 geht es noch weiter, nach rechts zu O8 auch, weiter nach oben Zu U6 ist jetzt
ProzessO8 'besser' als ProzessO7, sämtliche Wege mit neuer korrekter höherer Tiefe übernehmen,
ProzessO7 kann diese alle vergessen, ruhigen Gewissens durchaus als Objekte abgeben, bleibt aber
nach Süden noch zu O8 und O9 'im Spiel'
so geht das weiter, Wege werden übernommen, neu hinzugefügt, am Ende bleiben durchaus eine Menge über,
daraus ergeben sich die Eingangs-Kanten-Gewichte und immer noch R4 (oder so
)
dieses 'Übernehmen von Wegen' kann andererseits auch im laufenden Betrieb geschehen,
wäre nicht so schlimm wenn wie oben alle Prozesse gleichzeitig starten,
falls aber anscheinend nacheinander kein Nachteil ist, dann ist nacheinander sicher übersichtlicher und zu bevorzugen!
puh, rekordverdächtiges Posting, ich hoffe nun auch für dich, dass irgendjemand noch eine Zeile mit Link postet
welche Komplexität da herauskommen würde, wäre anhand eines Beispiels interessant,
formal vielleicht immer noch n^2, aber mit so vielen Abkürzungen, dass es in der Realität deutlich schneller geht