Mailinglisten-Archive |
Hi Juri,
----- Original Message -----
From: "Juri.Smarschevski" <smj_(at)_intratools.de>
To: <php_(at)_phpcenter.de>
Sent: Monday, May 14, 2001 1:21 PM
Subject: RE: [php] Passender Allgorithmus zum Baumkinder berechnen?
> > Der baum sieht, vergleichbar mit einem directory,
> > etwa wie folgt aus:
> >
> > n name id tiefe topid
> >
> > 1 -+ Vater1 (1) (0) (0)
> > |
> > 2 +-+ Kind1 (12) (1) (1)
> > |
> > 3 +-+ Kind2 (13) (1) (1)
> > | |
> > 4 | +-+ Enkel1 (54) (2) (13)
> > | | |
> > 5 | | +-+ Urenkel1 (80) (3) (54)
> > | |
> > 6 | +-+ Enkel2 (55) (2) (13)
> > |
> > 7 +-+ Kind3 (16) (1) (1)
> >
> > 8 -+ Vater2 (7) (0) (0)
>
> Mit diesem Baum-Struktur geht's wohl nicht besser.
> Du koenntest rein theoretisch versuchen von "unten" anzufangen,
> ebene pro ebene, und schon fertige Child-Ergebnisse sollen
> beim Erfassen eines Nodes beruecksichtigt werden.
Danke, genau das ist die loesung.
Ich habe ja bei jedem array die tiefe im baum.
Nun brauche ich 2 durchlaeufe durch das komplette array $arr:
1. - Ermitteln der maximalen tiefe $maxtiefe
- Anlegen des hilfsarrays $h das einfach nur von
"id" auf "n" referenziert.
- Anlegen eines weiteren hilfsarrays $d das nach der
tiefe sortiert wiederum auf "n" referenziert.
for ($n=0; $n<count($arr); $n++) {
$h[$arr[$n]["id"]]=$r;
$d[$arr[$n]["tiefe"]][]=$n;
if ($arr[$n]["tiefe"]>$maxtiefe) $maxtiefe=$arr[$n]["tiefe"];
}
2. (Die krankeste zeile code, die ich je programmiert habe;)
- Von der tiefsten ebene angefangen jeweils die "id"
des kindes und die der eigenen kinder an den vater
uebergeben.
for ($r=$maxtiefe; $r>=0; $r--) {
for ($i=0; $i<count($d[$r]); $i++) {
$arr[$h[$arr[$d[$r][$i]]["topid"]]]["childs"].=
$arr[$d[$r][$i]]["id"].",".$arr[$d[$r][$i]]["childs"];
}
}
Es funktioniert (in dem fall nur als string mit kommatas
separiert weil ichs so leichter debuggen kann) in 2*count($arr)
schleifendurchlaeufen.
Der spaghetticode laesst sich sicher noch was optimieren
aber das ergebnis ist so doch schon ok. Damit kann ich leben.
> Die gesamte Loesung bleibt IMHO trotzdem ineffizient.
Ich glaub das ist schon recht effizient so. Es sollte bestenfalls
auch mit count($arr) schleifendurchlaeufen machbar sein aber
davon war bei dem vorliegenden array eh nicht auszugehen
und der code in den schleifen sollte vertretbar sein.
danke
_________________________________________________________
Do You Yahoo!?
Get your free _(at)_yahoo.com address at http://mail.yahoo.com
php::bar PHP Wiki - Listenarchive