我有一個字節數據流,也稱爲基數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. 使用按位運算從基數10轉換爲基數
- 6. 在JavaCard平臺上將基數10數字轉換爲基數256數字
- 7. Python:如何從二進制轉換爲基本64並返回?
- 8. 將數字從基數10轉換爲基數4
- 9. 將基數爲10的數字轉換爲基數爲N的數字的算法
- 10. bcp導入數據爲基數256?
- 11. 遞歸轉換基數爲10的數字爲基數
- 12. 將自然數轉換爲特定基並將其作爲列表返回
- 13. 轉換3.333333333基數爲二
- 14. 基數轉換的計算複雜度
- 15. 如何從8位字節轉換爲7位字節(基地256基地128)
- 16. 用於基數轉換算法的SQL函數
- 17. 將從mysql查詢返回的數據轉換爲json(基於樹)
- 18. 如何將基於回調的函數轉換爲基於Promise的函數?
- 19. 大基數轉換
- 20. 爲什麼從基數10轉換爲基數2被認爲是慢?
- 21. Arduino從基準十二轉換爲十基數,反之亦然
- 22. 數字基數轉換遞歸方法
- 23. 將基數10轉換爲基數3數
- 24. 無法轉換爲基類
- 25. 從基本轉換爲Javascript?
- 26. 基本Java:方法計算返回NaN
- 27. 整數轉換爲給定的基地
- 28. 從NSString轉換爲NSDate並返回
- 29. 將多維數組轉換爲字符串並返回
- 30. 轉換從數據庫返回的多維數組數據
確實輸出流需要具有任何特殊性能(如以某種方式的數字),或者你只需要能夠從輸出流和基數得到原來的流背清單? –
@MattTimmermans基本上,分開指定基數的非負整數。是的,原始流必須稍後恢復。 – Reinderien