Menggunakan basis 80 untuk mengompresi file


8

Saya ingin mengompres ukuran file dengan membuat sistem penomoran saya sendiri yang merupakan nomor berbasis 80, saya benar-benar ingin tahu apakah ini mungkin? Saya belajar bahwa Heksadesimal menggunakan simbol seperti A, B, C, D, E, F untuk mewakili 10,11,12,13,14,15 - dan itulah yang ingin saya lakukan untuk sistem penomoran saya sendiri tetapi dalam skala yang lebih besar . Harap perbaiki saya jika saya kehilangan sesuatu.

Apa itu mungkin ?


2
Lihat juga di sini .
Raphael

5
Jawaban Frank menjelaskan mengapa ini tidak berhasil. Tapi ada sesuatu yang bisa Anda tanyakan pada diri sendiri sebelum mulai: properti khusus apa dari nomor 80 yang menurut Anda Anda gunakan? Kecuali ada sesuatu yang istimewa tentang 80, jika ide Anda bekerja untuk 80, bukankah itu akan bekerja lebih baik untuk 81? Atau 801?
David Richerby

3
@ DavidRicherby: Saya tidak bisa memikirkan banyak nilai untuk basis 80, tetapi sebenarnya ada beberapa nilai nyata dalam menggunakan basis-85: ia dapat mengubah kelompok empat oktet menjadi lima karakter yang dapat dicetak. Sementara efisiensi penyimpanan bukanlah peningkatan besar pada basis-64 (dua puluh karakter akan mewakili lima belas oktet pada basis-64 dan enam belas pada basis-85), fakta bahwa data dasar "chunk" adalah 32 bit daripada 24 kadang-kadang sangat membantu.
supercat

Maksud saya bagaimana jika saya dapat menemukan beberapa pola dan mewakilinya dalam simbol?
Kinani

2
Jika Anda menemukan pola dan mewakilinya dalam simbol, Anda telah membuat algoritma kompresi yang berfungsi (asalkan representasi lebih pendek dari pola aslinya). Ini adalah cara kerja semua algoritma kompresi.
Tanner Swett

Jawaban:


30

Meskipun Anda akan membutuhkan lebih sedikit angka berbasis 80 daripada angka berbasis 2 (bit) untuk menyandikan file yang sama, satu-satunya cara untuk menyimpan angka berbasis 80 ini di komputer adalah dengan menyandikannya sebagai bit. Jadi kamu tidak mendapatkan apa-apa.

Sebenarnya Anda benar-benar kehilangan ruang, karena 80 bukan kekuatan 2: Anda akan membutuhkan 7 bit untuk setiap nomor berbasis 80, tetapi dalam 7 bit ini, Anda bisa menggunakan 128 negara yang berbeda, jika Anda menggunakannya secara langsung.


10

Ada beberapa cara untuk menafsirkan pertanyaan itu. Apa yang saya pikir Anda mungkin tanyakan adalah Anda memiliki urutann huruf dalam alfabet Σ dimana |Σ|=80. Anda ingin menyimpan ini dalam bit sesedikit mungkin. Kami akan menganggap bahwa huruf-huruf dalam alfabet didistribusikan secara seragam.

Jumlah informasi-teori ruang yang diperlukan untuk menyimpan ini nlog2|Σ|bit. Menggunakan kode aritmatika, Anda dapat melakukan ini dalam waktu linier, menggunakanO(logn)bit ruang menengah. (Ingat, itulah logaritma jumlah simbol, dalam bit! Jika ukuran urutannya cocok dengan kata mesin, penyimpanan perantara yang diperlukan adalah jumlah kata mesin yang paling banyak.)

Jadi itu cukup bagus. Tapi bagaimana kalau kita ingin akses acak?

Ternyata itu bisa dilakukan. Teknik pertama untuk melakukannya baru ditemukan sekitar empat tahun lalu. Kami dapat menyimpan urutan dinlog2|Σ|bit, sehingga dapat membaca atau menulis entri apa punO(1)waktu. Jika Anda memikirkannya, ini adalah hasil yang luar biasa, karena itu berarti bahwa komputer yang bekerja dengan radix apa pun, dalam arti, setara dengan yang biner.

Inilah makalahnya: Yevgeniy Dodis, Mihai Pătraşcu, dan Mikkel Thorup, Alternatif Pengodean Aritmatika dengan Dekodabilitas Lokal , STOC 2010.

Ngomong-ngomong, ingat nama Mihai Pătraşcu. Dia adalah dan merupakan hal terdekat yang kita miliki dengan Évariste Galois modern. Dia meninggal sangat muda, karena tumor otak pada usia 29 tahun. Namun dalam karirnya yang pendek sebagai ilmuwan komputer, karyanya merevolusi bidang analisis algoritma dengan cara yang akan memakan waktu puluhan tahun untuk sepenuhnya dipahami.


