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