【问题标题】:Appropriate data structure for counting frequency of string计算字符串频率的适当数据结构
【发布时间】:2022-11-08 08:02:58
【问题描述】:

我的任务是计算文本文件中字符串(单词)的频率。您认为哪种数据结构合适(基于实现难度、内存使用和算法的时间复杂度)?我有哈希表、二叉搜索树和堆,但我不知道该选择哪一个?此外,如果有比我提到的更好的数据结构,那也很棒。提前致谢。 注:文本文件可能非常大。

【问题讨论】:

  • 你计算文本文件中每个单词的频率,还是只计算一个小子集?你想优化什么?
  • “注意,文本文件可能非常大。”我最大的字典单词列表文本文件只有 4Mb 左右。除非输入文本文件包含随机乱码,否则您将从任何大小的输入中获得的全部内容。您不需要内存中的整个输入文件。
  • “文本文件可能非常大”是否意味着大于可用内存?
  • 如果您要计算文本文件中每个单词的频率,那么字典将是最佳选择,因为当您更新计数时,它的搜索复杂度为 O(1)。
  • 如果您需要对 3 条不同的评论重复相同的信息,则应编辑问题以添加该信息。

标签: c algorithm data-structures


【解决方案1】:

因为您说文件可能非常大,所以我认为您不能同时将所有单词都保存在内存中。

请注意,如果文件对所有单词进行了排序,则查找频率只需要一次在内存中保留计数器和最后两个单词来比较它们。只要读取与以前相同的字,就增加计数器。当您击中不同的单词时,将前一个单词及其计数保存到另一个带有频率的文件中,然后开始为新单词计数。

所以问题是如何对文件中的单词进行排序。为此,您可以使用归并排序。请注意,在合并子数组时,只需要在内存中保留两个字,每个子数组一个。此外,您将需要创建一个额外的文件,例如内存合并排序中的额外数组,并使用文件中的位置。如果您在递归调用中交替写入原始文件和额外文件,这两个就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2017-04-19
    • 1970-01-01
    • 2016-08-21
    • 2023-03-25
    相关资源
    最近更新 更多