数据结构_海量数据面试题

面试题

1.哈希切割top K问题
给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?

2.位图应用
给定100亿个整数,设计算法找到只出现一次的整数
给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

3.布隆过滤器+哈希切分
给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法
如何扩展BloomFilter使得它支持删除元素的操作
如何扩展BloomFilter使得它支持计数操作

4.倒排索引
给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存

解题思路
1.给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
1)首先可以把100G的文件划分成1000个文件,但不是简单的截取,需要让所有相同的ip都保在同一个文件
001
让key%1000,相同的Ip得到的数相同,就能保证ip相同的在同一个文件。分1000个是因为这种划分方式不是等量划分,文件有大有小,分多一点避免文件还是过大。
2)建立一个小堆,能保存K个数据,这样就能找出TOP-K个数据。
3)从第一个小文件开始,用哈希算法统计每个ip出现的次数,再遍历哈希数组,依次入小堆,这样第一个小文件里出现次数最多的前K个ip就进入了小堆。
4)同样的方法统计后面所有的文件,这样小堆里保存的就是TOP-K个IP。
2.给定100亿个整数,设计算法找到只出现一次的整数
位图只能看有没有,看不了有多少,但是变形一下,从一个比特位表示一个数据换成两个比特位表示,这样就有了计数的功能。
002
但是所需要的空间翻了一倍
3.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集个
1)建一个位图记录第一个文件,然后遍历第2个文件依次比较。
2)或者给两个文件分别建立两个位图,然后比较两个位图的交集

void BitMapHave(BitMap* bm1, BitMap* bm2)
{
    assert(bm1);
    assert(bm2);

    size_t i = 0;
    for (i = 0; i < bm1->_range; i++)
    {
        size_t tmp = bm1->_bits[i] & bm1->_bits[i];
        if ( tmp != 0)
        {
            for (size_t j = 0; j < 36; j++)
            {
                if ((tmp&(1 << j)) != 0)
                {
                    printf("%d ", i * 32 + j);
                }
            }
            printf("\n");
        }
    }
}

4.给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法
如何扩展BloomFilter使得它支持删除元素的操作
如何扩展BloomFilter使得它支持计数操作
1)估算 假设一个query的大小为10byte,100亿就是100G,同题1,我们可以使用哈希切分
2)两个文件分别分成1000个文件,相同的都在对应文件
003
这样A和B相同的query被分到相同对应编号的小文件,只需要A1和B1比较,A2和B2比较….就可以得出结果
3)精确计算需要使用完整的哈希结构,用数组保存A1和B1,再比较两者得交集,后面也是一样的。
近似算法可以使用布隆过滤器,保存在位图中,可以大大的节约空间。
4)使布隆筛选可以支持删除和技术操作,可以使用1个整型空间统计一个数据出现的次数,建立整型数组使用布隆筛选保存数据
5.给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存
1)建立一个结构体指针数组,用闭散列哈希的方式映射这n个词。
2)依次对比每个文件的词和哈希表的是否相同,相同一次就把该文件名挂在表中对应词的位置,再次相同就给value(计算文件中出现该词的次数)+1。
3)004

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值