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?
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.