面试题—哈希,位图,布隆,倒排索引

哈希切割top K问题

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

解题思路:

        由于是100G文件,文件太大不能完全加载到内存中去,所以将文件分成1000份,每份大约500M,计算机内存完全可以存下。

        那么如何统计相同IP的次数,这里运用哈希切分,使用散列函数(如BKDRHash)依次将所有文件的IP地址转为整型数据IP_KEY,利用IP_KEY%1000(切分的文件数,这里定为1000)再次切分成1000个文件,余数是几就将IP放入几号文件中去(例如余数是7,就放入7号文件),使得相同IP必定进入到相同的文件中去。

        最后可以建立一个IP为key,出现次数为value的哈希表,依次读入每个文件的IP,最后统计出现次数最多的IP。


如果要找出TOPK个IP,先对第一个文件的数据建立小堆(大小为K),存入出现次数最多的前K个IP,再依次读入每一个文件,将每一个IP的出现次数与堆中IP次数比较,如果大于其中最小次数的IP,则替换堆顶,并更新堆,依次执行下去,直到1000个文件全部读完,即可找出出现次数最多的前K个IP;

位图应用

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

在计算机中整数共有4294967295个整数,存储100亿个整数,需要大约40G内存,而利用位图变形,用2个位表示一个整数数据的存储状态(00表示不存在,01表示出现一次,10表示出现多次),表示所有整数只需要1G内存即可,所以可以开辟1G内存的位图,每两位表示一个整数,将100亿个整数插入位图中后,遍历位图,找出状态为01的数据即可;

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

建立两个位图分别存储两个文件的100亿个整数,位图的每一位表示一个数据的存储状态,再将两个位图按位&,得到的新位图就是两个文件的数据交集;

1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数 

建立一个位图,用两个位表示一个int型数据的存储状态(00表示不存在,01表示出现一次,10表示出现2次,11表示出现2次以上),共需要1G内存,将100亿个数据插入位图中后,遍历位图,找出状态为01和10的所有数据;

布隆过滤器+哈希切分

给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

精确算法:

100亿个query占用内存为40G,可以先将两个文件进行哈希切分,使用散列函数将两个文件的所有query转化为整型key,利用key%100将两个文件转化为两组1000份小文件,每个文件大小平均为40M左右,建立一个哈希表,将第一个文件的数据插入哈希表,用另一个相同编号文件中的每个数据查找是否存在,依次比较,找出交集并记录下来,依次类推,当读完所有文件,就找到了两个文件的交集;

近似算法:

使用布隆过滤器,利用散列函数将字符串转换成整型,将第一组的第一个文件中的数据映射到位图中,一个query映射3个位,再用另一组的相同编号文件去判断一个数据是否存在,三个位都为1时存在交集数据,否则不存在,当读取完所有文件,就可得到两个文件的交集,但可能存在不同数据有重叠映射,所以得出的文件交集并不精确;

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

布隆过滤器一个数据的key对应多个位,删除数据时不能把对应的所有位直接置位为0,可能有别的数据的key映射同样的位。可以加入引用计数,删除引用计数减1,当减到0时就可以置为0;

如何扩展BloomFilter使得它支持计数操作 

将Bloomfilter中的每一位扩展为一个计数器,每次加入数据都要把对应位置加1,每次删除数据把对应位置减1,从而支持计数 操作。计数个数为所有映射到的数据的个数;

将单词用散列函数转化为整型key,对每个文件的所有单词建立闭散列哈希表,将每个文件中的单词及其所对应的文件名和数量插入到哈希表中,再将要每个需要查找的单词在哈希表中查找其对应的文件名即可;

倒排索引

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

将单词用散列函数转化为整型key,对每个文件的所有单词建立闭散列哈希表,将每个文件中的单词及其所对应的文件名和数量插入到哈希表中,再将要每个需要查找的单词在哈希表中查找其对应的文件名即可;



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL的索引是使用B树或哈希表实现的,而不是倒排索引。B树索引是一种平衡树,可以快速定位到索引列的值,然后找到对应的行数据。而哈希索引则是将索引列的值通过哈希函数转换为哈希码,并使用哈希表进行快速查找。倒排索引则是针对文本数据而言的,它记录了每个单词出现的位置,并以此来快速定位到包含该单词的文档。 ### 回答2: MySQL索引不是倒排索引倒排索引是一种在查找时将文档中的词条映射到其所在的位置的索引结构。而MySQL索引则是一种按照特定字段值进行排序和组织的数据结构,用于加快数据库的查询速度。MySQL索引使用了B树(B-Tree)或者B+树(B+Tree)等数据结构来实现。 MySQL索引可以根据需要在表的一个或多个列上创建。创建索引后,数据库引擎会根据索引的排序规则来组织数据,以便快速定位和访问需要查询的数据。通过使用索引,可以大大提高数据库查询的速度,减少了全表扫描的时间消耗。 倒排索引主要用于文本搜索引擎的实现中,例如全文搜索引擎(如Lucene)。通过倒排索引,可以快速定位包含指定关键词的文档,并返回相关的搜索结果。倒排索引按照词条来组织数据,而不是按照文档或记录来组织。 总之,MySQL索引和倒排索引是两种不同的索引结构,用于不同的应用场景。MySQL索引用于加速数据库查询操作,而倒排索引用于实现文本搜索引擎。 ### 回答3: MySQL索引不是倒排索引倒排索引(Inverted Index)是一种用于快速定位关键词的数据结构,常用于搜索引擎中。它将存储记录的值映射到出现该值的记录的位置,通过查询关键词可以快速定位到包含该关键词的记录。 而MySQL索引是一种数据结构,用于提高数据库查询的效率。MySQL使用B树(B-tree)或者哈希索引来实现索引,而不是倒排索引。B树索引将索引的值映射到数据库记录的物理位置,可以进行范围查询和顺序访问。哈希索引通过将索引值计算为哈希函数的结果,并存储在哈希表中,对于等值查询有较高的效率。 MySQL索引的创建可以通过关键字如INDEX或PRIMARY KEY来定义,可以加速数据库的查找和排序操作。它可以提高查询性能,减少数据库的扫描次数和IO操作。索引可以创建在单个列上,也可以创建在多个列上,称为复合索引。索引的选择和设计需要考虑到查询的频率、数据量、数据类型等因素。 总之,MySQL索引和倒排索引不同,但都是用于提高数据查询效率的数据结构。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值