web-dev-qa-db-fra.com

Complexité temporelle de la concaténation de chaînes en Python

J'analyse la complexité de mon code. D'après ce que j'ai trouvé en ligne, puisque les chaînes sont immuables en python, une concaténation d'une chaîne et d'un caractère devrait être O(len(string) + 1).

Maintenant, voici mon morceau de code (simplifié):

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

La complexité temporelle totale doit être:

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

Est-ce correct?

11
cwbrd

Oui, dans ton cas*1 la concaténation de chaînes nécessite la copie de tous les caractères, il s'agit d'une opération O (N + M) (où N et M sont les tailles des chaînes d'entrée). M ajoute du même mot aura tendance à O (M ^ 2) le temps pour cela.

Vous pouvez éviter ce comportement quadratique en utilisant str.join():

Word = ''.join(list_of_words)

qui ne prend que O(N) (où N est la longueur totale de la sortie). Ou, si vous répétez un seul caractère, vous pouvez utiliser:

Word = m * char

Vous ajoutez des caractères au début, mais vous commencez par créer une liste, puis l'inversez (ou utilisez un objet collections.deque() pour obtenir O(1) comportement de pré-ajout) serait toujours O(n) complexité, battant facilement votre choix O (N ^ 2) ici.


*1 À partir de Python 2.4, l'implémentation CPython évite de créer un nouvel objet chaîne lors de l'utilisation de strA += strB Ou strA = strA + strB, Mais cette optimisation est à la fois fragile et non portable. vous utilisez strA = strB + strA (au début) l'optimisation ne s'applique pas.

25
Martijn Pieters