¿Cuál es la complejidad de la función de división de cadenas de Java?

8

Mi cadena es de tipo "abacsdsdvvsg"o "a a a a a a a"
Y uso String[] stringArray = s.split("");o String[] stringArray = s.split(" ");
me pregunto cuál sería la complejidad (en O(string length)) para la división anterior.
PD: Sé cómo calcular O (...) si se da el código. Aquí no conozco el algoritmo de la función dividida.

tezz
fuente
Posible duplicado de ¿Qué es O (...) y cómo lo calculo?
mosquito
Como no conozco el algo de la función dividida, no creo que sea una pregunta duplicada @gnat
tezz

Respuestas:

7

La complejidad dependerá de la expresión regular que use para dividir. (Sí, el argumento que proporciona a String.split (...) es una expresión regular!)

Para su ejemplo, será O(N)donde Nestá el número de caracteres en la Cadena de entrada.

El algoritmo de división es bastante sencillo, basado en una implementación de expresiones regulares existente. Una descripción de alto nivel es:

  1. Compila la expresión regular y crea un emparejador
  2. Iterar sobre la cuerda:
    1. Use Matcher.find(...)para encontrar el límite de la siguiente palabra
    2. Use String.substring para extraer la palabra
    3. Agregar palabra a una lista de cadenas
  3. Convierta la lista de cadenas en una matriz de cadenas.

La búsqueda de los descansos entre "palabras" será O(N)o más compleja, dependiendo de la expresión regular (la findllamada). La construcción de la lista, matriz de resultados y subcadenas será O(N)en el peor de los casos.

Los detalles precisos se encuentran en el código fuente, que puede encontrar con Google. (Busque "java.lang.String" source, elija uno y luego busque la versión de Java que le interesa. O busque los archivos en el archivo ZIP de código fuente incluido en su instalación de JDK)

Stephen C
fuente
3

Es O (n) en sus casos particulares, donde está dividiendo por separadores de longitud de caracteres 1/0. En general, se puede implementar O (n + k) con un separador de caracteres k utilizando el algoritmo KMP. La división de cadenas de Java también acepta expresiones regulares como separadores, en cuyo caso su complejidad depende del algoritmo de coincidencia utilizado. Un algoritmo común de coincidencia de expresiones regulares es el algoritmo Thompson NFA.

VinyleEm
fuente