数据结构与算法之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));
        }
    }
}

说明:以上代码只是简单的操作,没有考虑数值越界后的扩容问题及并发问题,只是提供一个思路。

原文地址:https://www.cnblogs.com/g177w/p/14731596.html