Diferencia entre revisiones de «Arreglo de sufijos»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Artículo creado con el asistente de artículos
 
Sin resumen de edición
Línea 104: Línea 104:
* Un árbol de sufijos puede ser construido en tiempo linear usando una combinación de sufijos y un arreglo de prefijos comunes.
* Un árbol de sufijos puede ser construido en tiempo linear 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 informacion adicional (como un arreglo de prefijos comunes) y resuelve el mismo problema y con la misma complejidad temporal.{{sfn|Abouelhoda|Kurtz|Ohlebusch|2004}}

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 ==
== Eficiencia en espacio ==

Los arreglos de sufijos fueron introducidos por {{harvtxt|Manber|Myers|1990}} para obtener una mejora en cuanto a los requerimientos en espacio de los árboles de sufijos : los arreglos de sufijos guardan <math>n</math> enteros.Asumiendo que un entero requiere <math>4</math> bytes, un arreglo de sufijos requiere un total de <math>4n</math> bytes. Esto significantemente mucho menor que <math>20n</math> bytes los cuales son requeridos para una cuidadosa implementación de una árbol de sufijos.{{sfn|Kurtz|1999}}

Sin embargo, en ciertas aplicaciones, los requerimientos en espacio de los arreglos de sufijos pueden prohibitivos.Analizando en bits, un arreglo de sufijos requiere un espacio de <math>\mathcal{O}(n \log n)</math>, donde el texto original sobre un alfabeto de longitud <math>\sigma</math> require solamente <math>\mathcal{O}(n \log \sigma)</math> bits.


== Algoritmos de construcción ==
== Algoritmos de construcción ==



== Aplicaciones ==
== Aplicaciones ==
El arreglo de sufijos de una cadena puede ser usado como un índice para hallar rápidamente todas las ocurrencias de una subcadena <math>P</math> dentro de una cadena <math>S</math>.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 posicion final:


<source lang="python">
== Referencias ==
def search(P):
<!--No edites esta línea, aquí se visualizarán las fuentes.-->
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)
</source>


Hallar el patrón <math>P</math> de longitud <math>m</math> en la cadena <math>S</math> de longitud <math>n</math> toma un tiempo de <math>\mathcal{O}(m \log n)</math>, dado que solo se necesita una simple comparación de sufijos para comparar <math>m</math> carácteres.{{harvtxt|Manber|Myers|1990}} describe como esta cota se puede mejorar a <math>\mathcal{O}(m + \log n)</math> usando un arreglo de prefijos comunes.{{harvtxt|Abouelhoda|Kurtz|Ohlebusch|2004}} mejoró la cota e incluso obtuvo un tiempo de búsqueda de <math>\mathcal{O}(m)</math> como el del árbol de sufijos.


== Notas ==
{{listaref}}
{{listaref}}

