diff --git a/README.md b/README.md index fb49d0501a9ec495209c86e9b9fac1ab7b87a815..4ad05ea19be49963487caca50113b26a5384379a 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ [链表K个节点的组内逆序调整问题](https://www.cnblogs.com/greyzeng/p/17859529.html) +[位图的使用与实现](https://www.cnblogs.com/greyzeng/p/16634282.html) + ## 更多 [算法和数据结构学习笔记:CSDN](https://blog.csdn.net/hotonyhui/category_1250716.html) @@ -30,8 +32,6 @@ [算法和数据结构学习代码: Github](https://github.com/GreyZeng/algorithm) -[算法和数据结构学习代码: GitCode](https://gitcode.net/hotonyhui/algorithm) - ## 参考资料 [算法和数据结构基础班-左程云](https://ke.qq.com/course/2145184) \ No newline at end of file diff --git a/src/main/java/git/snippet/bit/BitMap.java b/src/main/java/git/snippet/bit/BitMap.java new file mode 100644 index 0000000000000000000000000000000000000000..f08fae8b1f95c241832add1232dd3ceb0fc815de --- /dev/null +++ b/src/main/java/git/snippet/bit/BitMap.java @@ -0,0 +1,36 @@ +package git.snippet.bit; + +import java.util.HashSet; +import java.util.Set; + +// 位图 +// 笔记:https://www.cnblogs.com/greyzeng/p/16634282.html + +// 位图 +public class BitMap { + + private final long[] bits; + + // 初始化 + public BitMap(int max) { + // 准备多少个整数? 0 ~ 63 需要1个整数 + // >> 6 就是 除以 64 >> 效率比除法高 + bits = new long[(max + 64) >> 6]; + } + + public void add(int num) { + // bits[num / 64] |= (1L << (num % 64)); + // num % 64 ---> num & 63 即:0b111111 + // 只适用于 2 的 n 次方 + // 注意:这里是1L非1,如果是1,因为要管64位 + bits[num >> 6] |= (1L << (num & 0b111111)); + } + + public void remove(int num) { + bits[num >> 6] &= ~(1L << (num & 0b111111)); + } + + public boolean contains(int num) { + return (bits[num >> 6] & (1L << (num & 0b111111))) != 0; + } +} \ No newline at end of file diff --git a/src/main/java/git/snippet/bit/Code_BitMap.java b/src/main/java/git/snippet/bit/Code_BitMap.java deleted file mode 100644 index cdc82763213660253537baf4298ed3b476ed7db6..0000000000000000000000000000000000000000 --- a/src/main/java/git/snippet/bit/Code_BitMap.java +++ /dev/null @@ -1,68 +0,0 @@ -package git.snippet.bit; - -import java.util.HashSet; -import java.util.Set; - -// 位图 -// 笔记:https://www.cnblogs.com/greyzeng/p/16634282.html -public class Code_BitMap { - - public static void main(String[] args) { - System.out.println("test begin"); - int max = 70000; - BitMap bitMap = new BitMap(max); - Set set = new HashSet<>(); - int testTime = 90000000; - for (int i = 0; i < testTime; i++) { - int num = (int) (Math.random() * (max + 1)); - double decide = Math.random(); - if (decide < 0.333) { - bitMap.add(num); - set.add(num); - } else if (decide < 0.666) { - bitMap.remove(num); - set.remove(num); - } else { - if (bitMap.contains(num) != set.contains(num)) { - System.out.println("Oops!"); - break; - } - } - } - for (int num = 0; num <= max; num++) { - if (bitMap.contains(num) != set.contains(num)) { - System.out.println("Oops!"); - } - } - System.out.println("test end"); - } - - // 位图 - public static class BitMap { - - private final long[] bits; - - // 初始化 - public BitMap(int max) { - // 准备多少个整数? 0 ~ 63 需要1个整数 - // >> 6 就是 除以 64 >> 效率比除法高 - bits = new long[(max + 64) >> 6]; - } - - public void add(int num) { - // bits[num / 64] |= (1L << (num % 64)); - // num % 64 ---> num & 63 即:0b111111 - // 只适用于 2 的 n 次方 - // 注意:这里是1L非1,如果是1,因为要管64位 - bits[num >> 6] |= (1L << (num & 0b111111)); - } - - public void remove(int num) { - bits[num >> 6] &= ~(1L << (num & 0b111111)); - } - - public boolean contains(int num) { - return (bits[num >> 6] & (1L << (num & 0b111111))) != 0; - } - } -} diff --git a/src/test/java/git/snippet/bit/BitMapTest.java b/src/test/java/git/snippet/bit/BitMapTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e62f7bc8af94fd08f606716e0e67d8b27e31033d --- /dev/null +++ b/src/test/java/git/snippet/bit/BitMapTest.java @@ -0,0 +1,37 @@ +package git.snippet.bit; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.HashSet; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("位图测试") +public class BitMapTest { + @Test + void testBitMap() { + // System.out.println("test begin"); + int max = 70000; + BitMap bitMap = new BitMap(max); + Set set = new HashSet<>(); + int testTime = 90000000; + for (int i = 0; i < testTime; i++) { + int num = (int) (Math.random() * (max + 1)); + double decide = Math.random(); + if (decide < 0.333) { + bitMap.add(num); + set.add(num); + } else if (decide < 0.666) { + bitMap.remove(num); + set.remove(num); + } else { + assertEquals(bitMap.contains(num), set.contains(num)); + } + } + for (int num = 0; num <= max; num++) { + assertEquals(bitMap.contains(num), set.contains(num)); + } + } +} \ No newline at end of file