You can edit almost every page by Creating an account. Otherwise, see the FAQ.

Elias delta coding

EverybodyWiki Bios & Wiki sitesinden
Şuraya atla:kullan, ara

Elias δ kodlama veya Elias delta kodlama, Peter Elias tarafından geliştirilen pozitif tam sayıları kodlayan bir evrensel koddur.[1]:200

Kodlama[değiştir]

Bir sayı X ≥ 1 kodlanması için:

  1. N = ⌊log2 X⌋; X deki en yüksek 2'nin kuvveti olsun, böylece 2NX < 2N+1.
  2. L = ⌊log2 N+1⌋; N+1 deki en yüksek 2'nin kuvveti olsun, böylece 2LN+1 < 2L+1.
  3. L sıfır yazın, ardından
  4. L+1-bit ikili temsili N+1, ardından
  5. X in ilk biti hariç tüm bitleri (yani son N biti) yazın.

Aynı işlemi daha açık bir şekilde ifade etmek için:

  1. X i, içerdiği en yüksek 2'nin kuvveti (2N) ile geri kalan N ikili rakamlarına ayırın.
  2. N+1 ile Elias gamma kodlama yapın.
  3. Bu N+1 temsiline kalan N ikili rakamları ekleyin.

Bir sayı i Elias delta (δ) kodlamak için, bit kullanılır.[1]:200 Bu, çok büyük tam sayılar için kullanışlıdır, çünkü genel kodlanmış temsilin bitleri, kısmı nedeniyle [ Elias gamma kodlama kullanarak elde edilebilecek bit sayısından daha az olur.

Kodlama şu şekilde başlar, yerine kullanılarak:

Sayı N N+1 δ kodlama İmplike olasılık
1 = 20 0 1 1 1/2
2 = 21 + 0 1 2 0 1 0 0 1/16
3 = 21 + 1 1 2 0 1 0 1 1/16
4 = 22 + 0 2 3 0 1 1 00 1/32
5 = 22 + 1 2 3 0 1 1 01 1/32
6 = 22 + 2 2 3 0 1 1 10 1/32
7 = 22 + 3 2 3 0 1 1 11 1/32
8 = 23 + 0 3 4 00 1 00 000 1/256
9 = 23 + 1 3 4 00 1 00 001 1/256
10 = 23 + 2 3 4 00 1 00 010 1/256
11 = 23 + 3 3 4 00 1 00 011 1/256
12 = 23 + 4 3 4 00 1 00 100 1/256
13 = 23 + 5 3 4 00 1 00 101 1/256
14 = 23 + 6 3 4 00 1 00 110 1/256
15 = 23 + 7 3 4 00 1 00 111 1/256
16 = 24 + 0 4 5 00 1 01 0000 1/512
17 = 24 + 1 4 5 00 1 01 0001 1/512

Bir Elias delta kodlu tam sayıyı çözmek için:

  1. Akıştan ilk birine kadar sıfırları okuyun ve sayın. Bu sıfır sayısını L olarak adlandırın.
  2. İlk bir rakam olarak kabul edilen bu bir sayının 2L değerini temsil eden bir sayının sonraki L rakamını okuyun. Bu sayıyı N+1 olarak adlandırın ve bir azaltarak N elde edin.
  3. Son çıktımızın ilk yerine bir yazın, 2N değerini temsil edin.
  4. Sonraki N rakamını okuyup ekleyin.

Örnek:

001010011
1. 001'deki 2 başında sıfır
2. 00101 için 2 bit daha oku
3. decode N+1 = 00101 = 5
4. N = 5 − 1 = 4 kalan bit tam kod için i.e. '0011'
5. kodlanan sayı = 24 + 3 = 19

Bu kod, Elias gamma kodlama de açıklanan yollarla sıfır veya negatif tam sayılara genelleştirilebilir.

Örnek Kod[değiştir]

Kodlama[değiştir]

void eliasDeltaEncode(char* source, char* dest)
{
    IntReader intreader(source);
    BitWriter bitwriter(dest);
    while (intreader.hasLeft())
    {
        int num = intreader.getInt();
        int len = 0;
        int lengthOfLen = 0;

        len = 1 + floor(log2(num));  // calculate 1+floor(log2(num))
        lengthOfLen = floor(log2(len)); // calculate floor(log2(len))

        for (int i = lengthOfLen; i > 0; --i)
            bitwriter.outputBit(0);
        for (int i = lengthOfLen; i >= 0; --i)
            bitwriter.outputBit((len >> i) & 1);
        for (int i = len-2; i >= 0; i--)
            bitwriter.outputBit((num >> i) & 1);
    }
    bitwriter.close();
    intreader.close();
}

Kod Çözme[değiştir]

void eliasDeltaDecode(char* source, char* dest)
{
    BitReader bitreader(source);
    IntWriter intwriter(dest);
    while (bitreader.hasLeft())
    {
        int num = 1;
        int len = 1;
        int lengthOfLen = 0;
        while (!bitreader.inputBit())     // potentially dangerous with malformed files.
            lengthOfLen++;
        for (int i = 0; i < lengthOfLen; i++)
        {
            len <<= 1;
            if (bitreader.inputBit())
                len |= 1;
        }
        for (int i = 0; i < len-1; i++)
        {
            num <<= 1;
            if (bitreader.inputBit())
                num |= 1;
        }
        intwriter.putInt(num);            // write out the value
    }
    bitreader.close();
    intwriter.close();
}

Genelleştirmeler[değiştir]

Elias delta kodlama sıfır veya negatif tam sayıları kodlamaz. Tüm olumsuz tam sayıları kodlamak için bir yol, kodlama öncesinde 1 eklemek ve sonrasında 1 çıkarmaktır. Tüm tam sayıları kodlamak için bir yol, tüm tam sayıları (0, 1, −1, 2, −2, 3, −3, ...) kesinlikle pozitif tam sayılara (1, 2, 3, 4, 5, 6, 7, ...) eşleştiren bir karşılıklılık kurmaktır. Bu eşleştirme, Protocol Buffers'dan "ZigZag" kodlama (Zigzag kodu veya JPEG Zig-zag entropi kodlama ile karıştırılmamalıdır) ile yapılabilir.

Ayrıca bakınız[değiştir]

Kaynaklar[değiştir]

Şablon:Kaynakça/styles.css sayfası içerik yok.

  1. 1,0 1,1 Elias, Peter (March 1975). "Universal codeword sets and representations of the integers". IEEE Transactions on Information Theory. 21 (2): 194–203. doi:10.1109/tit.1975.1055349. 

İlgili okumalar[değiştir]



Read or create/edit this page in another language[değiştir]