面试题

现在有一个非常庞大的数据(亿级),假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)

分析

采用bloomFilters进行实现(时间&空间尽可能的有效),bloomFilters也常常用在防止缓存穿透,即服务请求在发送到缓存之前,先查找下bloomFilters,检查对应的key是否存在,不存在直接返回;存在再进入到缓存进行查询->DB查询

实现思路:

实际实现采用多次HASH,查看对应数组内存储的值是否为1,多次hash结果均为1,则认为是存在;存在一定的误判率;hash算法尽可能采用一致性hash方式,确保数据分布较为均匀

 package com.hero.cases;

 import com.beust.jcommander.internal.Lists;
import org.junit.Assert;
import org.junit.Test; import java.util.List; /**
* @Des:判断亿级元素是否存在
* @Auther: 飞狐
* @Date: 2019/3/29
*/
public class BloomFilters { /**
* 数组长度
*/
private int arraySize; private int[] array; public BloomFilters(int arraySize){
this.arraySize = arraySize;
array = new int[arraySize];
} /**
* 写入数据(经过3次Hash,把数组对应的位置标识为1)
* @param key
*/
public void add(String key){
int first = hashcode_1(key);
int second = hashcode_2(key);
int third = hashcode_3(key); array[first % arraySize] = 1;
array[second % arraySize] = 1;
array[third % arraySize] = 1;
} public int hashcode_1(String key){
int hash = 0;
int i ;
for(i = 0; i < key.length(); i++){
hash = 33 * hash + key.charAt(i);
}
return Math.abs(hash);
} /**
* FNV1_32_HASH算法
* @param data
* @return
*/
private int hashcode_2(String data){
final int p = 16777619;
int hash = (int) 2166136261L;
for(int i = 0; i < data.length(); i++){
hash = (hash ^ data.charAt(i)) * p;
}
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5; return Math.abs(hash);
} private int hashcode_3(String key){
int hash,i;
for(hash = 0, i= 0; i < key.length();++i){
hash += key.charAt(i);
hash += (hash << 10);
hash ^= hash >> 6;
}
hash += hash << 3;
hash ^= hash >> 11;
hash += hash << 15;
return Math.abs(hash);
} /**
* 判断元素是否存在
* @param key
* @return
*/
public boolean check(String key){
int first = hashcode_1(key);
int second = hashcode_2(key);
int third = hashcode_3(key); if(array[first % arraySize] == 0){
return false;
} if(array[second % arraySize] == 0){
return false;
} if(array[third % arraySize] == 0){
return false;
}
return true;
} }

运行结果:

检查1: true
检查2: true
检查3: true
检查999999: true
检查400230340: false
执行时间:2261

  

如何快速判断一个key是否存在在亿级数据中(bloomFilters)的更多相关文章

  1. zoj 月赛B题(快速判断一个大数是否为素数)

    给出一个64位的大数,如何快速判断其是否为素数 #include<algorithm> #include<cstdio> #include<cstring> #in ...

  2. Java源码中的发现:快速判断一个int值是几位数

    判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...

  3. 一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?布隆过滤器

    何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算法特点 使用场景 假设遇到这样一个问题:一个网 ...

  4. bitmap-如何判断某个整数是否存在40亿个整数中?

    有这样一道面试题:现有40亿个整数,如果再给定一个新的整数,怎么判断这个整数是否在这40亿个整数中? 你可能首先会想到用一个set存储,那个新数只需判断是否在set中.但是如果用set存储的话,如果一 ...

  5. 判断一个key 是否在map中存在

    public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-gener ...

  6. 判断一个类到底是从哪个jar包中调用的工具类

    项目中使用的jar包较多时,会出现jar冲突的情况,有时候很难判断当前使用的这个类是从哪个jar包中调用的.因为一般我们只能看到jar包的名称,不清楚其中的类的目录结构. 这个类的作用就是说明当前调用 ...

  7. 20 亿的 URL 集合,如何快速判断其中一个?

    假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M ...

  8. 两天快速开发一个自己的微信小程序

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Songti SC" } p.p2 { margin: 0.0px 0. ...

  9. 如何快速开发一个支持高效、高并发的分布式ID生成器

    ID生成器是指能产生不重复ID服务的程序,在后台开发过程中,尤其是分布式服务.微服务程序开发过程中,经常会用到,例如,为用户的每个请求产生一个唯一ID.为每个消息产生一个ID等等,ID生成器也是进行无 ...

随机推荐

  1. Flex4之皮肤定制

    Flex4之皮肤定制[Skin类和Skin类]          博客分类: RIA-Flex4专栏 FlexAdobeUPFlashUI 第一.关于spark.skin.SparkSkin类的 1. ...

  2. logback Filter LevelFilter ThresholdFilter

    LevelFilter: 级别过滤器,根据日志级别进行过滤.如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志.有以下子节点: <level>:设置 ...

  3. ASP.NET MVC 目录介绍

  4. DBlink 创建 删除 脚本

    --配置SQLSERVER数据库的DBLINK --删除dblink Exec sp_droplinkedsrvlogin test,Null Exec sp_dropserver test --创建 ...

  5. linux所有命令不能用显示-bash: ls: command not found

    所有的命令都显示找不到了,原因是修改了/etc/profile造成的 解决方法 1.修正属性文件中的错误 /usr/bin/vi /etc/profile 2.生效属性文件 source /etc/p ...

  6. python3爬虫_环境安装

    一.环境安装 1.python3安装 官网:https://www.python.org/downloads/ 64 位系统可以下载 Windows x86-64 executable install ...

  7. 数据仓库之Data Vault模型总结

    一,Data Vault模型有几个主要的组件,这里先总结一下: 1.Hub组件,是一个数据表,用于记录在业务应用中常用到的业务实体键值,如员工ID,发票号.客户编号.车辆号等. 表内包括几个关键字段: ...

  8. Android中的Context(一)

    Android中的Context(一) 在Android开发中,Context可以说是我们接触地非常多的一个概念了,也译作"上下文",但是这个上下文到底是什么却并不好理解. 通俗的 ...

  9. dataset数据来源方式两种,页面展示

    这两种方式都能获取到报表类别数据. <%--ds 数据源来自JavaBean--%><model:dataset id="ds"> <model:re ...

  10. react-redux-store

    store是联系state 和 reducer的部分 Store 有以下职责: 维持应用的 state: 提供 getState() 方法获取 state: 提供 dispatch(action) 方 ...