大数据处理 面试题小结

自己从各个网上书上总结的。
以下来自数据结构与算法之美:

  1. 假设我们有 10 万条 URL 访问日志,如何按照访问次数给 URL 排序?
    遍历 10 万条数据,以 URL 为 key,访问次数为 value,存入散列表,同时记录下访问次数的最大值 K,时间复杂度 O(N)。
    注意:key是URL, hash(key)的结果是value在hash数组中存放位置的下标,但可能有冲突,那就跟据probe或链表法找下一个合适的位置。找到hash(key),并解决冲突问题后,把value放在这个位置。
    如果 K 不是很大,可以使用桶排序,时间复杂度 O(N)。如果 K 非常大(比如大于 10 万),就使用快速排序,复杂度 O(NlogN)。
  2. 有两个字符串数组,每个数组大约有 10 万条字符串,如何快速找出两个数组中相同的字符串?
    以第一个字符串数组构建散列表,key 为字符串,value 为出现次数。再遍历第二个字符串数组,以字符串为 key 在散列表中查找,如果 value 大于零,说明存在相同字符串。时间复杂度 O(N)。
  3. 假设猎聘网有10万名猎头,每个猎头都可以通过做任务(比如发布职位)来积累积分,然后通过积分来下载简历。假设你是猎聘网的一名工程师,如何在内存中存储这10万个猎头ID和积分信息,让它能够支持这样几个操作:
  1. 根据猎头的ID快速查找、删除、更新这个猎头的积分信息;
  2. 查找积分在某个区间的猎头ID列表;
  3. 查找按照积分从小到大排名在第x位到第y位之间的猎头ID列表。

1)=> ID 在散列表中所以可以 O(1) 查找到这个猎头;
2)=> 积分以跳表存储,跳表支持区间查询;
3)=> TBD。是不是要用到heap? segment tree或bit indexed tree?

你可能感兴趣的:(数据结构,算法)