2016-05-10 10 views
3

Ich analysiere die Komplexität meines Codes. Aus was ich online gefunden habe, da Strings in Python unveränderlich sind, sollte eine Verkettung eines Strings und eines Zeichens O (len (string) + 1) sein.Zeit Komplexität der String-Verkettung in Python

Nun, hier ist mein Stück Code (vereinfacht):

word = "" 
for i in range(m): 
    word = char_value + word 
return word 

Die Gesamtzeit Komplexität sein sollte:

(0 + 1) + (1 + 1) + ... + m = m (m + 1)/2 = O (m^2)

Ist das korrekt?

+0

Was zählen Sie: walclock Zeit, Anzahl der Operationen? Ich bezweifle, dass die Verkettung von 'm' Strings in' m' quadratisch ist. –

+0

Anzahl der Operationen, z.B. die Zuweisung einer Zeichenkette von n Zeichen sollte n ... – Generalbrus

+0

Warum sollte die Zuweisung einer Zeichenkette der Länge '2m' doppelt so lange dauern wie die Zuweisung einer Zeichenkette der Länge 'm'? –

Antwort

6

Ja, in Ihrem Fall * 1 Zeichenfolge Verkettung erfordert alle Zeichen kopiert werden, dies ist eine O (N + M) -Operation (wobei N und M sind die Größen der Eingabezeichenfolgen). M, die mit dem gleichen Wort angehängt sind, werden zu O (M^2) Zeit neigen.

Sie können dieses quadratische Verhalten vermeiden, indem str.join() mit:

word = ''.join(list_of_words) 

, die nur dauert O (N) (wobei N die Gesamtlänge des Ausgangs ist). Oder, wenn Sie ein einzelnes Zeichen wiederholen, können Sie verwenden:

word = m * char 

Sie sind Voranstellen Zeichen, sondern der Aufbau eine Liste zuerst, dann ist es umgekehrt (oder mit einem collections.deque() Objekt erhalten O (1) vorangestellt Verhalten) wäre immer noch O (n) -Komplexität, leicht schlagen Sie Ihre O (N^2) Wahl hier.


* 1 Ab Python 2.4, vermeidet die CPython Implementierung ein neues String-Objekt erstellen, wenn strA += strB oder strA = strA + strB verwenden, aber diese Optimierung ist sowohl zerbrechlich und nicht tragbar. Da Sie strA = strB + strA (vor) verwenden, gilt die Optimierung nicht.

+0

Nein, ich kann beide Dinge nicht tun. Wie gesagt, mein Code oben ist vereinfacht, die Zeichen, die ich betrachte, sind unterschiedlich und das Einfügen in eine Liste würde den Code am Ende nicht optimieren. – Generalbrus

+0

@Generalbrus: Wenn man sie in eine Liste einträgt, würde das quadratische Verhalten vermieden, so dass * definitiv * die Leistung optimiert wird. –

+0

Von der Art, wie ich auf die Zeichen zugreife (sie sind in einem Trie), müsste ich die Liste, die ich vor dem Beitritt erstellt habe, umkehren, also denke ich, dass ich lieber Char-Arrays anstelle von Strings betreibe. Danke für die Tipps aber. – Generalbrus

Verwandte Themen