【问题标题】:Collections: How will you find the top 10 longest strings in a list of a billion strings?集合:你将如何在十亿个字符串的列表中找到前 10 个最长的字符串?
【发布时间】:2017-01-17 01:42:27
【问题描述】:

我最近在一次采访中被问到一个问题。您将如何在十亿个字符串的列表中找到前 10 个最长的字符串? 我的回答是我们需要编写一个比较器来比较 2 个字符串的长度,然后使用 TreeSet(Comparator) 构造函数。 一旦您开始在 Treeset 中添加字符串,它将按照定义的比较器的排序顺序进行排序。 然后只需弹出 Treeset 的前 10 个元素。

面试官对此并不满意。争论是,要保存十亿个字符串,我必须使用超级计算机。

有没有其他数据结构可以处理这种数据?

【问题讨论】:

  • 阅读此数据结构trie
  • 面试官想了解优先级队列(最小堆存储十个最长字符串)。

标签: string data-structures collections comparator treeset


【解决方案1】:

大多数语言都有一个非常快速的内置排序。

stringList.sort(key=len) 

在 python 中可以工作。然后只抓取前 10 个元素。

你的面试官也确实落后于时代。现在每天 10 亿个字符串非常小

【讨论】:

    【解决方案2】:

    鉴于你所说的面试官说你需要一台超级计算机,我将假设字符串会一次一个地以流的形式出现。

    由于不知道单个字符串有多大(它们可能是整本书),因此体积巨大,我会从流中一次阅读它们。然后,我会将当前字符串与在它之前找到的前十个最长字符串的有序列表进行比较,并将其相应地放置在有序列表中。然后我会从列表中删除最小长度的一个并继续读取下一个字符串。这意味着一次只存储 11 个字符串,当前前 10 个字符串和当前正在处理的字符串。

    【讨论】:

      【解决方案3】:

      我记得研究过类似的数据结构,称为Trie

      tree 中的height 将始终给出最长的字符串。

      一种特殊的 trie,称为 suffix tree,可用于索引文本中的所有后缀,以便进行快速的全文搜索。

      【讨论】:

        【解决方案4】:

        关键是您不需要存储所有字符串。

        让我们考虑一个简化的版本:找到最长的 2 个字符串(假设没有 tie case)

        您始终可以使用 2 个变量 s1s2 进行在线算法,其中 s1 是您目前遇到的最长字符串,s2 是第二长的

        然后你用O(N)逐个读取字符串,可以的话替换s1或者s2。这个用O(2N)=O(N)

        对于前 10 个字符串,它与前 2 个情况一样愚蠢。您仍然可以在 O(10N) = O(N) 中执行此操作,并且只存储 10 个字符串。

        有一种更快的方法描述如下,但对于给定的常数,如 2 或 10,您可能不需要它。


        对于top-K字符串,一般来说,可以使用C++中set这样的结构(越长优先级越高)来存储top-K字符串,当有新字符串出现时,只需插入它,然后删除最后一个,都使用O(lg K)。所以总的来说,你可以在 O(N lg K)O(K) 空间中做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-14
          • 2020-03-13
          • 1970-01-01
          • 2023-01-20
          • 1970-01-01
          • 2021-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多