Ir al contenido

Usuario:Airribarra/Árbol de ondas

De Wikipedia, la enciclopedia libre
Un wavelet tree sobre la cadena "abracadabra". En cada nodo, los símbolos de la cadena se proyectan en dos particiones del alfabeto, y un vector de bits indica a qué partición pertenece cada símbolo. Tenga en cuenta que sólo se almacenan los vectores de bits, las cadenas de los nodos tienen sólo fines ilustrativos.

El wavelet tree es una estructura de datos sucinta para almacenar cadenas en un espacio comprimido. Generaliza y , operaciones definidas en vectores de bits a alfabetos arbitrarios.

Originalmente diseñado para representar arreglos de sufijos comprimidos, [1]​ el wavelet tree ha encontrado aplicaciones en diversos contextos[2][3]​ . El árbol se define particionando recursivamente el alfabeto en pares de subconjuntos; las hojas del árbol corresponden a símbolos individuales del alfabeto, y en cada nodo interno un vector de bits almacena si un símbolo de la cadena pertenece a un subconjunto o al otro.

Propiedades[editar]

Sea un alfabeto finito con . Al utilizar vectores de bits comprimidos en los nodos, una cadena se puede almacenar en , dónde es la entropía empírica de orden 0 de .

Si el árbol está balanceado, las operaciones , , y puede ser soportadas en tiempo .

Operación de acceso[editar]

Un wavelet tree representa una cadena a través de un vector de bits. Si conocemos el alfabeto, entonces se puede inferir la cadena recorriendo el árbol desde la raíz hasta las hojas. Para encontrar el símbolo en la i-ésima posición de la cadena :

 Algoritmo access (i, W) 
    Entrada:
    - La posición i en la cadena para la cual queremos conocer el símbolo, comenzando desde 1.
    - El nodo raíz W del wavelet tree que representa a la cadena.
    Salida: El símbolo en la posición i 

    si W.esHoja retornar W.simbolo
    si W.bitvector[i] = 0 retornar access(i - rank(W.bitvector, i), W.left)
    sino retornar access(rank(W.bitvector, i), W.right)


En este contexto, el rank de la posición en un vector de bits corresponde a la cantidad de unos que aparecen en las primeras posiciones de . Debido a que el rank se puede calcular en usando bitvectors sucintos[4]​, se puede acceder a cualquier S[i] en la cadena S en tiempo [3]​, siempre que el árbol esté balanceado.

Referencias[editar]

  1. R. Grossi, A. Gupta, and J. S. Vitter, High-order entropy-compressed text indexes, Proceedings of the 14th Annual SIAM/ACM Symposium on Discrete Algorithms (SODA), January 2003, 841-850.
  2. P. Ferragina, R. Giancarlo, G. Manzini, The myriad virtues of Wavelet Trees, Information and Computation, Volume 207, Issue 8, August 2009, Pages 849-866
  3. a b G. Navarro, Wavelet Trees for All, Proceedings of 23rd Annual Symposium on Combinatorial Pattern Matching (CPM), 2012
  4. Munro, J. Ian (1996). «Tables». En Chandru, V., ed. Foundations of Software Technology and Theoretical Computer Science. Lecture Notes in Computer Science (en inglés) (Springer): 37-42. ISBN 978-3-540-49631-1. doi:10.1007/3-540-62034-6_35. Consultado el 17 de octubre de 2023. 

Error en la cita: La etiqueta <ref> definida en las <references> con nombre «CHLK07» no se utiliza en el texto anterior.
Error en la cita: La etiqueta <ref> definida en las <references> con nombre «GO12» no se utiliza en el texto anterior. [[Categoría:Árboles (estructura)]]