Tidak ada algoritma kompresi yang dapat mengompres semua pesan input?


8

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?


13
Kode Anda bukan kode. Bagaimana Anda ingin memecahkan kode 00010?

3
Sebenarnya, ada bukti yang sangat sederhana dari fakta ini yang bersandar pada prinsip pigeonhole. en.wikipedia.org/wiki/…
chazisop

Jika Anda dapat mengompres setiap pesan 3-bit menjadi <= 3 bit, Anda dapat mengompres pesan yang sangat panjang hanya dalam beberapa bit. mis. jika proposal Anda akan berhasil, maka Anda bisa xor dengan nilai 3-bit paling banyak terjadi, tambahkan nilainya ke awal dan kompres. lalu terus ulangi sampai pesan apa pun hanya memakan beberapa bit.
JarkkoL

Jawaban:


16

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 fungsi C dari string bit terbatas hingga string bit terbatas yang bersifat injeksi, yaitu, jika C(x)=C(y) kemudian x=yyaitu C(x) menentukan secara unik x.

Pertimbangkan skema kompresi sewenang-wenang C dan biarkan Smenjadi satu set string biner. Kami dapat mengekspresikan seberapa baikC bekerja S dengan menghitung rasio

CompressionRatio(C,S)=xSlength(C(x))xSlength(x).
Rasio kompresi kecil baik. Misalnya, jika ya1/2 itu berarti kita dapat rata-rata memadatkan string dalam S 50% menggunakan C.

Jika kita mencoba mengompres semua string paling panjangn maka kita dalam masalah:

Teorema: BiarkanSmenjadi himpunan semua string paling panjangn dan Cskema kompresi apa pun. KemudianCompressionRatio(C,S)1.

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.


Terima kasih. Jadi penulis salah bicara, kan? Dia mengatakan "pesan dengan panjang tetap" dan "mempertimbangkan 8 pesan 3-bit", tetapi dia seharusnya mengatakan "pesan dengan panjang maksimum tetap" dan "mempertimbangkan kemungkinan 14 pesan paling banyak 3-bit"?
Jack M

@JackM: atau bahkan lebih baik: "pertimbangkan semua untaian paling panjang 3 di atas alfabet {0,1}"
Vor

7

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 informal C(s)mengukur konten informasinya atau tingkat redundansi ; Sebuah benangstidak tertahankan jikaC(s)|s|

Dua teorema dasar adalah:

1) secara independen dari model perhitungan ada konstanta c 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 semua n ada string s panjangnya n itu tidak bisa dimampatkan: C(s)|s| (analog dengan teorema yang dijelaskan dalam jawaban Andrej).

Buktinya sederhana: ada 2n panjang string biner n, tetapi sedikit deskripsi (program) panjangnya <n:

i=0n12i=2n1<2n.


4

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:

000 -> 00
001 -> 1001
010 -> 1010
011 -> 1011
100 -> 1100 
101 -> 1101
110 -> 1110
111 -> 1111

... 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.

E = . = 0
Q = --.- = 1101

Ada 26 huruf besar. Tetapi empat bit seharusnya hanya dapat mengkodekan 16 nilai yang berbeda. Apa yang sedang terjadi?


Apakah ini benar-benar perlu? Tampak bagi saya bahwa dalam beberapa situasi itu sangat masuk akal untuk membiarkan panjang menjadi implisit - seperti jika Anda memiliki protokol di mana SETIAP pesan didahului dengan panjangnya dikodekan sebagai kata lebar tetap. Karena mendahului setiap pesan, dikompres atau tidak, itu dapat diabaikan. Dan posting Andrej menjawab pertanyaan sambil membiarkan panjang menjadi implisit, sehingga pembatasan Anda tampaknya tidak perlu. Tetap merupakan poin yang baik untuk dibicarakan, tentu saja.
Jack M

Sebenarnya, menurut Anda, apakah pembatasan Anda untuk menyandikan panjang secara eksplisit sama dengan pembatasan Andrej untuk menyandikan semua string di bawah 3 bit?
Jack M

@JackM: Dalam kebanyakan kasus, skema kompresi akan digunakan tidak hanya untuk memetakan data tunggal ke data tunggal lainnya (mudah-mudahan lebih kecil), tetapi juga untuk memetakan urutan potongan data ke urutan data lainnya (semoga lebih pendek). data. Jika urutan input semua dalam aliran tunggal yang mencakup informasi yang cukup untuk membagi mereka, maka "panjang input" harus mencakup semua informasi yang diperlukan untuk mengurai input dari aliran tunggal, dan "panjang output" harus mencakup semua informasi yang diperlukan untuk parsing output.
supercat

0

Menghitung case zero-length yang sepele, ada 2n+11bit 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].

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.