注:面试过程中整理的学习资料,如有侵权联系我即刻删除。
目录
上亿万数量级的海量查询,比如十亿订单中,找出前一百个销量最好的产品
对于一个海量的文件中存储着不同的URL,用最小的时间复杂度去除重复的URL
给定a、b两个文件,各存放50亿个ur,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
用#define声明一个常数,表明1年中有多少秒(忽略闰年问题)?
不用if,switch,三目运算符来输出较大的数或者较小的数?
结构体中末尾定义一个char data[0];或者int data[0]
上亿万数量级的海量查询,比如十亿订单中,找出前一百个销量最好的产品
首先,利用哈希算法,将订单分为1000组(相同产品的订单要分入一个组)。
其次,用哈希map统计每个组里产品出现的频率(也就是销量),
堆排序构造出一个100个元素的小顶堆,存入文件,这样就有1000个文件存放小顶堆。
最后再将这1000个文件归并排序,找出频率最高的前一百个。
对于一个海量的文件中存储着不同的URL,用最小的时间复杂度去除重复的URL
将海量数据分组,比如分为1000个组,那就是hash(url)%1000,来分组,相同的url一定进了相同的组,然后用hash_map来统计频度,重复出现的就删除掉。
给定a、b两个文件,各存放50亿个ur,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
可以估计每个文件的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。
- 遍历文件a,对每个url算出对应的哈希值,再求取,然后根据所取得的值将url分别存储到1000个小文件中。这样每个小文件的大约为300M。
- 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为)。这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
- 顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。
- 找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(,此处有误,更正为b0,b1,b2,b9)。
对这10个文件进行归并排序(内排序与外排序相结合)。
对于海量数据,用什么数据结构存储用户搜索的高频关键词比较合适?比如,当用户输入“黄”字,输入框要自动显 示“黄晓明”,“黄蓉”,“黄山”,“黄鹤楼”等提示,但是能存储的量很有限,所以需要选择恰当的数据结构。
这个需要进行存储,应该用字典树或者是状态机。
哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数。< 如果两个数的和比接下来两个数都大,那就要并列生长 >