El Burrows-Policía motorizado del transforma ( BWT, también llamado la compresión de bloquear-clasificación ), es un algoritmo usado en técnicas de la compresión de datos tales como Bzip2 . Fue inventado por el Michael Burrows y el policía motorizado de David en 1994 mientras que trabajaba en el centro de investigación de los sistemas de Digitaces en el Palo Alto, California. Se basa en una transformación previamente inédita descubierta por Wheeler en 1983.

Cuando una serie de caracteres es transformada por el BWT, ningunos de sus carácteres cambian valor. El de la transformación permuta la pedido de los carácteres. Si la secuencia original tenía varias subsecuencias que ocurrieron a menudo, después la secuencia transformada tendrá varios lugares en donde un solo carácter se repite las épocas múltiples en una fila. Esto es útil para la compresión, puesto que tiende a ser fácil comprimir una secuencia que haga que los funcionamientos de carácteres repetidos por técnicas tales como Mover-a-delantero transformen y la codificación de la Funcionar-longitud.

Por ejemplo, la secuencia: SIX.BOXES podría ser transformado en esta secuencia, que es más fácil de comprimir porque tiene muchos carácteres repetidos: TEXYDST.EUSFXDIIOIIIT

La transformación es hecha por el que clasifica todas las rotaciones del texto, entonces tomando la columna pasada. Por ejemplo, el " del texto; color=" del ^BANANA@" se transforma en " Color=" de BNN^AA@A" con estos pasos (el color=" rojo del @ indica “ el indicador del EOF ”):

border=1>

Transformation align=center> del
Input All
Rotations
Sort the
Rows
Output
@ color=" del ^BANANA@ color=" del @^BANANA Color=" de A@^BANAN Color=" de NA@^BANA Color=" de ANA@^BAN Color=" de NANA@^BA Color=" de ANANA@^B Color=" de BANANA@^ Color=" de ANANA@^ Color=" de ANA@^BA' N' Color=" de A@^BANA' N' Color=" de BANANA@ ^ Color=" de NANA@^B' A' Color=" de NA@^BAN' A' color=" del ^BANANA @ color=" del @^BANAN' A' Color=" de BNN^AA@A

El Pseudocode siguiente da un simple, pero ineficaz, manera calcular el BWT y su lo contrario. Asume que la secuencia s de la entrada contiene un carácter especial “EOF” que sea el carácter pasado, ocurre en ninguna otra parte en el texto, y está no hecha caso durante la clasificación.

función BWT (secuencia s del del ) crear una tabla, filas son todas rotaciones posibles de s clasificar las filas alfabéticamente volver (columna pasada de una tabla) inverseBWT de la función (secuencia s del ) crear la tabla vacía el de las longitudes de la repetición mide el tiempo de insertar s mientras que una columna de la tabla antes de la primera columna de una tabla // primero inserta crea la primera columna clasificar las filas de la tabla alfabéticamente nota de //: esto crea filas de anterior en orden invertida - > el primer anterior es pasado vuelta (fila pasada una tabla)

Para entendamos porqué esto crea datos más-fácil-compresibles, consideran transformar un texto inglés largo que contiene con frecuencia el " de la palabra; the". La clasificación de las rotaciones de este texto agrupará a menudo las rotaciones que comienzan con el " él " junto, y el carácter pasado de esa rotación (que es también el carácter antes del " él ") ser generalmente " t", así que el resultado de la transformación contendría un número de " t" carácteres junto con las excepciones quizás menos-comunes (por ejemplo si contiene el " " de Brahe;) mezclado adentro. Puede ser visto tan que el éxito de esto transforma depende de un valor que tiene una alta probabilidad de la ocurrencia antes de una secuencia, de modo que en general necesite las muestras bastante largas (algunos kilobytes por lo menos) de datos apropiados (tales como texto).

La cosa notable sobre el BWT no es que genera un output&mdash más fácilmente codificado; una clase ordinaria haría el that— pero eso es el reversible, permitiendo que el documento original sea regenerado de los datos pasados de la columna.

Lo contrario se puede entender esta manera. Tomar la tabla final en el algoritmo de BWT, y borrar todos pero la columna pasada. Dado solamente esta información, usted puede reconstruir fácilmente la primera columna. La columna pasada le dice que todos los carácteres en el texto, tan apenas clasifican estos carácteres para conseguir la primera columna. Entonces, las primeras y pasadas columnas juntos le dan todos los pares del de carácteres sucesivos en el documento, donde tomar pares cíclico para la forma pasada y primera del carácter a los pares. La clasificación de la lista de pares da el primer y las segundas columnas de . Continuando de este modo, usted puede reconstruir la lista entera. Entonces, la fila con el " extremo del file" el carácter en el extremo es el texto original. La inversión del ejemplo antedicho se hace como esto:

border=1>

align=center colspan=4> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=right> del align=center colspan=4> del
Inverse Transformation
Input
@A
Add 1Sort 1Add 2Sort 2
@ A align=right> de @ align=right> de @^ Color=" de A@ @ VAGOS NA NA ^B color=" del @^
Add 3Sort 3Add 4Sort 4
@ ^BA ANECDOTARIO ANECDOTARIO color=" del @^B Color=" de A@^ @^ INTERDICCIÓN NAN Color=" de NA@ ^BA color=" del @^B @^ ^BAN ANAN Color=" de ANA@ color=" del @^BA Color=" de A@^B @ Color=" de A@^B BANA NANA Color=" de NA@^ ^BAN color=" del @^BA
Add 5Sort 5Add 6Sort 6
@ Color=" de NA@^B ^BANA ANANA Color=" de ANA@^ color=" del @^BAN Color=" de A@^BA @^ Color=" de A@^BA BANAN Color=" de NANA@ Color=" de NA@^B ^BANA color=" del @^BAN PLÁTANO Color=" de NANA@^ Color=" de NA@^BA ^BANAN Color=" de ANANA@ Color=" de ANA@^B color=" del @^BANA Color=" de A@^BAN @ Color=" de ANA@^B Color=" de A@^BAN PLÁTANO Color=" de NANA@^ Color=" de NA@^BA ^BANAN color=" del @^BANA
Add 7Sort 7Add 8Sort 8
@ Color=" de NANA@^B Color=" de NA@^BAN ^BANANA Color=" de ANANA@^ Color=" de ANA@^BA color=" del @^BANAN Color=" de A@^BANA @^ Color=" de ANA@^BA Color=" de A@^BANA Color=" de BANANA@ Color=" de NANA@^B Color=" de NA@^BAN ^BANANA color=" del @^BANAN @^ Color=" de NANA@^BA Color=" de NA@^BANA color=" del ^BANANA@ Color=" de ANANA@^B Color=" de ANA@^BAN color=" del @^BANANA Color=" de A@^BANAN @^B Color=" de ANA@^BAN Color=" de A@^BANAN Color=" de BANANA@^ Color=" de NANA@^BA Color=" de NA@^BANA color=" del ^BANANA@ color=" del @^BANANA
Output
@

Un número de optimizaciones pueden hacer que estos algoritmos funcionan más eficientemente sin el cambio de la salida. En BWT, no hay necesidad de almacenar realmente la tabla. Cada fila de la tabla se puede representar por un solo indicador en las secuencias. En BWT inverso no hay necesidad de almacenar la tabla o de hacer las clases del múltiplo. Es suficiente clasificarlo una vez con una clase estable, y recuerda adonde cada carácter se movió. Esto da a permutación del solo-ciclo, cuyo ciclo es la salida. Un " character" en el algoritmo pueden estar un octeto, o un pedacito, o cualquier otro tamaño conveniente.

No hay necesidad de tener un carácter real del “EOF”. En lugar, un indicador puede ser utilizado que recuerda donde en una secuencia estaría el “EOF” si existió. En este acercamiento, la salida del BWT debe incluir ambos la secuencia transformada, y el valor final del indicador. Eso significa que el BWT amplía su entrada levemente. Lo contrario transforma entonces lo encoge detrás traga al tamaño original: se da una secuencia y un indicador, y vuelve apenas una secuencia.

Una descripción completa de los algoritmos se puede encontrar en el papel de Burrows y del policía motorizado, o en un número de fuentes en línea.

Puesta en práctica de la muestra

Nota: Escrito en C (la original encontró en: ).

lang=" del incluir el

  • de incluir el
  • de incluir el
  • de incluir el
  • de

    octeto sin firmar del carbón de leña del typedef;

    *rotlexcmp_buf = FALTA DE INFORMACIÓN del octeto; la internacional rottexcmp_bufsize = 0;

    rotlexcmp de la internacional (*l vacío del const, *r) vacío del const { el li de la internacional = * (int* del const) l, ri = * (int* del const) r, ac=rottexcmp_bufsize; si (vuelta 0 del ri del == del li); mientras que (rotlexcmp_buf del == del rotlexcmp_buf) { si (el == de ++li rottexcmp_bufsize) li = 0; si (el == de ++ri rottexcmp_bufsize) ri = 0; ¡si (! --CA) vuelta 0; } si (rotlexcmp_buf > rotlexcmp_buf) vuelta 1; volver -1; }

    bwt_encode vacío (*buf_in del octeto, *buf_out del octeto, tamaño de la internacional, *primary_index de la internacional) { índices de la internacional; internacional i;

    para (i=0; i rotlexcmp_buf = buf_in; rottexcmp_bufsize = tamaño; qsort (índices, tamaño, sizeof (internacional), rotlexcmp);

    para (i=0; i para (i=0; i bwt_decode vacío (*buf_in del octeto, *buf_out del octeto, tamaño de la internacional, primary_index de la internacional) { cubos de la internacional; internacional i, j, suma; índices de la internacional;

    memset (cubos, 0, sizeof (cubos));

    para (i=0; i para (sum=i=0; i<256; i++) { __t = cubos del registro internacional; cubos = suma; __t de la suma +=; } para (el j=primary_index, i=size; i--; j=indices + cubos]) buf_out = buf_in; }

    cañería de la internacional () { octeto buf1 = " Polska Wikipedia" ; el tamaño de la internacional = strlen ((char* del const) buf1); octeto buf2; octeto buf3; primary_index de la internacional;

    bwt_encode (buf1, buf2, tamaño, &primary_index); bwt_decode (buf2, buf3, tamaño, primary_index);

    ¡afirmar (! memcmp (buf1, buf3, tamaño)); printf (" El resultado es igual que entrado, es ése: <%.*s> \ n", tamaño, buf3); El impreso de // codifica/descifra resultados: printf (" Entrada: <%.*s> \ n", tamaño, buf1); printf (" Codificado: <%.*s> \ n", tamaño, buf2); printf (" Descifrado: <%.*s> \ n", tamaño, buf3); vuelta 0; }

    .

  • Zenithic
  • Crosseola cuvieriana
    Random links:4 de diciembre | Misil del tridente | Provincia de Giresun | Nyalikungu | Jesse Lauriston Livermore

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">