数据结构与算法之hash,bitmap简单实现
1.hash算法就是将目标值存储前进行打散,然后将其存储到数组中,打散的操作就是hash函数,常见的就是取模,对上限取模操作后找到其下标,然后将之存储,典型代表是jdk hashmap(hash函数非简单的取模操作),hash存在的意义就是充分利用数组随机访问的特性,将取值操作的过程时间复杂度尽可能优化到O(1)。
2.bitmap,核心思想是充分利用到计算机的最小存储单元bit,在内部创建一个byte数组,每个数组下标对于的值都可以表示8位,以此实现存储上的压缩
2.1BitMap.java
package com.hfm.util; import java.util.Arrays; public class BitMap { byte data[]; int len; public BitMap(int cap) { this.len = (cap>>3)+1; this.data = new byte[this.len]; } public void add(int item){ int index = (item>>3), loc = item%8; data[index] |= 1<<loc; } public void remove(int item){ int index = (item>>3), loc = item%8; data[index] ^= 1<<loc; } public boolean isPresent(int item){ int index = (item>>3), loc = item % 8, num = 1 << loc; return (num & data[index]) == num ; } public static void main(String[] args) { BitMap map = new BitMap(100); map.add(1); map.add(11); map.add(19); map.add(89); for (int i = 0; i < 101; i++) { System.out.println(i+":"+map.isPresent(i)); } System.out.println("-------------------------"); map.remove(19); for (int i = 0; i < 101; i++) { System.out.println(i+":"+map.isPresent(i)); } } }
说明:以上代码只是简单的操作,没有考虑数值越界后的扩容问题及并发问题,只是提供一个思路。