首页>> 正文

大数据面试题解决思路

来源:商群邮件营销时间:2016-11-10 09:33:52点击:1450

1)给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?!

解决方法

将100G分成100份,将每个ip映射到相应文件中 ip_if=ip%100

找出每个文件中的出现次数最多的一个ip

再将100份里找出来的最多的一个放入一个哈希表中进行比较找出最大值

2)与上题条件相同,如何找到top K的IP?如何直接⽤用Linux系统命令实现?

解决方法

将100G分成100份,将每个ip映射到相应文件中 ip_if=ip%100

找出每个文件中的出现次数最多的k个ip

再将100份里找出来的最多的k个放入一个哈希表中进行比较找出最大的k 个

3)给定100亿个整数,设计算法找到只出现一次的整数!

将100亿个数分拆成1000份文件,再将每份文件里使用位图,并用两位bit表示数字出现的次数,00存出现0次的数,01存放出现1次的数,10存放出现多次的数,11舍弃,再将1000份中出现一次的数全部合并到一个文件里存放即可

4)给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集!

将第一个文件里的数用哈希映射到1000个文件中,将第二个文件用同样的哈希映射到另1000个文件中,然后比较每个哈希映射相同的文件即可
5)1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数!

将100亿个数分拆成1000份文件,再将每份文件里使用位图,并用两位bit表示数字出现的次数,00存出现0次的数,01存放出现1次的数,10存放出现2次的数,11舍弃,再将1000份中出现次数不超过二的数全部合并到一个文件里存放即可
6)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?
算法和近似算法!

精确算法:

将两个文件分别存入相同哈希算法的1000个哈希桶(共两千个)文件,再在每个文件找出相同的query

近似算法:

利用布隆过滤器进行比较

7)如何扩展BloomFilter使得它支持删除元素的操作?!

将bloomfilter中每一位扩展成一个技术为,例如00表示无,01表示1,当没删除一个,计数器减1,直到减为0为止
8)如何扩展BloomFilter使得它支持计数操作?!

同上题思路
9)给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存!

对上千个文件生成1000个布隆过滤器,并将1000个布隆过滤器存入一个文件中,将内存分为两份,一分用来读取布隆过滤器中的词,一块用来读取文件,知道将每个布隆过滤器读完为止
10)有一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词!

?暂时不会

位图

<span style="font-size:18px;">#pragma  once
#include<vector>
#include<iostream>
using namespace std;
class BitMap
{
public:
	BitMap(size_t range)
	{
		_bitMap.resize((range>>5) +1);
	}
	void Set(size_t x)
	{
		size_t index=x>>5;
        size_t num =x%32;
		
		//_bitMap[index]|=tmp;
		_bitMap[index]=(1<<num);
	}
	void Reset(size_t x)
	{
		size_t index=x>>5;
		size_t num =x%32;
		size_t tmp=0;
		tmp<<=num;
		_bitMap[index] &=(~(tmp));
	}
	bool Test(size_t x)
	{
		size_t index=x>>5;
		size_t num =x%32;
		size_t tmp=1;
		tmp<<=num;
		_bitMap[index] &=tmp;
		return _bitMap[index];
	}
	~BitMap()
	{}
protected:
	vector<size_t> _bitMap;
};</span>

布隆过滤器