3

Jika Anda memiliki nomor (misalnya. 123456789⏨) sebagai teks Anda dapat menulis dalam basis yang berbeda (seperti 21i3v9 dalam basis 36), sehingga Anda kompres itu ditulis sebagai teks (dari 9 karakter untuk 6).

Jika Anda melangkah lebih jauh, Anda akhirnya menyimpannya dalam biner (4 byte¹).

Sekarang, ini berhasil karena Anda mulai dengan set yang diperkecil [0-9] dan pindah ke yang lebih besar [0-9a-z] dan banyak bit data tidak digunakan dalam representasi awal.

Demikian pula, jika kita tahu bahwa file hanya berisi huruf, kita dapat dengan mudah mengompresnya dengan mengubah basis. Namun, jika Anda mengompres dari konten yang sewenang-wenang, itu tidak akan (selalu) berfungsi. Anda dapat mengkompres (mendapatkan output yang lebih kecil) untuk beberapa file, tetapi yang lain akan menjadi lebih besar seperti halnya metode kompresi lossless , ini tidak dapat dihindari.

Ini masih bisa berguna, misalnya metode yang mengkompres teks-teks bahasa Inggris dengan baik tetapi membuat teks-teks bahasa Mandarin lebih besar mungkin cukup baik jika Anda menulis lebih banyak bahasa Inggris daripada bahasa Cina.

¹ Sebenarnya Anda hanya perlu 2²⁷ bit, meskipun saat ini penyimpanan komputer menggunakan kelipatan 8 bit (tapi mungkin Anda ingin menyimpan seri jumlah 2²⁷ bit? ☺).


2

Base 80 ?? Mengapa 80? Itu tidak masuk akal, namun basis 85 tidak. Ini cukup nyaman karena Anda dapat mewakili 4 byte menggunakan 5 karakter (karena 85 ^ 5 = 4.437.053.125 yang sedikit lebih dari 2 ^ 32 = 4.294.967.296)

Inilah kode saya untuk menulis 32-bit tunggal word:

for (i=0; i<5; i++)
{
    c = (word % 85) + 37;
    word /= 85;
    fwrite(&c, sizeof(uint8_t), 1, file);
}

dan inilah untuk membacanya kembali:

    word = 0;
    for (i=4; i>=0; i--)
        fread(&c[i], sizeof(uint8_t), 1, file);

    for (i=0; i<5; i++)
        word = word*85 + c[i]-37;

Jika Anda benar-benar ingin menggunakan basis 80, Anda dapat menggunakan pendekatan yang sama dan mengganti instance 85 dengan 80 dan Anda akan membutuhkan 6 karakter untuk setiap 4 byte, bukan 5.

Bagaimana cara kompres? Anda sadar bahwa file ditulis dalam basis 256, kan? Ini dikatakan jika Anda zip file yang ditulis dalam basis 85 itu akan memiliki ukuran yang sama dengan file 256 basis asli zip, yang membuat basis 85 (atau basis 64) pilihan yang bagus jika Anda ingin mewakili data biner menggunakan karakter yang dapat dicetak.



0

Basis yang berbeda digunakan untuk tujuan yang berbeda, meskipun sebagai jawaban lain menjelaskan Anda tidak akan mendapatkan apa pun dalam hal kompresi.

Lihat wikipedia untuk penjelasan tentang pengkodean base64 . Basis 64 sering digunakan, bukan untuk kompresi, tetapi untuk menyandikan data biner yang biasanya menghasilkan karakter yang tidak dapat dicetak dan kode kontrol ke dalam ruang karakter ASCII yang dapat dicetak. Ini akan menghasilkan ukuran file yang lebih besar, tetapi berguna untuk mentransfer data biner yang dapat disematkan dalam file ASCII lainnya, misalnya di dalam XML, email, CSS, halaman web, dll.


Apa yang Anda katakan itu benar tetapi itu tidak menjawab pertanyaan.
David Richerby

@ DavidRicherby saya tidak setuju. Ia memang menjawab pertanyaan dari titik bahwa dimungkinkan untuk menggunakan pangkalan angka selain yang sudah dikenal OP, dan bahwa mereka memang memiliki tujuan, tetapi tujuan itu bukan kompresi.
Luke Mills

Pertanyaannya adalah, apakah mungkin untuk mengompres file dengan menulisnya di base-80? Jawabannya adalah "tidak", seperti yang Anda sebutkan dalam kalimat pertama Anda dan karena semua jawaban lain sudah mencakup. Paragraf kedua Anda adalah komentar tentang pertanyaan itu. Komentar masuk dalam komentar.
David Richerby
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.