【发布时间】:2011-03-16 16:42:18
【问题描述】:
我目前正在准备面试,这让我想起了我在之前的一次面试中曾经被问到的一个问题:
“您被要求设计一些软件来连续显示 Google 上的前 10 个搜索词。您可以访问一个提要,该提要提供当前在 Google 上搜索的无限实时搜索词流。描述什么算法和数据结构,你将使用它来实现这一点。你要设计两种变体:
(i) 显示有史以来排名前 10 的搜索词(即自您开始阅读提要以来)。
(ii) 仅显示过去一个月的前 10 个搜索词,每小时更新一次。
您可以使用近似值来获得前 10 名列表,但您必须证明您的选择是正确的。”
我在这次采访中被轰炸了,但仍然不知道如何实施。
第一部分要求在无限列表的不断增长的子序列中最频繁出现的 10 个项目。我研究了选择算法,但找不到任何在线版本来解决这个问题。
第二部分使用了一个有限列表,但是由于要处理的数据量很大,你不能真正将整个月的搜索词存储在内存中并每小时计算一个直方图。
由于前 10 名列表不断更新,因此问题变得更加困难,因此您需要通过滑动窗口计算前 10 名。
有什么想法吗?
【问题讨论】:
-
@BlueRaja - 这不是一个愚蠢的面试问题,这对 OP 来说是一个糟糕的解释。它不是要求无限列表中最频繁的项目,而是要求无限列表的有限子序列中最频繁的项目。继续你的类比,
what is the most frequent item in the subsequence [2; 2; 3; 3; 3; 4; 4; 4; 4; 5; 5] of your sequence? -
@BlueRaja - 这当然是一个难题,但我不明白为什么它很愚蠢 - 它似乎代表了拥有大量数据集的公司所面临的一个相当典型的问题。 @IVlad - 根据你的建议修复它,我的措辞不好!