先把全部数按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