java如何截取最后一个字符 java怎么使用随机抽取数组里的数据?
java怎么使用随机抽取数组里的数据?
Random r n
java一段字符串中,如何得到大括号内的字符?
1.可以使用常规匹配检查来做到这一点。
2、是使用字符串的截取,首先(
Java中,哪种压缩算法可以对30M左右的文件做到较大的压缩率,解压后文件MD5值要保持不变?
分析主体的需求如下:
1.高压缩比
保持不变
对应于技术语言,目标压缩算法必须满足两个条件:
1.高压缩效率
2.无损压缩
1.什么是无损压缩?无损压缩是指数据压缩后,信息不丢失,可以完全恢复到压缩前的原始状态。
无损压缩技术主要包括两个步骤:
(1)建模
(2)根据模型,高频部分用短码表示,低频部分用长码表示。
步骤(2)中使用的常见编码技术是霍夫曼编码(也用于D:low0,high 1。
(4)不断读取原始数据的字符,找到这个字符所在的区间,比如[L,H],更新:。
低低(高-低)* L
高-低(高-低)* H
(5)最后,将得到的区间[低,高]中的任意小数以二进制形式输出,得到编码数据。
具体例子如下:
阿尔伯
统计它们出现的频率和概率:
将这些字符的区间按照概率逐一排列,我们得到一个[0,1]的划分区间:开始编码,初始区间为[0,1]。注意这里又用到了区间这个词,但是这个区间和上面代表每个字符的概率区间不一样。这里我们可以称之为编码间隔,这个间隔会变,确切的说会越来越小。循序渐进:
(1)初始编码间隔为[0,1],即
低0
高1
(2)第一个字符A的概率区间是[0,0.2],那么L 0,H 0.2,更新:
低低(高-低)* L0
高-低(高-低)* H0.2
(3)如果第二个字符r的概率区间是[0.6,1],那么L 0.6,H 1,更新:
低低(高-低)* L0.12
高-低(高-低)* H0.2
(3)第三个字符B的概率区间是[0.2,0.4],那么L 0.2,H 0.4,更新:
低低(高-低)* L0.136
高-低(高-低)* H0.152
(4) ......
根据以上描述,不难看出这种算法的特点:
每次编码时,在现有区间上找到子区间,形成 "区间集 ":比如一开始A落在0到0.2上,那么编码区间就缩小到[0,0.2],第二个字符是R,那么R对应的子区间[0.12,0.2]就在[0,0.2]上按比例取出,以此类推。最后,我们得到一个长十进制数,它神奇地包含了所有的原始数据。
3.算术编码的解码过程是编码过程的逆过程。从编码的小数开始,通过不断寻找小数落在哪个概率区间,就可以一个一个地找出原来的字符。比如十进制数是0.14432,第一个字符显然是a,因为落在[0,0.2]上。然后看[0,0.2]区间0.14432落在哪个相对子区间上,发现是[0.6,1],这样就可以发现第二个字符是R,以此类推。
是如何实现算术编码的?/** *算术编码* */公共类算术{ // Charact:{ A,B,C,D,E,F,$}}私有char[] symbolchars // P: { 0.2,0.1,0.2,0.05,0.3,0.05,0.1 }私有double[]概率公共算术(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,$ } double[] probability { 0.2,0.1,0.2,0.05,0.3,0.05,0.1 }算术算术新算术(symbol chars,probabilitycodeNumber) ((codeNumber)) } }
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。