Peningkatan Kinerja Implementasi Pengkodean Aritmatika

Saya sedang berupaya mengoptimalkan Implementasi Kompresi Aritmatika saya. Saya telah menyertakan algoritma pengkodean aritmatika dasar di bawah ini:

lower bound = 0
upper bound = 1

while there are still symbols to encode
  current range = upper bound - lower bound
  upper bound = lower bound + (current range × upper bound of new symbol)
  lower bound = lower bound + (current range × lower bound of new symbol)
end while

Saya punya ide untuk membulatkan nilai saya, tetapi untuk melakukannya, penghitungan batas atas TIDAK BISA menggunakan nilai batas bawah. Saya tidak tahu bagaimana melakukan itu.

Informasi lebih lanjut: Saya berencana untuk membulatkan batas bawah ke atas, mempersempit rentangnya, sehingga mempertahankan presisi, sambil membuat angka saya memiliki angka yang lebih sedikit. Kemudian bulatkan batas atas saya ke bawah dengan cara yang sama. Namun perhitungan batas atas membuatnya bertambah jika kita menaikkan nilai batas bawah, sehingga membuat algoritma menjadi salah.

Pertanyaan saya adalah: Bagaimana cara menghitung batas atas, tanpa menggunakan nilai batas bawah?


person John McBrown    schedule 20.03.2013    source sumber
comment
Apakah Anda sengaja meninggalkan operasi pergeseran/skala dari kodesemu, atau apakah Anda berencana menyimpan semua data di memori hingga kompresi selesai? Menurut saya, jenis pembulatan yang Anda perlukan bergantung pada detail cara Anda menanganinya...   -  person comingstorm    schedule 21.03.2013
comment
Saya baru saja membaca tentang perpindahan bit. Namun saya menggunakan BigDecimals dalam implementasi Java saya, dan saya merasa sulit untuk hanya mengoperasikan bit yang paling signifikan. Tahukah Anda bagaimana saya bisa melakukannya di Java dengan BigDecimals?   -  person John McBrown    schedule 22.03.2013
comment
Saya sarankan menggunakan long sebagai gantinya.   -  person comingstorm    schedule 22.03.2013
comment
Hmm.. tahukah kamu kalau aku bisa leluasa menggunakan shift menggunakan long?   -  person John McBrown    schedule 22.03.2013
comment
Karena Anda menggunakan Java, Anda dapat menggunakan operator pergeseran kanan unsigned >>> untuk melakukan jenis pergeseran yang Anda perlukan untuk kompresi aritmatika.   -  person comingstorm    schedule 22.03.2013
comment
Saya sedang melakukan penelitian mengenai hal ini untuk melihat apakah saya tidak dapat mencoba dan menggunakannya. Terima kasih atas semua bantuan Anda, saya akan segera mengabari Anda. Jika Anda dapat memberikan kode apa pun, saya juga akan sangat berterima kasih.   -  person John McBrown    schedule 22.03.2013
comment
Ups, operator utama sebenarnya yang paling Anda perlukan untuk kompresi aritmatika adalah operator shift kiri <<. Namun, bergantung pada cara Anda mengimplementasikan matematika Anda, mengetahui tentang operator shift kanan yang tidak bertanda tangan juga bisa berguna...   -  person comingstorm    schedule 22.03.2013


Jawaban (1)


Untuk menggeser string Anda ke left , gunakan: string.substring(1)

person Amir    schedule 23.06.2013