web-dev-qa-db-fra.com

Quelle est la complexité de la fonction de séparation des chaînes de Java?

Ma chaîne est de type "abacsdsdvvsg" Ou "a a a a a a a"
Et j'utilise String[] stringArray = s.split(""); ou String[] stringArray = s.split(" ");
Je me demande quelle serait la complexité (dans O(string length)) pour le fractionnement ci-dessus?
PS: Je sais calculer O(...) si le code est donné. Ici je ne connais pas l'algorithme de la fonction split.

8
tezz

La complexité dépendra de l'expression rationnelle que vous utilisez pour effectuer le fractionnement. (Oui, l'argument que vous fournissez à String.split (...) est une expression régulière!)

Pour votre exemple, ce sera O(N)N est le nombre de caractères dans la chaîne d'entrée.

L'algorithme de fractionnement est assez simple, basé sur une implémentation regex existante. Une description de haut niveau est:

  1. Compiler l'expression régulière et créer un matcher
  2. Itérer sur la chaîne:
    1. Utilisez Matcher.find(...) pour trouver la prochaine limite de Word
    2. Utilisez String.substring pour extraire le Word
    3. Ajouter Word à une liste de chaînes
  3. Convertissez la liste des chaînes en un tableau de chaînes.

La recherche des coupures entre les "mots" sera O(N) ou plus complexe, selon l'expression régulière (l'appel find). La construction de la liste, du tableau de résultats et des sous-chaînes sera O(N) dans le pire des cas.

Les détails précis sont dans le code source, que vous pouvez trouver en utilisant Google. (Rechercher "Java.lang.String" source, choisissez-en un, puis accédez à la version de Java qui vous intéresse. Ou recherchez les fichiers dans le fichier Zip de code source inclus dans votre installation JDK)

7
Stephen C

Son O(n) dans vos cas particuliers, où vous divisez par des séparateurs de longueur de 1/0 caractère. En général, c'est O (n + k) avec un séparateur de k caractères, peut être implémenté en utilisant l'algorithme KMP. Java string split accepte également les regexes comme séparateurs, auquel cas sa complexité dépend de l'algorithme de correspondance utilisé. Un algorithme de correspondance de regex commun est l'algorithme Thompson NFA.

3
VinyleEm