== Referencias ==
* {{cite journal|ref=harv
| doi=10.1016/S1570-8667(03)00065-0
| title=Replacing suffix trees with enhanced suffix arrays
| year=2004
| last1=Abouelhoda | first1=Mohamed Ibrahim
| last2=Kurtz | first2=Stefan
| last3=Ohlebusch | first3=Enno
| journal=Journal of Discrete Algorithms
| volume=2
| pages=53}}
* {{cite journal|ref=harv
| title = Suffix arrays: a new method for on-line string searches
| year = 1990
| journal = In Proceedings of the first annual ACM-SIAM symposium on Discrete algorithms
| pages = 327
| volume = 90
| issue = 319
| last1 = Manber | first1 = Udi | author1-link = Udi_Manber
| last2 = Myers | first2 = Gene | author2-link = Gene_Myers
}}
* {{cite journal|ref=harv
| title = New indices for text: PAT trees and PAT arrays
| year = 1992
| journal = Information retrieval: data structures and algorithms
| last1 = Gonnet | first1 = G.H
| last2 = Baeza-Yates | first2 = R.A
| last3 = Snider | first3 = T
}}
* {{cite journal|ref=harv
| title = Reducing the space requirement of suffix trees
| year = 1999
| journal = Software-Practice and Experience
| volume = 29
| issue = 13
| last1 = Kurtz | first1 = S
| doi=10.1002/(SICI)1097-024X(199911)29:13<1149::AID-SPE274>3.0.CO;2-O
| pages=1149
}}
* {{cite journal|ref=harv
| doi = 10.1007/3-540-45784-4_35|chapter=The Enhanced Suffix Array and Its Applications to Genome Analysis|title=Algorithms in Bioinformatics|series=Lecture Notes in Computer Science|year=2002|last1=Abouelhoda|first1=Mohamed Ibrahim|last2=Kurtz|first2=Stefan|last3=Ohlebusch|first3=Enno|isbn=978-3-540-44211-0|volume=2452|pages=449
}}
* {{cite journal|ref=harv
| doi = 10.1145/1242471.1242472|title=A taxonomy of suffix array construction algorithms|year=2007|last1=Puglisi|first1=Simon J.|last2=Smyth|first2=W. F.|last3=Turpin|first3=Andrew H.|journal=ACM Computing Surveys|volume=39|issue=2|pages=4
}}
* {{cite journal|ref=harv
| doi = 10.1109/DCC.2009.42|chapter=Linear Suffix Array Construction by Almost Pure Induced-Sorting|title=2009 Data Compression Conference|year=2009|last1=Nong|first1=Ge|last2=Zhang|first2=Sen|last3=Chan|first3=Wai Hong|isbn=978-0-7695-3592-0|pages=193
}}
* {{cite journal|ref=harv
| doi = 10.1007/978-3-642-22300-6_32|chapter=Inducing the LCP-Array|title=Algorithms and Data Structures|series=Lecture Notes in Computer Science|year=2011|last1=Fischer|first1=Johannes|isbn=978-3-642-22299-3|volume=6844|pages=374
}}
* {{cite journal|ref=harv
| doi = 10.1016/j.jda.2009.02.007|title=Dynamic extended suffix arrays|year=2010|last1=Salson|first1=M.|last2=Lecroq|first2=T.|last3=Léonard|first3=M.|last4=Mouchard|first4=L.|journal=Journal of Discrete Algorithms|volume=8|issue=2|pages=241
}}
* {{cite journal|ref=harv
| doi = 10.1007/3-540-44888-8_5|chapter=Fast Lightweight Suffix Array Construction and Checking|title=Combinatorial Pattern Matching|series=Lecture Notes in Computer Science|year=2003|last1=Burkhardt|first1=Stefan|last2=Kärkkäinen|first2=Juha|isbn=978-3-540-40311-1|volume=2676|pages=55
}}
* {{cite journal|ref=harv
| doi = 10.1145/800152.804905|chapter=Rapid identification of repeated patterns in strings, trees and arrays|title=Proceedings of the fourth annual ACM symposium on Theory of computing - STOC '72|year=1972|last1=Karp|first1=Richard M.|last2=Miller|first2=Raymond E.|last3=Rosenberg|first3=Arnold L.|pages=125
}}
* {{cite journal|ref=harv
| doi = 10.1109/SFCS.1997.646102|chapter=Optimal suffix tree construction with large alphabets|title=Proceedings 38th Annual Symposium on Foundations of Computer Science|year=1997|last1=Farach|first1=M.|isbn=0-8186-8197-7|pages=137
}}
* {{cite journal|ref=harv
| doi = 10.1007/3-540-45061-0_73|chapter=Simple Linear Work Suffix Array Construction|title=Automata, Languages and Programming|series=Lecture Notes in Computer Science|year=2003|last1=Kärkkäinen|first1=Juha|last2=Sanders|first2=Peter|isbn=978-3-540-40493-4|volume=2719|pages=943
}}
* {{cite journal|ref=harv
| doi = 10.1145/1227161.1402296|title=Better external memory suffix array construction|year=2008|last1=Dementiev|first1=Roman|last2=Kärkkäinen|first2=Juha|last3=Mehnert|first3=Jens|last4=Sanders|first4=Peter|journal=Journal of Experimental Algorithmics|volume=12|pages=1
}}
* {{cite journal|ref=harv
| doi = 10.1016/j.parco.2007.06.004|title=Scalable parallel suffix array construction|year=2007|last1=Kulla|first1=Fabian|last2=Sanders|first2=Peter|journal=Parallel Computing|volume=33|issue=9|pages=605
}}




== Enlaces externos ==
== Enlaces externos ==

Revisión del 20:37 6 dic 2012

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 Ciencia 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, pero 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

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

El arreglo de sufijos de la cadena va a ser una 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

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 el la posición dentro de , el cual es el sufijo .


