Arreglo de Sufijos
Tipo Arreglo
Inventado por Manber y Myers (1990)
Complejidad temporal
in Notación big O
Caso promedio Caso Peor
Espacio
Construcción

En Ciencias de la Computación un arreglo de sufijos es un arreglo ordenado de todos los sufijos de una cadena dada. Esta estructura de datos es muy simple, sin embargo es muy poderosa y es usada en algoritmos de compresión de datos y dentro del campo de la bioinformática , indización de textos completos, entre otros.

Los arreglos de sufijos fueron introducidos por Manber y Myers (1990) como una simple variante eficiente en espacio a los árboles de sufijos. Estos fueron descubiertos independientemente por Gonnet, Baeza-Yates y Snider (1992) bajo el nombre de arreglo PAT.

Definición

editar

Sea una cadena y sea la subcadena de que va desde el índice hasta .

El arreglo de sufijos de la cadena va a ser un arreglo de enteros brindando las posiciones iniciales de los sufijos de en orden lexicográfico. Esto significa que contiene la posición inicial del -esimo sufijo más pequeño en y por tanto se cumple que para todo : .

Ejemplo

editar

Consideremos el texto a ser indexado:

i 1 2 3 4 5 6 7
S[i] b a n a n a $

El texto termina con el carácter especial $ el cual debe ser único dentro de la cadena y lexicográficamente más pequeño que cualquier otro carácter.El texto contiene los siguientes sufijos:

Suffix i
banana$ 1
anana$ 2
nana$ 3
ana$ 4
na$ 5
a$ 6
$ 7

Estos sufijos pueden ser ordenados :

Suffix i
$ 7
a$ 6
ana$ 4
anana$ 2
banana$ 1
na$ 5
nana$ 3

El arreglo de sufijos conteniendo las posiciones iniciales de los sufijos ordenados :

i 1 2 3 4 5 6 7
A[i] 7 6 4 2 1 5 3

Por ejemplo, contiene el valor y por tanto se refiere al sufijo que empieza en la posición dentro de , el cual es el sufijo .

Correspondencia con Árboles de Sufijos

editar

Los arreglos de sufijos están muy relacionados con los árboles de sufijos:

  • Los arreglos de sufijos pueden ser construidos ejecutando una búsqueda en profundidad en un árbol de sufijos.El arreglo de sufijos se corresponde con las etiquetas-hojas dadas en el orden en que se visitó durante el recorrido, si las aristas fueron visitadas en orden lexicográfico de su primer carácter.
  • Un árbol de sufijos puede ser construido en tiempo lineal usando una combinación de sufijos y un arreglo de prefijos comunes.

Ha sido demostrado todo algoritmo de árbol de sufijos puede ser sistemáticamente reemplazado con un algoritmo que use un arreglo de sufijos unido con información adicional (como un arreglo de prefijos comunes) y resuelve el mismo problema y con la misma complejidad temporal.[1]​ Las ventajas de los arreglos de sufijos sobre los árboles de sufijos incluyen mejoras en los requerimientos de espacio y algoritmos simples de construcción en tiempo linear (e.g., comparados con el Algoritmo de Ukkonen).

Eficiencia en espacio

editar

Los arreglos de sufijos fueron introducidos por Manber y Myers (1990) para obtener una mejora en cuanto a los requerimientos en espacio de los árboles de sufijos : los arreglos de sufijos guardan enteros.Asumiendo que un entero requiere bytes, un arreglo de sufijos requiere un total de implementación bytes. Esto es significantemente mucho menor que los bytes requeridos en implementación cuidadosa de un árbol de sufijos.[2]

Sin embargo, en ciertas aplicaciones, los requerimientos en espacio de los arreglos de sufijos pueden ser prohibitivos.Analizando en cuanto a bits, un arreglo de sufijos requiere un espacio de , donde el texto original sobre un alfabeto de longitud require solamente bits.

Algoritmos de construcción

editar

