2016-11-28 2 views
1

Problem: Finden Sie die beste Möglichkeit, eine Stange der Länge zu schneiden n Jeder Schnitt ist Integerlänge Nehmen Sie an, dass jede Länge i Stab hat einen Preis p (i) Gegeben: Stab der Länge n und eine Liste von Preisen p, die den Preis für jede mögliche ganze Zahl zwischen 0 und n angibt.Finden der zeitlichen Komplexität eines Exponentialalgorithmus

Finden Sie den besten Satz von Schnitten, um den Höchstpreis zu erhalten Kann eine beliebige Anzahl von Schnitten verwenden, von 0 bis n-1 Es gibt keine Kosten für einen Schnitt.

Nachstehend präsentiere ich einen naiven Algorithmus für dieses Problem.

CUT-ROD(p,n) 
if(n == 0) 
    return 0 
q = -infinity 
for i = 1 to n 
    q = max(q, p[i]+CUT-ROD(p,n-1)) 
return q 

Wie kann ich beweisen, dass dieser Algorithmus exponentiell ist? Schritt für Schritt. Ich kann sehen, dass es exponentiell ist. Ich kann es jedoch nicht beweisen.

+0

Sollte der rekursive Aufruf nicht 'CUT-ROD (p, n - i)' sein? Ansonsten kann sich die Gesamtlänge der Schnitte auf mehr als die Länge der Stange addieren. –

+0

Wie geschrieben, kann man durch Induktion beweisen, dass 'CUT-ROD (p, n)' n macht! total rekursive Aufrufe (für n> = 1). –

+0

OK, Paul. Aber wie können wir das tun? Kannst du mir helfen? – Zaratruta

Antwort

0

Lassen Sie uns den Code in C++ für Klarheit übersetzen:

int prices[n]; 
int cut-rod(int n) { 
    if(n == 0) { 
    return 0; 
    } 
    q = -1; 
    res = cut-rod(n-1); 
    for(int i = 0; i < n; i++) { 
    q = max(q, prices[i] + res); 
    } 
    return q; 
} 

Anmerkung: Wir sind das Caching das Ergebnis of cut-rod(n-1) unnötig zu vermeiden, dass die Komplexität des Algorithmus zu erhöhen. Hier können wir sehen, dass cut-rod(n) ruft cut-rod(n-1), die cut-rod(n-2) und so weiter auf cut-rod(0) ruft. Für cut-rod(n) sehen wir, dass die Funktion über das Array n mal iteriert. Daher ist die Zeitkomplexität des Algorithmus gleich O(n + (n-1) + (n-2) + (n-3)...1) = O(n(n+1)/2), was ungefähr gleich O((n^2)/2) ist.

EDIT: Wenn wir den exakt gleichen Algorithmus wie der in der Frage verwenden, seine Zeitkomplexität O (n!), Da Schnitt Stange (n) nennen Schnitt Stange (n-1) n mal. Cut-Rod (n-1) ruft Cut-Rod (n-2) n-1 mal und so weiter. Daher ist die Zeitkomplexität gleich O (n * (n-1) * (n-2) ... 1) = O (n!).

+0

Aber nach Ihrer Analyse wächst die Laufzeit dieses Algorithmus quadratisch proportional zur Eingangslänge. In dem Buch von Cormen wird jedoch gesagt, dass der Algorithmus exponentiell ist. – Zaratruta

+0

Wenn Sie den Algorithmus mit n = 4 simulieren, werden Sie sehen, dass es 16 rekursive cals ausführt. Das heißt, es ist in der Tat 2^n – Zaratruta

+0

http://ideone.com/UF1pnW Wie führt es 16 rekursive Aufrufe? – Mitsos101

Verwandte Themen