Correspondencia con Árboles de Sufijos

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 linear 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 informacion 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

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 bytes. Esto significantemente mucho menor que bytes los cuales son requeridos para una cuidadosa implementación de una árbol de sufijos.[2]

Sin embargo, en ciertas aplicaciones, los requerimientos en espacio de los arreglos de sufijos pueden prohibitivos.Analizando en 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

Aplicaciones

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 posicion 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 carácteres.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

Referencias

  • Abouelhoda, Mohamed Ibrahim; Kurtz, Stefan; Ohlebusch, Enno (2004). «Replacing suffix trees with enhanced suffix arrays». Journal of Discrete Algorithms 2: 53. doi:10.1016/S1570-8667(03)00065-0. 
  • Manber, Udi; Myers, Gene (1990). «Suffix arrays: a new method for on-line string searches». In Proceedings of the first annual ACM-SIAM symposium on Discrete algorithms 90 (319): 327. 
  • Gonnet, G.H; Baeza-Yates, R.A; Snider, T (1992). «New indices for text: PAT trees and PAT arrays». Information retrieval: data structures and algorithms. 
  • Kurtz, S (1999). «Reducing the space requirement of suffix trees». Software-Practice and Experience 29 (13): 1149. doi:10.1002/(SICI)1097-024X(199911)29:13<1149::AID-SPE274>3.0.CO;2-O. 
  • Abouelhoda, Mohamed Ibrahim; Kurtz, Stefan; Ohlebusch, Enno (2002). «The Enhanced Suffix Array and Its Applications to Genome Analysis». Algorithms in Bioinformatics. Lecture Notes in Computer Science 2452. p. 449. ISBN 978-3-540-44211-0. doi:10.1007/3-540-45784-4_35. 
  • Puglisi, Simon J.; Smyth, W. F.; Turpin, Andrew H. (2007). «A taxonomy of suffix array construction algorithms». ACM Computing Surveys 39 (2): 4. doi:10.1145/1242471.1242472. 
  • Nong, Ge; Zhang, Sen; Chan, Wai Hong (2009). «Linear Suffix Array Construction by Almost Pure Induced-Sorting». 2009 Data Compression Conference. p. 193. ISBN 978-0-7695-3592-0. doi:10.1109/DCC.2009.42. 
  • Fischer, Johannes (2011). «Inducing the LCP-Array». Algorithms and Data Structures. Lecture Notes in Computer Science 6844. p. 374. ISBN 978-3-642-22299-3. doi:10.1007/978-3-642-22300-6_32. 
  • Salson, M.; Lecroq, T.; Léonard, M.; Mouchard, L. (2010). «Dynamic extended suffix arrays». Journal of Discrete Algorithms 8 (2): 241. doi:10.1016/j.jda.2009.02.007. 
  • Burkhardt, Stefan; Kärkkäinen, Juha (2003). «Fast Lightweight Suffix Array Construction and Checking». Combinatorial Pattern Matching. Lecture Notes in Computer Science 2676. p. 55. ISBN 978-3-540-40311-1. doi:10.1007/3-540-44888-8_5. 
  • Karp, Richard M.; Miller, Raymond E.; Rosenberg, Arnold L. (1972). «Rapid identification of repeated patterns in strings, trees and arrays». Proceedings of the fourth annual ACM symposium on Theory of computing - STOC '72. p. 125. doi:10.1145/800152.804905. 
  • Farach, M. (1997). «Optimal suffix tree construction with large alphabets». Proceedings 38th Annual Symposium on Foundations of Computer Science. p. 137. ISBN 0-8186-8197-7. doi:10.1109/SFCS.1997.646102. 
  • Kärkkäinen, Juha; Sanders, Peter (2003). «Simple Linear Work Suffix Array Construction». Automata, Languages and Programming. Lecture Notes in Computer Science 2719. p. 943. ISBN 978-3-540-40493-4. doi:10.1007/3-540-45061-0_73. 
  • Dementiev, Roman; Kärkkäinen, Juha; Mehnert, Jens; Sanders, Peter (2008). «Better external memory suffix array construction». Journal of Experimental Algorithmics 12: 1. doi:10.1145/1227161.1402296. 
  • Kulla, Fabian; Sanders, Peter (2007). «Scalable parallel suffix array construction». Parallel Computing 33 (9): 605. doi:10.1016/j.parco.2007.06.004. 


Enlaces externos