java如何截取最后一個字符 java怎么使用隨機抽取數(shù)組里的數(shù)據(jù)?
java怎么使用隨機抽取數(shù)組里的數(shù)據(jù)?Random r njava一段字符串中,如何得到大括號內(nèi)的字符?1.可以使用常規(guī)匹配檢查來做到這一點。2、是使用字符串的截取,首先(Java中,哪種壓縮算法可以
java怎么使用隨機抽取數(shù)組里的數(shù)據(jù)?
Random r n
java一段字符串中,如何得到大括號內(nèi)的字符?
1.可以使用常規(guī)匹配檢查來做到這一點。
2、是使用字符串的截取,首先(
Java中,哪種壓縮算法可以對30M左右的文件做到較大的壓縮率,解壓后文件MD5值要保持不變?
分析主體的需求如下:
1.高壓縮比
保持不變
對應(yīng)于技術(shù)語言,目標壓縮算法必須滿足兩個條件:
1.高壓縮效率
2.無損壓縮
1.什么是無損壓縮?無損壓縮是指數(shù)據(jù)壓縮后,信息不丟失,可以完全恢復(fù)到壓縮前的原始狀態(tài)。
無損壓縮技術(shù)主要包括兩個步驟:
(1)建模
(2)根據(jù)模型,高頻部分用短碼表示,低頻部分用長碼表示。
步驟(2)中使用的常見編碼技術(shù)是霍夫曼編碼(也用于D:low0,high 1。
(4)不斷讀取原始數(shù)據(jù)的字符,找到這個字符所在的區(qū)間,比如[L,H],更新:。
低低(高-低)* L
高-低(高-低)* H
(5)最后,將得到的區(qū)間[低,高]中的任意小數(shù)以二進制形式輸出,得到編碼數(shù)據(jù)。
具體例子如下:
阿爾伯
統(tǒng)計它們出現(xiàn)的頻率和概率:
將這些字符的區(qū)間按照概率逐一排列,我們得到一個[0,1]的劃分區(qū)間:開始編碼,初始區(qū)間為[0,1]。注意這里又用到了區(qū)間這個詞,但是這個區(qū)間和上面代表每個字符的概率區(qū)間不一樣。這里我們可以稱之為編碼間隔,這個間隔會變,確切的說會越來越小。循序漸進:
(1)初始編碼間隔為[0,1],即
低0
高1
(2)第一個字符A的概率區(qū)間是[0,0.2],那么L 0,H 0.2,更新:
低低(高-低)* L0
高-低(高-低)* H0.2
(3)如果第二個字符r的概率區(qū)間是[0.6,1],那么L 0.6,H 1,更新:
低低(高-低)* L0.12
高-低(高-低)* H0.2
(3)第三個字符B的概率區(qū)間是[0.2,0.4],那么L 0.2,H 0.4,更新:
低低(高-低)* L0.136
高-低(高-低)* H0.152
(4) ......
根據(jù)以上描述,不難看出這種算法的特點:
每次編碼時,在現(xiàn)有區(qū)間上找到子區(qū)間,形成 "區(qū)間集 ":比如一開始A落在0到0.2上,那么編碼區(qū)間就縮小到[0,0.2],第二個字符是R,那么R對應(yīng)的子區(qū)間[0.12,0.2]就在[0,0.2]上按比例取出,以此類推。最后,我們得到一個長十進制數(shù),它神奇地包含了所有的原始數(shù)據(jù)。
3.算術(shù)編碼的解碼過程是編碼過程的逆過程。從編碼的小數(shù)開始,通過不斷尋找小數(shù)落在哪個概率區(qū)間,就可以一個一個地找出原來的字符。比如十進制數(shù)是0.14432,第一個字符顯然是a,因為落在[0,0.2]上。然后看[0,0.2]區(qū)間0.14432落在哪個相對子區(qū)間上,發(fā)現(xiàn)是[0.6,1],這樣就可以發(fā)現(xiàn)第二個字符是R,以此類推。
是如何實現(xiàn)算術(shù)編碼的?/** *算術(shù)編碼* */公共類算術(shù){ // Charact:{ A,B,C,D,E,F(xiàn),$}}私有char[] symbolchars // P: { 0.2,0.1,0.2,0.05,0.3,0.05,0.1 }私有double[]概率公共算術(shù)(char[] symbolchars,double[]概率){ symbolchars probability }/* * * * @ param symbols */public double coding(字符串符號){ char[]cs()double symbolRangeLow[]new double[probability . length]for(int I 0 I lt symbolRangeLow . length I){ symbolRangeLow[I]for(int j 0j lt I j){ symbolRangeLow[I]probability[j]} } int current symbol double low 0.0 double high 1.0 double range 1.0 for(int I 0 I lt cs . length I){ current symbol symbol(chars, cs[i])低低范圍* symbolRangeLow[currentSymbol]高低范圍*概率[currentSymbol]范圍高-低}返回低(高-低)/ 2 } /** * * @param codeNumber */公共字符串解碼(double codeNumber){ String symbolRangeLow[]new double[probability . length]for(int I 0 I lt symbolRangeLow . length I){ symbolRangeLow[I]0 for(int j 0j lt I j){ symbolRangeLow[I]概率[j] } }h I){ subSymbolRangeLow[I]symbolRangeLow[I]subSymbolRangeLow[I]probability[I]} int current symbol 0 do { for(int I 0 I lt symbol chars . length I){ if(codeNumber gt subSymbolRangeLow[I]ampamp codeNumber lt subSymbolRangeLow[I]subSymbolRange[I])
sub range sub symbolrangelow[I]sub range sub symbolrange[I]current symbol I } } double sub symbolprobsum sub range for(int I 0 I lt symbol chars . length I){
subSymbolRange[I]subRange * probability[I]subSymbolRangeLow[I]subSymbolProbSum subSymbolProbSum subSymbolRange[I]} symbol chars[current symbol]} while(symbol chars[current symbol]!$)return symbols } public int getIndex(char[]cs,char C){ for(int I 0 I lt cs . length I){ if(cs[I]C){ return-1 }//Test public static void main(String args[]){ char[]symbolchars { A,B,C,D,E,F(xiàn),$ } double[] probability { 0.2,0.1,0.2,0.05,0.3,0.05,0.1 }算術(shù)算術(shù)新算術(shù)(symbol chars,probabilitycodeNumber) ((codeNumber)) } }