Algorithm 字符串中的字符频率计算

Algorithm 字符串中的字符频率计算,algorithm,space-efficiency,Algorithm,Space Efficiency,我正在寻找最有效的(时间和空间)算法来计算给定字符串的字符频率 想到的最简单的算法是有一个标志数组(大小=不同字符的数量),用于搜索并递增相应索引的计数器。这在线性时间内有效。唯一的问题是标志数组的空间要求,如果需要所有ASCII字符,则可能会达到256 是否有更好的算法可以节省空间/时间?如果使用a存储计数器,则需要与字符串中不同字符数成比例的空间,并且仍然可以在线性时间内运行计算。很容易看出,您无法获得比线性时间更好的效果,因为您需要至少查看每个角色一次 然而,实际上,如果您的字符串实际上只

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

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

是否有更好的算法可以节省空间/时间?

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


然而,实际上,如果您的字符串实际上只使用一个字节来存储字符(即,它不是Unicode),那么您的“标志数组”将只有大约1KB,因此可能是最好的解决方案,因为它没有哈希表的(常数因子)时间和空间开销

如果您正在计算字符串中不同字符的出现次数,那么如何期望内存少于
m
呢?给定的字符串可能没有全部256个ASCII字符,在这种情况下,可能有一种算法可以只存储“找到的”字符的频率。。。另外,我不仅仅是在寻找空间上的改进,任何关于时间改进的替代建议也是很好的。你可以建立一个动态的数据结构,只存储找到的字符的频率。它必须能够有效地搜索找到的字符的频率,以便您可以快速增加它们。您可以使用哈希表或二进制搜索树。然而,除非你有超过256个可能的字符,否则这可能对你没有帮助,而且可能会影响效率。256个整数的数组实际上可以忽略不计,除非您是从60年代开始写入的。只有128个ASCII字符。