diff --git a/budd-common/src/main/java/io/github/ehlxr/MyBloomFilter.java b/budd-common/src/main/java/io/github/ehlxr/MyBloomFilter.java new file mode 100644 index 0000000..47031e4 --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/MyBloomFilter.java @@ -0,0 +1,127 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr; + +import java.util.BitSet; + +/** + * @author ehlxr + * @since 2021-12-16 09:36. + */ +public class MyBloomFilter { + /** + * 一个长度为10 亿的比特位 + */ + private static final int DEFAULT_SIZE = 256 << 22; + + /** + * 为了降低错误率,使用加法hash算法,所以定义一个8个元素的质数数组 + */ + private static final int[] SEEDS = {3, 5, 7, 11, 13, 31, 37, 61}; + + /** + * 相当于构建 8 个不同的hash算法 + */ + private static final HashFunction[] HASH_FUNCS = new HashFunction[SEEDS.length]; + + /** + * 初始化布隆过滤器的 bitmap + */ + private static final BitSet BIT_SET = new BitSet(DEFAULT_SIZE); + + /** + * 添加数据 + * + * @param value 需要加入的值 + */ + public static void add(String value) { + if (value != null) { + for (HashFunction f : HASH_FUNCS) { + //计算 hash 值并修改 bitmap 中相应位置为 true + BIT_SET.set(f.hash(value), true); + } + } + } + + /** + * 判断相应元素是否存在 + * + * @param value 需要判断的元素 + * @return 结果 + */ + public static boolean contains(String value) { + if (value == null) { + return false; + } + boolean ret = true; + for (HashFunction f : HASH_FUNCS) { + ret = BIT_SET.get(f.hash(value)); + //一个 hash 函数返回 false 则跳出循环 + if (!ret) { + break; + } + } + return ret; + } + + /** + * 模拟用户是不是会员,或用户在不在线。。。 + */ + public static void main(String[] args) { + for (int i = 0; i < SEEDS.length; i++) { + HASH_FUNCS[i] = new HashFunction(DEFAULT_SIZE, SEEDS[i]); + } + + // 添加1亿数据 + for (int i = 0; i < 1_0000_0000; i++) { + add(String.valueOf(i)); + } + String id = "123456789"; + add(id); + + System.out.println(contains(id)); // true + System.out.println("" + contains("234567890")); //false + } +} + +class HashFunction { + private final int size; + private final int seed; + + public HashFunction(int size, int seed) { + this.size = size; + this.seed = seed; + } + + public int hash(String value) { + int result = 0; + int len = value.length(); + for (int i = 0; i < len; i++) { + result = seed * result + value.charAt(i); + } + int r = (size - 1) & result; + return (size - 1) & result; + } +} \ No newline at end of file diff --git a/budd-common/src/main/java/io/github/ehlxr/datastructure/linkedlist/ListNode.java b/budd-common/src/main/java/io/github/ehlxr/datastructure/linkedlist/ListNode.java new file mode 100644 index 0000000..e8bf51e --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/datastructure/linkedlist/ListNode.java @@ -0,0 +1,64 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr.datastructure.linkedlist; + +/** + * 链表节点数据结构 + * + * @author ehlxr + * @since 2021-12-23 14:41. + */ +public class ListNode { + private int val; + private ListNode next; + + public ListNode(int val, ListNode next) { + this.val = val; + this.next = next; + } + + public int getVal() { + return val; + } + + public void setVal(int val) { + this.val = val; + } + + public ListNode getNext() { + return next; + } + + public void setNext(ListNode next) { + this.next = next; + } + + @Override + public String toString() { + return "SingleNode{" + + "val=" + val + + '}'; + } +} diff --git a/budd-common/src/main/java/io/github/ehlxr/datastructure/linkedlist/ReverseLinkedList.java b/budd-common/src/main/java/io/github/ehlxr/datastructure/linkedlist/ReverseLinkedList.java new file mode 100644 index 0000000..df0cee0 --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/datastructure/linkedlist/ReverseLinkedList.java @@ -0,0 +1,110 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr.datastructure.linkedlist; + +/** + * @author ehlxr + * @since 2021-12-23 14:40. + */ +public class ReverseLinkedList { + public static void main(String[] args) { + ListNode n5 = new ListNode(5, null); + ListNode n4 = new ListNode(4, n5); + ListNode n3 = new ListNode(3, n4); + ListNode n2 = new ListNode(2, n3); + ListNode n1 = new ListNode(1, n2); + ListNode head = new ListNode(0, n1); + + print(head); + + System.out.println("-------------"); + // head = reverse(head); + head = reverse2(head); + // head = reverse3(head, null); + print(head); + + } + + public static void print(ListNode head) { + if (head == null) { + return; + } + + ListNode n = head; + while (n != null) { + System.out.println(n); + n = n.getNext(); + } + } + + // 循环方式 + public static ListNode reverse(ListNode head) { + if (head == null || head.getNext() == null) { + return head; + } + ListNode pre = null; + + ListNode cur = head; + while (cur != null) { + ListNode next = cur.getNext(); + cur.setNext(pre); + pre = cur; + + cur = next; + } + + return pre; + } + + // 递归一 + public static ListNode reverse2(ListNode head) { + if (head == null || head.getNext() == null) { + return head; + } + + ListNode next = head.getNext(); + ListNode node = reverse2(next); + + head.getNext().setNext(head); + head.setNext(null); + + return node; + } + + // 递归二 + public static ListNode reverse3(ListNode head, ListNode pre) { + if (head == null) { + return pre; + } + + ListNode next = head.getNext(); + ListNode node = reverse3(next, head); + + head.setNext(pre); + + return node; + } + +}