J'ai fait quelques lectures sur la complexité temporelle, et j'ai les bases couvertes. Pour renforcer le concept, j'ai regardé une réponse que j'ai donnée récemment sur SO. La question est maintenant close, pour raison, mais ce n'est pas le but. Je n'arrive pas à comprendre quelle est la complexité de ma réponse, et la question était close avant que je puisse avoir un retour utile.Complexité temporelle de cet algorithme
The task était de trouver le premier caractère unique dans une chaîne. Ma réponse était quelque chose de simple:
public String firstLonelyChar(String input)
{
while(input.length() > 0)
{
int curLength = input.length();
String first = String.valueOf(input.charAt(0));
input = input.replaceAll(first, "");
if(input.length() == curLength - 1)
return first;
}
return null;
}
Ma première pensée était que puisqu'il regarde chaque personnage, puis regarde à chaque fois pendant replaceAll()
, il serait O (n^2).
Cependant, cela m'a fait penser à la façon dont cela fonctionne réellement. Pour chaque caractère examiné, il supprime toutes les occurrences de ce caractère dans la chaîne. Donc, n
diminue constamment. Comment cela compte-t-il? Est-ce que cela fait O (log n), ou y a-t-il quelque chose que je ne vois pas?
Ce que je vous demande:
Quelle est la complexité temporelle de l'algorithme comme il est écrit, et pourquoi?
Ce que je ne demande pas:
Je ne cherche pas des suggestions pour l'améliorer. Je comprends qu'il y a probablement de meilleurs moyens de le faire. J'essaie de mieux comprendre le concept de complexité du temps, de ne pas trouver la meilleure solution.
*** ce *** est n ?? – UmNyobe
La longueur de la chaîne d'entrée, j'imagine. – Geobits
Je pense que cela dépend d'un certain nombre de choses: 1) 'longueur()' doit-elle compter chaque caractère de la chaîne à chaque fois, ou est-ce que la longueur est stockée séparément afin qu'elle puisse être retournée sans balayage linéaire? 2) Si 'longueur()' est linéaire, nous souvenons-nous au moins du résultat pour les appels ultérieurs? 3) Quel type de gestion de la mémoire est utilisé par la classe - est-ce que l'effacement d'un caractère est une simple opération à temps constant ou nécessite-t-il une recopie linéaire du reste de la chaîne? 4) Quand, si jamais, les effacements cumulatifs provoquent une réaffectation et une copie? Et ainsi de suite ... – twalberg