【发布时间】:2012-08-27 01:26:25
【问题描述】:
我正在寻找最有效的(时间和空间)算法来计算给定字符串的字符频率。
想到的最简单的算法是有一个你想要搜索的标志数组(大小 = 不同字符的数量)并增加相应索引的计数器。这在线性时间内有效。唯一的问题是 flag-array 的空间要求,如果需要所有 ASCII 字符,它可以达到 256 个。
有没有更好的算法,可以节省空间/时间?
【问题讨论】:
-
如果您要计算字符串中
m不同字符的出现次数,您如何期望内存少于m? -
一个给定的字符串可能不包含所有 256 个 ASCII 字符,在这种情况下,可能有一种算法可以只存储“找到”字符的频率......而且,我不仅寻求空间改进,也欢迎任何有时间改进的替代建议
-
您可以构建一个动态数据结构,只存储找到的字符的频率。它必须有效地搜索找到的字符的频率,以便您可以快速增加它们。您可以使用哈希表或二叉搜索树。但是,除非您有超过 256 个可能的字符,否则它可能对您没有帮助,并且实际上可能会损害效率。除非您是从 60 年代开始编写的,否则 256 个整数的数组实际上可以忽略不计。
-
只有 128 个 ASCII 字符。
标签: algorithm space-efficiency