2016-12-10 2 views
2

Ich versuche, die Zeit Komplexität eines rekursiven Algorithmus zu analysieren, der das Generate all sequences of bits within Hamming distance t Problem löst. Der Algorithmus ist dies:Zeit Komplexität des rekursiven Algorithmus mit zwei rekursiven Aufrufe

// str is the bitstring, i the current length, and changesLeft the 
// desired Hamming distance (see linked question for more) 
void magic(char* str, int i, int changesLeft) { 
     if (changesLeft == 0) { 
       // assume that this is constant 
       printf("%s\n", str); 
       return; 
     } 
     if (i < 0) return; 
     // flip current bit 
     str[i] = str[i] == '0' ? '1' : '0'; 
     magic(str, i-1, changesLeft-1); 
     // or don't flip it (flip it again to undo) 
     str[i] = str[i] == '0' ? '1' : '0'; 
     magic(str, i-1, changesLeft); 
} 

Was ist die zeitliche Komplexität dieses Algorithmus?


ich lieb ich ziemlich rostig, wenn es dazu kommt und hier ist mein Versuch, die ich fühle, ist nicht annähernd die Wahrheit:

t(0) = 1 
t(n) = 2t(n - 1) + c 
t(n) = t(n - 1) + c 
    = t(n - 2) + c + c 
    = ... 
    = (n - 1) * c + 1 
    ~= O(n) 

wo n die Länge der Bit-Kette.

Verwandte Fragen: 1, 2.

Antwort

5

Es ist exponentiellen:

t(0) = 1 
t(n) = 2 t(n - 1) + c 
t(n) = 2 (2 t(n - 2) + c) + c   = 4 t (n - 2) + 3 c 
    = 2 (2 (2 t(n - 3) + c) + c) + c = 8 t (n - 3) + 7 c 
    = ... 
    = 2^i t(n-i) + (2^i - 1) c   [at any step i] 
    = ... 
    = 2^n t(0) + (2^n - 1) c   = 2^n + (2^n - 1) c 
    ~= O(2^n) 

Oder mit Wolframalpha: https://www.wolframalpha.com/input/?i=t(0)%3D1,+t(n)%3D2+t(n-1)+%2B+c

Der Grund ist es exponentiell ist, dass Ihre rekursive Aufrufe von 1 das Problem Größe reduzieren, aber Sie machen zwei rekursive Anrufe. Ihre rekursiven Aufrufe bilden einen binären Baum.

+0

Ergebnis fühlt sich an wie Aziz, aber könnten Sie bitte die Intuition erklären? Ich meine, wie Sie diese Antwort ausgearbeitet haben. Lerne den Mann zu fischen, gib ihm nicht nur den Fisch! : D – gsamaras

+0

Diese Methode zur Lösung der Rekursionsbeziehung wird "telescoping" genannt. Sie ersetzen grundsätzlich die Funktion t (n) immer wieder, bis Sie ein Muster in der Relation (für einen gegebenen Schritt "i") bestimmen können. Dann können Sie den letzten Schritt mit t (0) bestimmen, was die Lösung ist. – Aziz

+0

Dank Aziz sehr, sollten wir nicht irgendwie das 'changesLeft' in die Gleichung einführen? Ich meine in [iterative Version, wir haben] (http://stackoverflow.com/questions/41086928/time-complexity-of-an-iterative-algorithm), es heißt dort "dist" (ich versuche, sie zu vergleichen theoretisch). Ich weiß, dass wir bei gegebenem "changesLeft" ("n' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' ')' printf ("% s \ n ", str);'. Ich habe eine [relevante Frage] gestellt (http://stackoverflow.com/questions/41105621/trying-to-compare-a-recursive-and-iterative-algorithmus); Wenn Sie Zeit haben, schauen Sie doch mal rein! :) – gsamaras

Verwandte Themen