Cómo verificar si una cadena es un prefijo de otra cadena en O (1)

Sin precomputación o sin limitar el tamaño del prefijo: no es posible.

Con la precomputación, desearía comenzar con un enfoque de internamiento de cadena para poder determinar la identidad de la cadena en O (1), por ejemplo, cada cadena distinta tiene exactamente un puntero único.

Tendría que suponer que la entrada es una cadena interna. Si se trata de un valor para el que no conoce la cadena interna única correspondiente, lleva tiempo encontrarla.

Puede lograrlo trivialmente usando un espacio cuadrático para una tabla de búsqueda, en el número de cadenas. Pero puedes hacerlo mejor que eso.

Si almacena todas las cadenas en un árbol, donde cada nodo apunta a los hijos cuyo prefijo más largo es el padre, puede hacerlo mejor. Un enfoque simple sería un trie, y hay formas de comprimir el trie si de otra manera desperdiciara mucho espacio.

Entonces necesita alguna anotación almacenada en este árbol para admitir su búsqueda O (1) de relaciones ancestrales / descendientes.

Un enfoque (llamado esquema de numeración de Dietz, desarrollado para XML) es almacenar la numeración de pedidos anticipados y posteriores de cada nodo. Entonces puedes usar esta propiedad:

Para dos nodos dados x e y de un árbol T, x es un antecesor de y si y solo si x ocurre antes de y en el recorrido previo al pedido de T y después de y en el recorrido del orden posterior.

Si el número de búsquedas de prefijos >> el número de cadenas, podría mejorar el rendimiento general con este tipo de esquema de búsqueda O (1), a expensas del espacio y la preparación. Esto también supone que puede limitar el número de entradas de cadena, por lo que es una trampa porque no puede darle la respuesta hasta que tenga las cadenas preparadas de esta manera … pero esta es una restricción común en el mundo real. Las cosas están en la memoria de antemano.

Entonces puedes, pero solo si engañas un poco el significado de la pregunta. La respuesta directa es que no puedes.

Para un prefijo de longitud [math] n [/ math], deberá verificar a lo sumo [math] n [/ math] caracteres en la cadena. Ese es un algoritmo [matemático] O (n) [/ matemático].

Si limita el tamaño del prefijo o cadena, eso es [matemática] O (1) [/ matemática] y realmente no es interesante.

Sea n la longitud del prefijo potencial p, y sea s la gran cadena. Para cada i en [0..n-1] en paralelo, verifique si p [i] = s [i], y devuelva la conjunción de todas las respuestas.

Podría realizarse en O (1) en un circuito booleano adecuado (clase de complejidad AC0) o en un modelo de cálculo paralelo. Sin embargo, no es posible en un solo procesador.

Imposible. Tendrá que pasar por cada carácter de la cadena más pequeña para establecer que efectivamente es un sufijo.

Feliz codificación

Salud.

More Interesting

¿Existe algún algoritmo de procesamiento de imágenes para mejorar tanto la calidad como la resolución de una imagen usando otras imágenes de la misma área?

¿Qué es una cadena de Markov?

Cómo determinar si un algoritmo informático es complejo o no

¿Cuál es el algoritmo de coincidencia utilizado por las declaraciones de consulta SQL del servidor SQL como "Me gusta 'A%'", "Me gusta '% A'" o "Me gusta '% A%'"?

¿Es mejor representar aristas en un gráfico que sale de un vértice como miembros de una matriz dinámica o una lista vinculada?

Cómo analizar los detalles del problema en el concurso de codificación

¿Cuáles son los algoritmos que se pueden usar en aplicaciones web del mundo real además de ordenar o buscar?

¿Qué tan difícil es aprender por sí mismo cómo codificar algoritmos eficientes?

¿Puede la búsqueda de profundización iterativa encontrar una solución más rápida que A * en algunos casos?

¿Cómo podemos verificar si un punto (digamos el origen) se encuentra en un casco convexo 6-D (o ND) y qué tan lejos está el punto de cualquiera de los lados (facetas) del casco convexo?

¿Cuál es el propósito del factor de carga en las tablas hash?

Cómo resolver / pensar en funciones recursivas complejas

¿Qué algoritmos debe saber un estudiante de informática de segundo año?

Cómo mostrar el límite de (1 + a_n / n) ^ n = e ^ a si el límite de a_n = a cuando n se aproxima al infinito

¿Cuándo la piratería se convirtió en algo malo? Pensé que hackear era una forma inteligente / ingeniosa de desarrollar un algoritmo para resolver un problema.