我目前正在准备面试,它使我想起了上次面试中曾经被问到过的一个问题:
“已经要求您设计一些软件,以连续显示Google上排名前10位的搜索词。您可以访问Feed,该Feed提供了当前在Google上搜索的无穷实时搜索词源。请描述哪种算法和数据结构您将用来实现此目的。您将设计两个变体:
(i)显示所有时间(即自您开始阅读提要以来)的前10个搜索词。
(ii)仅显示过去一个月的前10个搜索字词,每小时更新一次。
您可以使用一个近似值来获得前十名的列表,但您必须证明自己的选择是正确的 。
第一部分要求在无限列表的不断增长的子序列中提供10个最频繁的项。我研究了选择算法,但找不到任何在线版本来解决此问题。
第二部分使用有限列表,但是由于要处理大量数据,您无法真正将整个月的搜索字词存储在内存中,也无法每小时计算一次直方图。
前十名列表不断更新的事实使问题变得更加棘手,因此您需要以某种方式在滑动窗口上计算前十名。
有任何想法吗?
好吧,看起来数据量很大,存储所有频率的成本也许很高。 当数据量太大 以至于我们无法希望将其全部存储时,我们进入 数据流算法领域 。
该领域的有用书籍: Muthukrishnan-“数据流:算法和应用程序”
我从上文中选择的与该问题密切相关的参考文献: Mokuani,Manku-“数据流上的近似频率计数” [pdf]
顺便说一下,斯坦福大学的Motwani(编辑)是一本非常重要的“随机化算法”书的作者。 本书的第11章处理这个问题 。 编辑: 对不起,不好的参考,该特定的章节是在另一个问题上。经过检查后,我建议使用 Muthukrishnan的 书中的5.1.2节 __(可在线获取)。
嘿,不错的面试问题。