Ich bin festgefahren, wenn ich die zeitliche Komplexität des folgenden Algorithmus analysiere:
def fun (r, k, d, p):
if d > p:
return r
if d = 0 and p = 0:
r <- r + k
return r
if d > 0:
fun (r, k + 1, d - 1, p)
if p > 0:
fun (r, k - 1, d, p - 1)
Der Root-Aufruf wird fun (0, 0, n, n)
und n
ist die Größe des Problems.
Ich denke das: Die Wiederholungsrelation ist , was und somit .
Ist meine Analyse korrekt (ich weiß, dass sie nicht sehr vollständig und genau ist)? Wenn es einen schwerwiegenden Fehler gibt, weisen Sie bitte darauf hin oder zeigen Sie mir einen korrekten und vollständigen Beweis für die zeitliche Komplexität dieses Algorithmus.
d>0
als auch p>0
. Sie zeigen nicht, was die Funktion zurückgibt, wenn wir die 3. und 4. if-Anweisung erreichen. Wollten Sie return
nach jedem rekursiven Aufruf von eine Anweisung haben fun
? (Wollten Sie fun (r, k + 1, d - 1, p)
es sein return fun (r, k + 1, d - 1, p)
?) Oder wollten Sie eine return
Aussage ganz am Ende des Funktionskörpers haben? Bitte bearbeiten Sie Ihren Pseudocode, um zu verdeutlichen und sicherzustellen, dass Sie zeigen, was dies in allen möglichen Fällen zurückgibt.
d<=p
und d>0
und p>0
alle halten. Was soll passieren? Führt der Algorithmus zwei rekursive Aufrufe der Funktion durch? Oder ruft es rekursiv auf fun(r, k + 1, d - 1, p)
und kehrt dann sofort zurück, ohne rekursiv aufzurufen fun(r, k - 1, d, p - 1)
? Wenn ich Ihren Pseudocode wörtlich nehme, scheint es, dass er zwei rekursive Aufrufe ausführt und dann mit einem undefinierten Rückgabewert zurückkehrt - aber das scheint seltsam und lässt mich fragen, ob der Pseudocode einen Tippfehler enthält.