update at 2021-12-23 22:17:46 by ehlxr
This commit is contained in:
parent
78d8ad252b
commit
4bacec63a3
127
budd-common/src/main/java/io/github/ehlxr/MyBloomFilter.java
Normal file
127
budd-common/src/main/java/io/github/ehlxr/MyBloomFilter.java
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright © 2021 xrv <xrg@live.com>
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright © 2021 xrv <xrg@live.com>
|
||||
*
|
||||
* 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 +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,110 @@
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright © 2021 xrv <xrg@live.com>
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user