一道百度面试题(待解中)

具体:给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中?

分析下,首先应该是空间复杂度(40亿uint = 400000000*4 byte = 15258 MB 差不多16G), 再试时间复杂度

因为是无序的,所以 不能用B树索引,B+ 树索引 ( 默认数据库中 索引会用, 因为有序,所以支持 上一个,下一个)

网上普遍应该是

1.40亿数据 分片

2.结果放到bit中,然后查找bitset 判断是否存在

其实应该是:

1.散列分治

hash for bitset

  • std::hash

unordered_set

hash

2.看到一些大数据的书之后,了解到 布隆过滤器

布隆过滤器 Bloom filter 是由Howard Bloom在1970年提出的 二进制向量 数据结构,它具有很好的空间和时间效率,尤其是空间效率,BF常常被用来检测某个元素 是否是 巨量数据集合中的 成员。

基本原理: 使用m的位数组(bitset 或者 bit a[])来存储集合信息, 使用k个相互独立的hash函数 将数据映射到位数组空间(hash函数独立,所以可以是 分布式机器 + 多线程 + 多进程 操作)

假设 位数组bit arrayA[m], 函数函数(1~k),40亿不重复的uint 为集合S, S中某成员a(假如值是123)

arrayA 中所有元素 默认置0,对于 a进行hash

40亿hash 之后,

2^32 =42亿左右

所以,用bitset<2^32> 每个bit位 代表每个unsigned int数值,是否存在。

使用hash开放寻址法, 比如 100,2000,5000,80000, 这几个数值的第100位,第2000位,第5000位,第80000位 都是1。


// bitset::operator[]
#include <iostream> // std::cout
#include <bitset> // std::bitset int main ()
{
std::bitset<2^32> foo; foo[100]=1;
foo[2000]=1;
foo[5000]=1;
foo[80000]=1; std::cout << "foo: " << foo << '\n'; return 0;
}

[tt面试题] 一维数组 a[100],里面的值为1~999,里面有2个值一样,

求怎么样 以最快的时间复杂度,和空间复杂度,找到这个值,

后记:添加, 采用 hash(链接方式),

   创建一个 key[999]的数组,把值当做index ,

   a中各个值, 放入到key中,   

    比如a[10] = 88

    那么key[88] =   a[10]的信息,比如10, 这个可以是一个链表,  如果a[10], a[12] 值都是 88,那么用双向链表, 保存 a[10] ,a[12]的信息。

时间复杂度是O(n)

空间复杂度是O(m)//m 是数组中值 的取值范围

参考HASH 的 链接法(chaining)

当让 空间足够的话,可以采用桶排序 时间复杂度是O(1),空间复杂度是O(999)

用上面的BF是 最好的,空间复杂度,时间复杂度, 都是最小。

[面试题] BloomFilter 无序40亿不重复 uint 整数, 给予任意的数,求是否在这40亿之中 + 无序数组中找2个相同的值的更多相关文章

  1. [算法] 举一反三之n重复数组中找唯一m重复异类数

    n重复数组,是指数组中的数字都出现n次: 唯一m重复异类数,是指存在唯一一个没出现n次,只出现了m次的数: 这里我简记它为nX+my问题,求解y,其中m < n,数组中都是整数: 3X+y问题 ...

  2. 剑指offer第二版-3.数组中重复的数

    面试题3:数组中重复的数 题目要求: 在一个长度为n的数组中,所有数字的取值范围都在[0,n-1],但不知道有几个数字重复或重复几次,找出其中任意一个重复的数字. 解法比较: /** * Copyri ...

  3. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  4. 一起来刷《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)

    数组中重复的数字 最近在复习算法和数据结构(基于Python实现),然后看了Python的各种"序列"--比如列表List.元组Tuple和字符串String,后期会写一篇博客介绍 ...

  5. Ex 2_14 去掉数组中所有重复的元素..._第二次作业

    首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素.总的时间复杂度为O(nlogn). (这题应该用分支算法解决)以下为 ...

  6. 【剑指Offer】50、数组中重复的数字

      题目描述:   在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果 ...

  7. 前端与算法 leetcode 26. 删除排序数组中的重复项

    目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数 ...

  8. 偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

    今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2 ...

  9. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

随机推荐

  1. Oracle查看用户所在表空间

    查看当前用户所在表空间 select username,default_tablespace from user_users; 修改用户默认表空间 alter user 用户名 default tab ...

  2. ubuntu系统使用快捷键打开终端方式总结

    ctrl + alt + T 三键齐下打开虚拟终端 ctrl + alt + F1 (~F6)打开系统终端ctrl + alt + F7 返回图形界面都可以使用exit命令关闭, 不同的是虚拟终端ex ...

  3. eclipse html插件的下载和安装

    需求:需要在eclipse里面编辑html和jsp,语法高亮和语法提示,自动补全等. 1.下载GEF(依赖包): http://www.eclipse.org/downloads/download.p ...

  4. iOS本地动态验证码生成-b

    用于ios本地动态生成验证码,效果如下: demo.gif 导入CoreGraphics.framework用于绘制图形 封装UIView,便捷使用,代码如下: AuthcodeView.h #imp ...

  5. JSP内置对象详解

    jsp中内置对象:request.response.session.applecation.out.pagecontesx.config.page.exception.cookie 1.request ...

  6. 像Linq一样来使用Graphics

    Linq的链式编程用起来总是那样畅快淋漓,可惜在C#中并不是每时每刻都能有这么畅快的感觉,其中使用Graphics的时候就是,每次用Graphics绘制大量图形时尤其如此.GDI+的API功能很强大, ...

  7. xx创新论坛返工友情项目总结

    友情项目,顾名思义就不是我做的,只是处于友情帮别人改改别人的代码帮别人找找bug...之所以要强调这一点是因为里面的低级问题太多,实在是不好意思承认自己和这个项目有关系.. 整个过程还是挺辛苦的,毕竟 ...

  8. 解决Cisco VPN Client:Reason 442: Failed to Enable Virtual Adapter VPN连接问题

    大公司里肯定涉及不同地点的办公问题,这样VPN的使用就频繁了,今天遇到一个VPN连接问题,分享给大家,看一眼,以后不在这问题上耗费太多功夫. 在win7上连接vpn时抛出“failed to enab ...

  9. easyBCD安装双系统,简单便捷,亲测好用

    一 准备工作(在WIN7下操作完成) 1   从官网http://www.ubuntu.com/上下载镜像文件,大小接近700M.下载EasyBCD最新版安装之.特别声明:EasyBCD是一款很优秀的 ...

  10. linux复制多个文件到文件夹

    linux复制多个文件到文件夹 cp file1 file2 file3 directory即将文件file1 file2 file3复制到directory