我有一個字節數據流,也稱爲基數256個符號。什麼是最好的算法,在理想情況下將其轉換爲新的符號流,每個符號的基數變化並且只在運行時才知道?輸入字節流和目標基數列表的長度都很長但是有限。所有非負整數,無浮點。此外,目標基數不能保證均勻分配或是256的倍數。從基數256轉換爲多基數並返回的算法
回答
您的問題是算術編碼的一個子集,它被用作許多壓縮算法的最後一個階段。這是最酷的事情在CS學習一種:
http://www.drdobbs.com/cpp/data-compression-with-arithmetic-encodin/240169251 https://en.wikipedia.org/wiki/Arithmetic_coding
如何您的問題具體涉及:
你想要的編碼器是算術解碼器,併爲每個解碼您將使用一個不同大小的字母表(基數),所有符號的概率相同。
編碼器的主循環會做這樣的事情:
int val=0; //information from the stream
int range=1; //val is in [0,range)
while(...)
{
int radix = next_radix();
//ensure adequate efficiency
while(range < radix*256)
{
val = (val<<8)|(next_byte()&255);
range<<=8;
}
int output = (int)(radix*(long)val/range);
//find the smallest possible val that produces this output
int low = (int)((output*(long)range+radix-1)/radix);
//find the smallest possible val that produces the next output
int high = (int)(((output+1)*(long)range+radix-1)/radix);
val-=low;
range = high-low;
write(output);
}
沒有與處理終止的條件和處理在您的解碼器進行(算術編碼器)的併發症,所以你必須閱讀文學,從我鏈接的東西開始。儘管如此,我希望這能夠讓你瞭解它的工作原理。
好運
是否這樣:'(out * self._range + radix - 1)/ radix'沒有評估這個? '(out * self.range - 1)/ radix + 1'?同樣,'((out + 1)* self._range + radix-1)/ radix' ='((out + 1)* self._range - 1)/ radix + 1' – Reinderien
當out = = 0,因爲整數除法捨去而不是舍入。 (A + B-1)/ B是四捨五入的,(A +(B >> 1))/ B是四捨五入到最近的A/B,並且A/B是A/B向下取整。 –
- 1. 我需要將數字從基數255轉換爲基數256
- 2. 從基數10轉換爲基數2
- 3. 從基數10轉換爲基數3
- 4. 從基數60轉換爲基數10
- 5. 在JavaCard平臺上將基數10數字轉換爲基數256數字
- 6. Python:如何從二進制轉換爲基本64並返回?
- 7. 將基數爲10的數字轉換爲基數爲N的數字的算法
- 8. 轉換3.333333333基數爲二
- 9. 基數轉換的計算複雜度
- 10. 如何從8位字節轉換爲7位字節(基地256基地128)
- 11. 如何將基於回調的函數轉換爲基於Promise的函數?
- 12. 爲什麼從基數10轉換爲基數2被認爲是慢?
- 13. 數字基數轉換遞歸方法
- 14. 將基數10轉換爲基數3數
- 15. 無法轉換爲基類
- 16. 從基本轉換爲Javascript?
- 17. 從UniqueIdentifier轉換爲BigInt並返回?
- 18. 基本Java:方法計算返回NaN
- 19. 將多維數組轉換爲字符串並返回
- 20. 牢固,keccak 256函數返回一個散列值。 keccak 256返回多少位?
- 21. 將RGB從字符串轉換爲數字並返回
- 22. Bash。返回基於參數
- 23. 將基數10轉換爲二進制
- 24. 將十進制轉換爲基數x
- 25. 在Java中轉換爲基數10?
- 26. x86彙編轉換基數
- 27. 將整數(用數組表示)轉換爲基數爲m的整數的算法
- 28. 將數字轉換爲基於基數的字母數字值36
- 29. Java - 遞歸程序 - 將基數10的數字轉換爲任何基數
- 30. 從REST風格的Web服務方法返回基本數組
確實輸出流需要具有任何特殊性能(如以某種方式的數字),或者你只需要能夠從輸出流和基數得到原來的流背清單? –
@MattTimmermans基本上,分開指定基數的非負整數。是的,原始流必須稍後恢復。 – Reinderien