update at 2021-12-23 22:17:46 by ehlxr

This commit is contained in:
ehlxr 2021-12-23 22:17:46 +08:00
parent 78d8ad252b
commit 4bacec63a3
3 changed files with 301 additions and 0 deletions

View 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;
}
}

View File

@ -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 +
'}';
}
}

View File

@ -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;
}
}