問題引入:
有100萬個字串,他們長度各異,分布在[1,256]這個區間內。請設計一種方法來依次記錄這些字串的長度。
要求:
用盡可能少的空間來儲存這些長度。
例子:
例如有下面四個串:
hello (5)
abc(3)
abcd(4)
good morning (12)
可以用2位元組來編碼他們的長度:5、3編碼到第乙個位元組,4、12編碼到第二個位元組,最後的二進位制表示就是:01010011 10001100。解碼的時候,每4位作為乙個解碼單元即可按順序解碼。
對於上面的例子,你有更好的編碼方案嗎?
a step further:
上面的例子中只有4個字串,而問題中有100萬個字串,並且注意到其長度分布只在[1,256]之間,我們能不能利用這個特殊的問題結構呢?
首先還是使用最簡單的解決方案:每個字串長度用1位元組來編碼(2^8 = 256,正好哦)。此時需要的空間為100萬位元組。
如果這100萬個字串的長度分布具有一定特徵呢?比如,1-15位元組長的字串佔90%,其餘的只佔10%,有沒有更好的編碼方式呢?舉個例子,拋磚引玉:
1~15用4bit位來編碼,其中1111用來做特徵碼,表示當前長度不是1-15,需要往後看。16~256用4+8 = 12bit編碼,且前4bit恒為1111,後8位填入實際長度。讓我們來算一算此時消耗掉的位元組數:
0.5byte * 100w * 90% + 1.5byte * 100w * 10% = 60w byte
比直接用1位元組編碼每個長度節約了40萬位元組!
看到這裡,你是不是想到了……
對,huffman編碼!高頻率的資料用較少位編碼,低頻率的資料用較多位編碼。但是,為了提高解壓速度,特別是在資料頻率分布呈現出一定的單調性的時候,我們可以對huffman編碼方法進行化簡,使得解碼時只需要通過判斷特徵碼就可以確定編碼方法。具體該怎麼做呢?留給天才的你來解決咯~~~
note: 長度編碼與huffman編碼的聯絡我起初還沒想到,是在敲這篇文章的時候邊敲邊想,突然聯絡起來的。嗯,一下上公升到規範化的理論階段了^___^
資料編碼技術
資料編碼技術型別和方法 1.資料編碼型別 在計算機中資料是以離散的二進位制0 1位元序列方式表示的。計算機資料在傳輸過程中的資料編碼型別,主要取決於它採用的通訊通道所支援的資料通訊型別。根據資料通訊型別,網路中常用的通訊通道分為兩類 模擬通訊通道與數字通訊通道。相應的用於資料通訊的資料編碼方式也分為...
資料編碼方式
4類資料傳輸方式 1 模擬資料用模擬訊號傳輸 2 模擬資料用數碼訊號傳輸 3 數字資料用模擬訊號傳輸 4 數字資料用數碼訊號傳輸 除第 1 種外,都需要資料編碼 1 模擬資料用模擬訊號傳輸 例如傳統的 2 模擬資料用數碼訊號傳輸 例如數位化 訊號數位化的轉換過程採用脈衝編碼調製 pcm pcm技術以...
資料編碼問題
1.檢查程式設定過濾器配置 一般第一步可能會去看spring專案中的web.xml是否設定了字元過濾器 2 檢查tomcat 配置檔案 server.xml 3 檢查資料庫連線 4 檢查日誌,檢視是否資料本身亂碼 5 追溯建立資料庫時選擇編碼是否正確。6 檢查資料庫整體編碼情況 show varia...