Una primera idea para construir un arreglo de sufijos es usar un método de ordenamiento basado en comparación. Estos algoritmos requieren comparaciones entre sufijos, pero una comparación entre sufijos se puede realizar en un tiempo de , entonces el tiempo completo de ejecución de esta ventaja es .

Algoritmos más avanzados toman ventaja del hecho de que los sufijos a ordenar no son cadenas arbitrarias sino que está relacionadas unas con otras.Estos algoritmos tratan de priorizar los siguientes objetivos:

  • complejidad asimptótica minimal
  • rápido en práctica

Uno de los primeros algoritmos en cumplir todos los objetivos es el algoritmo SA-IS de Nong, Zhang y Chan (2009). El algoritmo es también muy simple (< 100 LOC y puede ser mejorado para simultáneamente construir el arreglo de prefijos comunes.[3]​ El algoritmo SA-IS es uno de los más rápidos algoritmos de construcción de arreglos de sufijos conocidos. Una cuidadosa implementanción implementation by Yuta Mori Archivado el 26 de julio de 2014 en Wayback Machine. que supera a la mayoría de otros métodos de construcción lineales o super lineales.

Aplicaciones

editar

El arreglo de sufijos de una cadena puede ser usado como un índice para hallar rápidamente todas las ocurrencias de una subcadena dentro de una cadena .Hallar todas la ocurrencias de un patrón es equivalente a hallar todo sufijo que empiece con la subcadena. Gracias al ordenamiento lexicográfico, los sufijos pueden ser agrupados juntos en el arreglo de sufijos y pueden ser hallados eficientementes con dos búsquedas binarias. La primera búsqueda localiza la posición inicial del intervalo, y la segunda determina la posición final:

    def search(P):
        l = 1; r = n + 1
        while l < r:
            mid = (l+r) / 2
            if P > suffixAt(A[mid]):
                l = mid + 1
            else:
                r = mid
        s = l; r = n + 1
        while l < r:
            mid = (l+r) / 2
            if P == suffixAt(A[mid]):
                l = mid
            else:
                r = mid - 1
        return (s, r)

Hallar el patrón de longitud en la cadena de longitud toma un tiempo de , dado que solo se necesita una simple comparación de sufijos para comparar caracteres.Manber y Myers (1990) describe como esta cota se puede mejorar a usando un arreglo de prefijos comunes.Abouelhoda, Kurtz y Ohlebusch (2004) mejoró la cota e incluso obtuvo un tiempo de búsqueda de como el del árbol de sufijos.

Notas

editar

Referencias

editar

Enlaces externos

editar

📚 Artikel Terkait di Wikipedia

River Trail

especial, basada en tres pilares: un tipo llamado ParallelArray, varios métodos del prototipo de ParallelArray, y funciones elementales.​ Wiki: Home, consultado

MISD

que MISD. Algunos argumentan que un array sistólico es un ejemplo de una estructura MISD.​​ Quinn, Michael J. Parallel Programming in C with MPI and OpenMP

Fórmula de rotación de Rodrigues

=\mathbf {v} _{\parallel }+\mathbf {v} _{\perp }\,,} donde el componente paralelo a k es v ∥ = ( v ⋅ k ) k {\displaystyle \mathbf {v} _{\parallel }=(\mathbf

Chip de ADN

Los métodos de CMA más usados clínicamente incluyen el array de oligonucleótidos, el array de SNP (Single-Nucleotide Polymorphism), y la combinación

Desenroscado de bucles

instrucciones que incrementan el puntero o índice al siguiente elemento del array y en los test de “¿ha finalizado el bucle?”. Si un compilador o ensamblador

Cray X1

de memoria compartida como el lenguaje de programación Unified Parallel C o el Co-array Fortran. El X1 corre el sistema operativo llamado UNICOS/mp el

Memoria de contenido direccionable

expresión en hardware de lo que en términos de software se denominaría un array asociativo. Puesto que una CAM está diseñada para buscar en toda la memoria

F Sharp

primeAsync |> Async.Parallel |> Async.RunSynchronously |> Array.filter snd |> Array.map fst // Corriendo una prueba primes 1000000 1002000 |> Array.iter (printfn