【问题标题】:character frequency calculation in string字符串中的字符频率计算
【发布时间】:2012-08-27 01:26:25
【问题描述】:

我正在寻找最有效的(时间和空间)算法来计算给定字符串的字符频率。

想到的最简单的算法是有一个你想要搜索的标志数组(大小 = 不同字符的数量)并增加相应索引的计数器。这在线性时间内有效。唯一的问题是 flag-array 的空间要求,如果需要所有 ASCII 字符,它可以达到 256 个。

有没有更好的算法,可以节省空间/时间?

【问题讨论】:

  • 如果您要计算字符串中 m 不同字符的出现次数,您如何期望内存少于 m
  • 一个给定的字符串可能不包含所有 256 个 ASCII 字符,在这种情况下,可能有一种算法可以只存储“找到”字符的频率......而且,我不仅寻求空间改进,也欢迎任何有时间改进的替代建议
  • 您可以构建一个动态数据结构,只存储找到的字符的频率。它必须有效地搜索找到的字符的频率,以便您可以快速增加它们。您可以使用哈希表或二叉搜索树。但是,除非您有超过 256 个可能的字符,否则它可能对您没有帮助,并且实际上可能会损害效率。除非您是从 60 年代开始编写的,否则 256 个整数的数组实际上可以忽略不计。
  • 只有 128 个 ASCII 字符。

标签: algorithm space-efficiency


【解决方案1】:

如果您使用hash table 来存储计数器,您需要的空间与字符串中不同字符的数量成正比,并且您仍然可以在线性时间内运行计算。很容易看出,您无法比线性时间更好,因为您需要至少查看每个字符一次。

然而,在实践中,如果你的字符串真的只使用一个字节来存储一个字符(即它不是 Unicode)你的“标志数组”将只有大约 1 kb,因此可能是最好的选择,因为它没有具有哈希表的(常数因子)时间和空间开销。

【讨论】:

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