Algoritmo del administrador

Algoritmo del administrador
objetivo Buscar subpalíndromos
Estructura de datos Línea
peor momento
costo de memoria

El algoritmo de Manacher es un  algoritmo con tiempo de ejecución lineal que le permite obtener información sobre todas las subcadenas palindrómicas de una cadena dada en forma comprimida . Introducido por Glenn Manaker en 1975. La tarea inicial resuelta por el algoritmo era encontrar el prefijo-palíndromo más pequeño de una cadena dada, pero la estructura obtenida como resultado de la operación del algoritmo permite resolver problemas más generales. Entonces, Manaker demostró que el algoritmo le permite verificar si una cadena se puede representar en la forma , donde  , alguna cadena  , es su inversión. En 1995, Apostolico, Breslauer y Galil señalaron que, por diseño, el algoritmo de Manaker no solo encuentra el prefijo palindrómico más corto, sino que también encuentra el radio palindrómico máximo para cada centro posible de una subcadena palindrómica.

Planteamiento del problema

El algoritmo de Manaker te permite encontrar en tiempo lineal los radios máximos de los palíndromos pares e impares en cada posición de la cuerda .

Implementación

A continuación se muestra la implementación del algoritmo en Python .

def manager_odd ( s ): s = '$' + s + '^' n = len ( s ) res = [ 0 ] * n l = 0 r = 0 for i in range ( 1 , n - 1 ): res [ i ] = max ( 0 , min ( r - i , res [ l + ( r - i )])) while s [ i - res [ i ]] == s [ i + res [ i ]]: res [ i ] += 1 si i + res [ i ] > r : l = i - res [ i ] r = i + res [ i ] return res [ 1 : - 1 ] def manacher ( s ): res = manacher_odd ( '#' + '#' . join ( s ) + '#' )[ 1 : - 1 ] return ([ x // 2 for x in res [:: 2 ]] , [ x // 2 para x en resolución [ 1 :: 2 ]])

La función manacher_odddevuelve una matriz Manaker para palíndromos de longitud impar, la función manacherdevuelve un par de matrices Manaker para palíndromos de longitudes pares e impares, respectivamente, reduciendo el cálculo de una matriz para longitudes pares a un caso impar al agregar un carácter de servicio #.

Literatura