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 ?
data-compression
number-formats
Kinani
sumber
sumber
Jawaban:
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.
sumber
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 ininlog2|Σ| 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.
sumber
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? ☺).
sumber
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
:dan inilah untuk membacanya kembali:
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.
sumber
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.
sumber