簡單的索引合并壓縮演算法研究,索引合并壓縮演算法

來源:互聯網
上載者:User

簡單的索引合并壓縮演算法研究,索引合并壓縮演算法

索引合并壓縮演算法的思路是:

 

索引合并壓縮演算法有一種有損壓縮,主要用於對包含一定噪音的整型數組進行合并壓縮。演算法原理就像下雨一樣,每一滴都會濺射出一小片濕潤地區,如果下一滴落在前面的濕潤地區那麼 就加強該地區,並且重新計算濕潤中心;如果兩片地區重疊 那麼就將兩片合并,並且重新計算濕潤中心。

 

演算法描述:

 

前段時間研究紅外遙控器學習模型,由於學習過程中採集到的紅外碼是一個整型數組且在數值上很不規範,有可能是雜訊的原因,獲得的整型數組會有很微小的波動偏差,使得垃圾資料含量很大。導致紅外碼儲存,傳輸,分析都十分困難。雨滴演算法,就是把數值上十分接近的碼值合并成一個,並用所有修正後的碼值建立索引表,之後把所有碼值使用索引表的下標表示,經過分析觀察,發現所有經過索引的碼值均在16的範圍之內,於是進一步把該值壓縮到半個位元組了也就是半個byte或者char內,然後把索引表附到變形後的數組之前,共同組成加密後的紅外碼。經過這些校正和壓縮,新的碼值數組長度為以前資料長度的八分之一加上索引表的長度。


java演算法如下:

import java.util.LinkedList;import java.util.List;public class XiaoMiAlgRainEncode2 {static final short  ALG_RAIN_MAGIC =(short) 0xA567;static final int  WET_NUM =16;static final int SAMPLE_NUM= 1000;static final int SOAK_RANGE = 26; //39//80public class AlgRain {public int avr;public int total;public int min;public int max;public int cnt;public short idx;public AlgRain(int val, int min, int max) {super();this.avr = val;this.total = val;this.min = min;this.max = max;this.cnt = 1;}public AlgRain() {super();this.avr = 0;this.total = 0;this.min = 0;this.max = 0;this.cnt = 0;}@Overridepublic String toString() {return "AlgRain [avr=" + avr + ", total=" + total + ", min=" + min+ ", max=" + max + ", cnt=" + cnt + ", idx=" + idx + "]";}}public class AlgRainTable {public short m_ver = 0;public short num = 0;public int[] val= new int[WET_NUM];public AlgRainTable() {super();this.m_ver = ALG_RAIN_MAGIC;this.num = 0;//System.arraycopy(val, 0, 0x00, 0, 1);for (int i = 0; i < WET_NUM; i++){val[i] = 0;}}}private List<AlgRain> mWets = new LinkedList<AlgRain>();private AlgRainTable mArt = new AlgRainTable();private static boolean isCross(AlgRain w, AlgRain ref){return (Math.max(w.min, ref.min) <= Math.min(w.max, ref.max));}private void soak(){for (int i = 0; i < mWets.size(); i++){AlgRain w1 = mWets.get(i);for (int j = i+1; j < mWets.size(); j++){AlgRain w2 = mWets.get(j);if (isCross(w1, w2)){(mWets.get(i)).total += w2.total;(mWets.get(i)).cnt += w2.cnt;(mWets.get(i)).avr = (mWets.get(i)).total/(mWets.get(i)).cnt;(mWets.get(i)).max = Math.max((mWets.get(i)).max, w2.max);(mWets.get(i)).min = Math.max((mWets.get(i)).min, w2.min);mWets.remove(j);}}}}private void alg_rain_reset(){mWets.clear();}private int alg_rain_feed(int sample){AlgRain w = new AlgRain(sample, sample - SOAK_RANGE/2, sample + SOAK_RANGE/2);for (AlgRain ww: mWets){if (isCross(ww, w)){ww.total += w.total;ww.cnt += w.cnt;ww.avr = ww.total/ww.cnt;ww.max = Math.max(ww.max, w.max);ww.min = Math.max(ww.min, w.min);return 0;}}mWets.add(w);//soak();return 0;}private int alg_rain_feed_finish(){short idx = 0;int cnt = 0;soak();for (AlgRain w: mWets){w.idx = idx;mArt.val[idx] = w.avr;cnt += w.cnt;idx++;}mArt.num = (short) cnt;mArt.m_ver= ALG_RAIN_MAGIC;for (int i = 0; i < mWets.size(); i++){System.out.println("AAAAA mWets["+i+"].avr="+mWets.get(i).toString());}    return cnt;}private int get_alg_rain_table_encode(int sample){System.out.println("AAAAA sample="+sample);for (AlgRain w: mWets){System.out.println("AAAAA w="+w.toString());if((sample > w.min) && (sample < w.max)){return w.idx;}}return -1;}private int get_alg_rain_table_decode(int idx, byte code){byte value; if(idx%2 == 0){value = (byte)(0x0F & code);}else{value = (byte)(0x0F & code >> 4);}return mArt.val[value];}private byte[] alg_rain_table_encode(AlgRainTable a){int size = 2 + 2 + 4*WET_NUM ;byte[] bb = new byte[size];System.arraycopy(XiaoMiBigLittle.little_intToByte(a.m_ver, 2), 0, bb, 0,  2);System.arraycopy(XiaoMiBigLittle.little_intToByte(a.num, 2), 0, bb, 2, 2);for (int i = 0; i < WET_NUM; i++){byte[] b = XiaoMiBigLittle.little_intToByte(a.val[i], 4);for (int j = 0; j < b.length; j++){System.out.println("AAAAA bbbb["+j+"]="+b[j]);//System.arraycopy(b[j], 0, bb, 4+i*4+j, 1);bb[4+i*4+j] = b[j];}//System.arraycopy(b, 0, bb, 4+i, 4);}return bb;}private AlgRainTable alg_rain_table_decode(byte[] b){byte[] b1= new byte[2];byte[] b2= new byte[4];AlgRainTable a = new AlgRainTable();System.arraycopy(b, 0, b1, 0,  2);a.m_ver = (short)XiaoMiBigLittle.little_bytesToInt(b1);System.arraycopy(b, 2, b1, 0, 2);a.num = (short)XiaoMiBigLittle.little_bytesToInt(b1);for (int i = 0; i < WET_NUM; i++){System.arraycopy(b, 4 + i*4, b2, 0, 4);a.val[i] = XiaoMiBigLittle.little_bytesToInt(b2);}return a;}public byte[] get_alg_rain_encode(int[] inSample){int size = 2 + 2 + 4*WET_NUM ;System.out.println("AAAAA size"+size);byte [] outCode = new byte[inSample.length+size];System.out.println("AAAAA inSample.length+size"+inSample.length+size);for (int i : inSample){alg_rain_feed(i);}alg_rain_feed_finish();//int[] tmp = new int[68];System.arraycopy(alg_rain_table_encode(mArt), 0, outCode, 0, size);byte b2=0, b1=0;for (int i = 0; i< inSample.length; i++){b2 = (byte)get_alg_rain_table_encode(inSample[i]);System.out.println("AAAAA b2="+b2+"inSample[i]="+inSample[i]);if(i%2 == 0)//even low nibble{b1 = b2;}else{//odd high nibbleb1 |= b2 << 4;System.out.println("AAAAA b1="+b1);outCode[size+i/2] = b1;}}    return outCode;}public int[] get_alg_rain_decode(byte[] inCode){int size = 2 + 2 + 4*WET_NUM ;AlgRainTable a = alg_rain_table_decode(inCode);int[] outSmaple = new int[a.num];System.out.println("AAAAA a.num="+a.num);for (int i = 0; i < outSmaple.length; i++){if ((i%2) == 0){outSmaple[i] = a.val[inCode[size+(i/2)]&0x0f];}else{outSmaple[i] = a.val[(inCode[size+(i/2)]>>4)&0x0f];}}return outSmaple;}public static void main(String[] args) {// init arrayshort a1[] = new short[100];for (int i = 0; i < a1.length; i++) {a1[i] = (short) ((i % 16) * 100 + 20);System.out.println("AAAAA a1[" + i + "]=" + a1[i]);}// trans intint a[] = new int[100];for (int i = 0; i < a1.length; i++) {if ((a1[i] & 0x8000) != 0) {a[i] = 100 * (int) (a1[i] & 0x7FFF);} else {a[i] = a1[i];}System.out.println("AAAAA a[" + i + "]=" + a[i]);}// rain EncodeXiaoMiAlgRainEncode2 are = new XiaoMiAlgRainEncode2();byte[] b = are.get_alg_rain_encode(a);for (int i = 0; i < b.length; i++) {System.out.println("AAAAA b[" + i + "]=" + b[i]);}// base64 Encodebyte[] eb64 = XiaoMiBase64.Base64Encode(b, b.length);for (int i = 0; i < eb64.length; i++) {System.out.println("AAAAA eb64[" + i + "]=" + eb64[i]);}// base64 decodebyte[] db64 = XiaoMiBase64.Base64Decode(eb64, eb64.length);for (int i = 0; i < db64.length; i++) {System.out.println("AAAAA db64[" + i + "]=" + db64[i]);}// rain decodeint[] c = are.get_alg_rain_decode(b);for (int i = 0; i < c.length; i++) {System.out.println("AAAAA c[" + i + "]=" + c[i]);}// trans shortfor (int i = 0; i < c.length; i++) {if (c[i] > 0x8000) {a1[i] = (short) ((c[i] / 100) | 0x8000);} else {a1[i] = (short) c[i];}System.out.println("AAAAA a1[" + i + "]=" + a1[i]);}System.out.println("AAAAA the mechine is big ="+ XiaoMiBigLittle.isBigendian());}}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.