<span style="font-size:18px;">#pragma  once
#include <iostream>
#include <string>
#include <vector>
#include "BitMap.h"
using namespace std;
struct  __HashFunc1
{
	size_t BKDRHash(const char *str)  
	{  
		register size_t hash = 0;  
		while (size_t ch = (size_t)*str++)  
		{         
			hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..           
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return BKDRHash(str.c_str());
	}
};
struct  __HashFunc2
{
	size_t SDBMHash(const char *str)  
	{  
		register size_t hash = 0;  
		while (size_t ch = (size_t)*str++)  
		{  
			hash = 65599 * hash + ch;         
			//hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return SDBMHash(str.c_str());
	}
};
struct  __HashFunc3
{
	size_t RSHash(const char *str)  
	{  
		register size_t hash = 0;  
		size_t magic = 63689;     
		while (size_t ch = (size_t)*str++)  
		{  
			hash = hash * magic + ch;  
			magic *= 378551;  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return RSHash(str.c_str());
	}
};
struct  __HashFunc4
{
	size_t APHash(const char *str)  
	{  
		register size_t hash = 0;  
		size_t ch;  
		for (long i = 0; ch = (size_t)*str++; i++)  
		{  
			if ((i & 1) == 0)  
			{  
				hash ^= ((hash << 7) ^ ch ^ (hash >> 3));  
			}  
			else  
			{  
				hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));  
			}  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return APHash(str.c_str());
	}
};
struct  __HashFunc5
{
	size_t JSHash(const char *str)  
	{  
		if(!*str)        
			return 0;  
		register size_t hash = 1315423911;  
		while (size_t ch = (size_t)*str++)  
		{  
			hash ^= ((hash << 5) + ch + (hash >> 2));  
		}  
		return hash;  
	}  
	size_t operator()(const string& str)
	{
		return JSHash(str.c_str());
	}
};
template<class K=string
,class HashFunc1=__HashFunc1
,class HashFunc2=__HashFunc2
,class HashFunc3=__HashFunc3
,class HashFunc4=__HashFunc4
,class HashFunc5=__HashFunc5>
class RefBloomFilter
{
public:
	RefBloomFilter(size_t num)
		:_range(num*5)
		,_bitMap(num*5)
	{}
	void Set(const K& key)
	{
		size_t index1=HashFunc1()(key)%_range;
		size_t index2=HashFunc2()(key)%_range;
		size_t index3=HashFunc3()(key)%_range;
		size_t index4=HashFunc4()(key)%_range;
		size_t index5=HashFunc5()(key)%_range;
		_bitMap.Set(index1);
		_bitMap.Set(index2);
		_bitMap.Set(index3); 
		_bitMap.Set(index4);
		_bitMap.Set(index5);  
		cout<<index1<<endl;
		cout<<index2<<endl;
		cout<<index3<<endl;
		cout<<index4<<endl;
		cout<<index5<<endl<<endl;

		
	}
	bool Reset(const K& key)
	{
		size_t index1=HashFunc1()(key)%_range;
		size_t index2=HashFunc2()(key)%_range;
		size_t index3=HashFunc3()(key)%_range;
		size_t index4=HashFunc4()(key)%_range;
		size_t index5=HashFunc5()(key)%_range;
		if(_bitMap[index1]==0
			||_bitMap[index2]==0
			||_bitMap[index3]==0
			||_bitMap[index4]==0
			||_bitMap[index5]==0)
			return false;
		_bitMap.Reset(index1);
		_bitMap.Reset(index2);
		_bitMap.Reset(index3);
		_bitMap.Reset(index4);
		_bitMap.Reset(index5);
		cout<<index1<<endl;
		cout<<index2<<endl;
		cout<<index3<<endl;
		cout<<index4<<endl;
		cout<<index5<<endl<<endl;
		return true;
	}
	bool Test(const K& key)
	{
		size_t index1=HashFunc1()(key)%_range;
		size_t index2=HashFunc2()(key)%_range;
		size_t index3=HashFunc3()(key)%_range;
		size_t index4=HashFunc4()(key)%_range;
		size_t index5=HashFunc5()(key)%_range;
		if(_bitMap.Test(index1)!=0
			&&_bitMap.Test(index2)!=0
			&&_bitMap.Test(index3)!=0
			&&_bitMap.Test(index4)!=0
			&&_bitMap.Test(index5)!=0)
		{
			cout<<index1<<endl;
		cout<<index2<<endl;
		cout<<index3<<endl;
		cout<<index4<<endl;
		cout<<index5<<endl<<endl;
			return true;
		
		}
		cout<<index1<<endl;
		cout<<index2<<endl;
		cout<<index3<<endl;
		cout<<index4<<endl;
		cout<<index5<<endl<<endl;
		return false;
	}
protected:
	BitMap _bitMap;
	size_t _range;
};
void test()
{
	RefBloomFilter<> bf(1);
	char* str1="http://blog.csdn.net/shangguan_1234";
	char* str2="http://blog.csdn.net/shangguan_1235";
	char* str3="http://blog.csdn.net/shangguan_1233";
	char* str4="http://blog.csdn.net/shangguan_1232";
	char* str5="http://blog.csdn.net/shangguan_1231";
	bf.Set(str1);
	bf.Set(str2);
	bf.Set(str3);
    bf.Set(str4);
	bf.Set(str5);
	cout<<bf.Test(str1)<<endl;
	cout<<bf.Test(str2)<<endl;
	cout<<bf.Test(str3)<<endl;
	cout<<bf.Test(str4)<<endl;
	cout<<bf.Test(str5)<<endl;
}</span>

欢迎大家继续关注慧邮件邮件营销平台,也可以在我们的慧邮件官网了解更多邮件营销技巧,大数据知识,也可以通过电话:400-666-5494联系到我们,更多精彩知识、活动等着你。

相关阅读

  • *真实姓名:
  • *手机号码:
  • 公司名称:
  • 咨询内容:

CopyRight © 2009 - 2020 All Right Reserved 备案号:闽ICP备15004550号-275

厦门书生企友通科技有限公司 QYT.com 版权所有