Интернет магазин китайских планшетных компьютеров



Компьютеры - Преобразование Барроуза Уилера - Примеры реализации

23 января 2011


Оглавление:
1. Преобразование Барроуза Уилера
2. Производительность BWT и алгоритмов сжатия на его основе, потребление памяти
3. Иллюстрация применения для задач сжатия
4. Примеры реализации



На языке Си

#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
 
typedef unsigned char byte;
 
byte *rotlexcmp_buf = NULL;
int rottexcmp_bufsize = 0;
 
int rotlexcmp
{
    int li = *l, ri = *r, ac=rottexcmp_bufsize;
    while 
    {
        if 
            li = 0;
        if 
            ri = 0;
        if 
            return 0;
    }
    if 
        return 1;
    else
        return -1;
}
 
void bwt_encode
{
    int indices;
    int i;
 
    for
        indices = i;
    rotlexcmp_buf = buf_in;
    rottexcmp_bufsize = size;
    qsort , rotlexcmp);
 
    for 
        buf_out = buf_in;
    for 
    {
        if  {
            *primary_index = i;
            return;
        }
    }
    assert ;
}
 
void bwt_decode
{
    byte F;
    int buckets;
    int i,j,k;
    int indices;
 
    for 
        buckets = 0;
    for 
        buckets] ++;
    for 
        for 
            F = i;
    assert ;
    for 
    {
        while 
            j++;
        buckets = j; // it will get fake values if there is no i in F, but
                        // that won't bring us any problems
    }
    for
        indices]++] = i;
    for
    {
        buf_out = buf_in;
        j=indices;
    }
}
 
int main
{
    byte buf1 = "Wikipedia";
    int size = strlen;
    byte buf2;
    byte buf3;
    int primary_index;
 
    bwt_encode ;
    bwt_decode ;
 
    assert );
    printf ;
    return 0;
}

Быстрое обратное преобразование на языке Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
def BWT_decode_fast:
    column = ''.join)
    start = {}
    for i in xrange):
        if not column in start:
            start] = i
    links = 
    for c in src:
        links.append
        start += 1
    ret = column
    i = links
    while i != primary:
        ret += column
        i = links
    return ret + ret
 
print BWT_decode_fast

Примечание: о сортировке

Если вы сортируете строку используя сравнение по стандарту POSIX, то получаете слегка отличную строку на выходе:

TEXYDST.E.IXIXIXXSSMPPS.B..E.S.EUSFXDIIOIIIT

вместо

TEXYDST.E.XIIXIXXSMPPSS.B...S.EEUSFXDIOIIIIT

ISO 8859 имеет сложные правила сравнения, но в данном случае точки игнорируются. Сравнение POSIX рассматривает точки как символы.



Просмотров: 5840


<<< Омега-код Элиаса