Saya baru saja mulai membaca sebuah buku berjudul Pengantar Kompresi Data, oleh Guy E. Blelloch. Di halaman satu, ia menyatakan:
Yang benar adalah bahwa jika ada satu pesan yang dipersingkat oleh suatu algoritma, maka beberapa pesan lainnya perlu diperpanjang. Anda dapat memverifikasi ini dalam praktiknya dengan menjalankan GZIP pada file GIF. Pada kenyataannya, adalah mungkin untuk melangkah lebih jauh dan menunjukkan bahwa untuk sekumpulan pesan input dengan panjang tetap, jika satu pesan dikompresi, maka panjang rata-rata pesan terkompresi pada semua input yang mungkin selalu akan lebih panjang daripada yang asli. masukan pesan.
Pertimbangkan, misalnya, 8 pesan 3 bit yang mungkin. Jika seseorang dikompresi menjadi dua bit, tidak sulit untuk meyakinkan diri sendiri bahwa dua pesan harus diperluas menjadi 4 bit, memberikan rata-rata 3 1/8 bit.
Betulkah? Saya merasa sangat sulit untuk meyakinkan diri saya tentang hal itu. Bahkan, inilah contohnya. Pertimbangkan algoritma yang menerima sebagai input string 3-bit, dan memetakan ke output berikut:
000 -> 0
001 -> 001
010 -> 010
011 -> 011
100 -> 100
101 -> 101
110 -> 110
111 -> 111
Jadi begitulah - tidak ada input yang dipetakan ke output yang lebih panjang. Tentu saja tidak ada "dua pesan" yang telah diperluas menjadi 4 bit.
Jadi apa sebenarnya yang dibicarakan penulis? Saya menduga ada beberapa peringatan implisit yang tidak jelas bagi saya, atau dia menggunakan bahasa yang terlalu luas.
Penafian: Saya menyadari bahwa jika algoritma saya diterapkan berulang, Anda memang kehilangan data. Coba terapkan dua kali pada input 110: 110 -> 000 -> 0, dan sekarang Anda tidak tahu yang mana dari 110 dan 000 yang merupakan input asli. Namun, jika Anda menerapkannya hanya sekali, sepertinya tidak rugi bagi saya. Apakah itu terkait dengan apa yang penulis bicarakan?
sumber
Jawaban:
Apa yang Anda lewatkan adalah Anda perlu mempertimbangkan semua bit dengan ukuran 3 atau kurang . Yaitu: jika dalam skema kompresi untuk bit ukuran 3 atau kurang kita kompres salah satu string 3-bit ke string 2-bit, maka beberapa string ukuran 3 atau kurang harus diperluas ke 3 bit atau lebih.
Skema kompresi tanpa kehilangan adalah fungsiC dari string bit terbatas hingga string bit terbatas yang bersifat injeksi, yaitu, jika C(x)=C(y) kemudian x=y yaitu C(x) menentukan secara unik x .
Pertimbangkan skema kompresi sewenang-wenangC dan biarkan S menjadi satu set string biner. Kami dapat mengekspresikan seberapa baikC bekerja S dengan menghitung rasio
Jika kita mencoba mengompres semua string paling panjangn maka kita dalam masalah:
Jadi, skema kompresi terbaik di dunia adalah fungsi identitas! Yah, hanya jika kita ingin mengompres string acak bit. String bit yang terjadi dalam praktik jauh dari acak dan menunjukkan banyak keteraturan. Inilah sebabnya mengapa masuk akal untuk memampatkan data meskipun teorema di atas.
sumber
Hanya catatan tambahan untuk jawaban bagus Andrej:
Anda juga dapat melihat ke kompleksitas Kolmogorov :
Definisi : Diberikan strings , kompleksitas Kolmogorov-nya C(s) relatif terhadap model perhitungan tetap adalah panjang dari program shortes (misalnya mesin Turing) yang dihasilkan s .
Secara informalC(s) mengukur konten informasinya atau tingkat redundansi ; Sebuah benangs tidak tertahankan jikaC(s)≥|s|
Dua teorema dasar adalah:
1) secara independen dari model perhitungan ada konstantac sedemikian rupa sehingga untuk setiap string s : C(s)≤|s|+c (Informal, diberi string s Anda dapat menyandikannya dengan susah payah dalam sebuah program yang hanya mengeluarkannya tanpa pemrosesan atau kompresi apa pun)
2) untuk semuan ada string s panjangnya n itu tidak bisa dimampatkan: C(s)≥|s| (analog dengan teorema yang dijelaskan dalam jawaban Andrej).
Buktinya sederhana: ada2n panjang string biner n , tetapi sedikit deskripsi (program) panjangnya <n :
sumber
Contoh balasan Anda salah.
Daftar nilai terkompresi Anda memiliki beberapa informasi tersembunyi yang memang membuat panjang rata-rata lebih dari 3 bit. Informasi tambahan adalah panjang dari string keluaran.
Dengan mata kami, kami dapat melihat dari tabel Anda bahwa string keluaran pertama hanya panjang 1 bit, dan yang lainnya 3 bit, tetapi Anda curang jika Anda tidak secara eksplisit menyandikan fakta itu. Mari kita menyandikannya dengan menambahkan satu bit lagi; 0 akan berarti "length = 1", dan 1 akan berarti "length = 3".
Jadi meja Anda benar-benar menjadi:
... yang rata-rata mencapai 3,75 bit.
EDIT
Berikut ini sebuah renungan, yang menggambarkan hal yang sama. Ini pertanyaan kuis yang bagus:
Kode morse terdiri dari hanya titik dan garis. Mari kita sebut titik 0, dan dash 1. Semua huruf besar dikodekan sebagai tidak lebih dari empat bit.
Ada 26 huruf besar. Tetapi empat bit seharusnya hanya dapat mengkodekan 16 nilai yang berbeda. Apa yang sedang terjadi?
sumber
Menghitung case zero-length yang sepele, ada2n+1−1 bit string yang panjangnya paling banyak n (jika panjang diketahui kelipatan delapan, jumlahnya lebih kecil tetapi lebih sulit untuk dihitung). Jadi, semua string panjangn atau kurang bisa direpresentasikan menggunakan string dengan panjang tetap n+1 . Jika banyak string akan lebih pendek dari panjang maksimum, bagaimanapun, mungkin akan bermanfaat untuk menggunakan skema pengkodean alternatif yang menambahkan lebih dari satu ke panjang string maksimal, tetapi kurang dari panjang string pendek. Akibatnya, jumlah informasi yang disampaikan dengan mengetahui panjang string yang tepat tergantung pada berapa lama seseorang akan berasumsi bahwa string itu bisa, dan seberapa bersedia seseorang untuk mengisi string yang lebih pendek.
Karena faktor-faktor seperti itu sangat tergantung pada aplikasi, akan sangat membantu untuk mengasumsikan model perhitungan di mana string input diasumsikan mengandung informasi yang akan cukup untuk membuat pembaca tahu di mana mereka berakhir (bahkan jika mereka dipenuhi dengan jumlah data sewenang-wenang yang sewenang-wenang) , dan string output diperlukan untuk melakukan hal yang sama. Model perhitungan seperti itu akan memungkinkan operasi apa pun yang akan bekerja pada catatan data individual untuk hanya bekerja dengan baik pada urutan rekaman data yang disatukan [kode yang akan tahu kapan harus berhenti membaca seluruh catatan yang tidak terkompresi dapat dianggap tahu juga kapan harus berhenti membaca seluruh yang terkompresi].
sumber