实现一个位图、100亿个整数找出只出现一次的整数、找出现次数不超多2次的数
来源:互联网 发布:java自定义表单设计器 编辑:程序博客网 时间:2024/06/07 09:31
1.–实现一个位图。
位图特点:
节省空间 适合数据比较密集的情况 适合判断事件 是否 这样的问题
相关位运操作: & | ~
代码实现:
#include<iostream>#include<vector>using namespace std;////1.【基础题】--实现一个位图。//位图特点: 节省空间,适合数据密集的情况class BitSet{public: BitSet() :_size(0) { } BitSet(size_t size) { _size = (size >> 5) + 1; _array.resize(_size); } bool Set(int num) { //定位到位置 进行置1 //比特位操作 //位运算: & | //找到对应字节,将其对应比特位进行位运算 int index = num >> 5; if (index >= _size) { return false; } int bit = num % 32; //该位置进行置1 , _array[index] =_array[index] |(1<<(31-bit)); return true; } bool ReSet(int num) { //找到对应字节,将其对应比特位进行位运算 int index = num >> 5; if (index >= _size) { return false; } int bit = num % 32; //该位置进行置0,其他位保持不变 _array[index] = _array[index] &(~(1 << (31 - bit))); return true; } bool Test(int num) { int index = num >> 5; int bit = num % 32; if (_array[index] & (1 << (31 - bit))) { return true; } else { return false; } }private: vector<int > _array; size_t _size;};
2.以下三个问题都是位图相关类似题目
1)给定100亿个整数,设计算法找到只出现一次的整数
2)给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
3)1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
大家也可以尽可能多的发散考虑其他可行的思路
1)给一个超过100G大小的log file,log中存着IP地址,设计算法找到出现次数最多的IP地址?(与如何知道top K的IP,如何使用Linux系统命令实现)
Hash分桶法:
将100G文件分成1000份,将每个IP地址映射到相应文件中:file_id = hash(ip) % 1000
在每个文件中分别求出最高频的IP,再合并Hash分桶法;
使用Hash分桶法把数据分发到不同的文件;
各个文件分别统计top K;
2)给定100亿个整数,设计算法找到只出现一次的整数。
Hash分桶法,将100亿个整数映射到不同的区间,在每个区间中分别找只出现一次的整数。
3)给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
扫描每个整数是否出现过,节省内存方法使用bitmap。桶分 + bitmap。如果整数是32bit,直接使用bitmap的方法实现。所有整数共2^32种可能,每个数用两位表 示,00表示文件均没出现,10表示文件1出现过,01表示文件2出现过,11表示两文件均出现过,共需要2^32*2/8 = 1GB内存,遍历两个文件中的所有整数,然后寻 找bitmap中11对应的整数即是两个文件的交集,这样即可线性时间复杂度完成。
4)1个文件有100亿个int,1G内存,设计算法找大出现次数超过2次的所有整数。
Bitmap扩展:用2个bit表示状态,0表示未出现,1出现过1次,2出现过2次或以上。
5)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法?
精确算法:Hash分桶法
将两个文件中的query hash到N个小文件中,并标明query的来源;
在各个小文件中找到重合的query
将找到的重合query汇总
近似算法:BloomFilter算法
6)如何扩展BloomFilter使得它支持删除元素的操作
将BloomFilter中的每一位扩展为一个计数器,记录有多少个hash函数映射到这一位;删除的时候,只有当引用计数变为0时,才真正将该位置为0。
7)如何扩展BloomFilter使得它支持计数操作?
将BloomFilter中的每一位扩展为一个计数器,每个输入元素都要把对应位置加1,从而支持计数操作。计数个数为所有映射到的位置计数的最小值。
8)给上千个文件,每个文件大小为1K-100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存。
0: 用一个文件info 准备用来保存n个词和包含其的文件信息。
1 : 首先把n个词分成x份。对每一份用生成一个布隆过滤器(因为对n个词只生成一个布隆过滤器,内存可能不够用)。把生成的所有布隆过滤器存入外存的一个文件Filter中。
2:将内存分为两块缓冲区,一块用于每次读入一个布隆过滤器,一个用于读文件(读文件这个缓冲区使用相当于有界生产者消费者问题模型来实现同步),大文件可以分为更小的文件,但需要存储大文件的标示信息(如这个小文件是哪个大文件的)。
3:对读入的每一个单词用内存中的布隆过滤器来判断是否包含这个值,如果不包含,从Filter文件中读取下一个布隆过滤器到内存,直到包含或遍历完所有布隆过滤器。如果包含,更新info 文件。直到处理完所有数据。删除Filter文件。
备注:
1:关于布隆过滤器:其实就是一张用来存储字符串hash值的BitMap.
2:可能还有一些细节问题,如重复的字符串导致的重复计算等要考虑一下。
9)一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词。
给输入字符串,利用字母建立倒排索引,索引中存储该字母出现在哪个单词以及在单词中位置;查询时,利用倒排找到所有单词,并求交集并且位置要连续。
9)有一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词。
答:
对于这道题目,我们要用到一种特殊的数据结构—-字典树来解决它,所谓字典树,又称单词查找树(或Trie树),是一种哈希树的变种。
典型应用:用于统计、排序和保存大量的字符串,经 常被搜索引擎系统用于文本词频统计。
优点:利用字符串的公共前缀来减少查询时间,最大 限度地减少无谓的字符串比较,查询效率高于哈希表 。
基本性质:根节点不包含字符,除根节点外每个节点 都只包含一个字符;
从根节点到某一节点,路径上所有经过的字符连接起来,为该节点对应的字符串;
每个节点的所有子节点包含的字符都不相同 。
应用:串的快速检索、串排序、最长公共前缀
参考于:http://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6042571.html
- 实现一个位图、100亿个整数找出只出现一次的整数、找出现次数不超多2次的数
- 整数数组中找出只出现了一次的数
- 只用2GB的内存找出20亿个整数中找到出现次数最多的数
- 大数据:随机生成10万个整数找出出现次数前一百的数
- 数组中,一个数出现一次,其余的数都出现2次,找出那个出现一次的数
- 一个整数型数组里除了俩个数字之外,其他的数字都出现俩次,求找出这俩个只出现一次的数字
- 一个数组存放了2n+1个整数,其中有n个数出现了2次,1个数出现了1次,找出出现1次的数是多少?
- 100亿个32位整数中放到一个文件中,找出任一个重复出现的数
- 找出只出现一次的数,其他数都出现了k次
- 找出一个数组中只出现一次的数
- 找出一个数组中只出现一次的两个数
- 求只出现一次的两个整数
- 找出只出现一次的两个数
- 找出两个只出现一次的数
- 找出数组中2个只出现1次的数,其他数都出现2次
- 找出数组中2个只出现1次的数,其他数都出现2次
- 只用2GB内存在20亿个整数中找到出现次数最多的数
- 只用2GB内存在20亿个整数中找到出现次数最多的数
- 【HDU】1285--确定比赛名次(拓扑&&优先队列)
- UVALive-5013 Similarity(二分图最大权匹配)
- 文件拷贝
- Unix 操作(一)
- IPTables工具及其与netfilter关系介绍
- 实现一个位图、100亿个整数找出只出现一次的整数、找出现次数不超多2次的数
- HQL查询条件
- H5面试题---HTTP状态码知道哪些
- 80. Remove Duplicates from Sorted Array II
- FreeCodeCamp备查簿(1:#6-#30)
- WebGL之旅(二十) 帧缓冲区对象FBO
- Burp Suite详细基本用法(一):Proxy、Target模块
- python中的面向对象
- Android启动模式