先把全部數按65535劃分, 劃分方法就是求商和餘數,商表明數字最終在哪一塊,餘數表明最終在塊內的數字
好比 1, 65536, 65537, 131073
則分紅三個block: 1 | 1,2 | 3elasticsearch
對每一塊的數據作判斷,若是數據量大於4096,就用bitmap對這一塊編碼;不然保持不變,用原來對short格式。
bitmap編碼: 好比 [1, 2, 5, 7]編碼後11001001, 即每一位表明一個數post
爲何用4096劃分?
固定每塊須要內存65535位,這種狀況下,short最多存4096個數,大於4096只能用bitmap,小於4096不必作轉換,直接short就能夠了。編碼
把list按從數量從最少到最多排列,好比 l1 = [1, 10, 20], l2 = [1, 5, 10, 15, 20], l3 =[2, 4, 8, 10, 15 ,18, 20]
第一個用10舉例,10有兩個尾巴節點,一個指向本身的20,一個指向 l2的10,這樣就直接跳到了l2的10,就不須要再查l2的5了; 一樣l2的10指向l3的10, 就能夠跳過l3的2 4 8內存
若是是bitmap 不是short,直接按位與it