Algorithm 有没有更好的方法来计算文件中所有符号的频率?

Algorithm 有没有更好的方法来计算文件中所有符号的频率?,algorithm,pseudocode,binary-heap,Algorithm,Pseudocode,Binary Heap,好的,假设我有一个文本文件(不一定包含所有可能的符号),我想计算每个符号的频率,在计算频率之后,我需要访问每个符号及其频率,从最频繁到最不频繁。符号不一定是ASCII字符,它们可以是任意字节序列,尽管长度相同 我正在考虑这样做(在伪代码中): 我想知道:有没有更好、更简单的方法来计算和存储文件中每个符号出现的次数 您始终可以使用HashMap作为堆的索引。这样,您将对找到的每个符号执行O(1)中的操作,而不是O(logn),其中n是堆上当前的项数 但是,如果不同符号的数量限定在一个合理的数字范围

好的,假设我有一个文本文件(不一定包含所有可能的符号),我想计算每个符号的频率,在计算频率之后,我需要访问每个符号及其频率,从最频繁到最不频繁。符号不一定是ASCII字符,它们可以是任意字节序列,尽管长度相同

我正在考虑这样做(在伪代码中):


我想知道:有没有更好、更简单的方法来计算和存储文件中每个符号出现的次数

您始终可以使用HashMap作为堆的索引。这样,您将对找到的每个符号执行O(1)中的操作,而不是O(logn),其中n是堆上当前的项数

但是,如果不同符号的数量限定在一个合理的数字范围内(1字节是理想的,2字节应该还可以),您可以只使用该大小的数组,并再次使用O(1),但固定成本要低得多。

如果您正在寻找基于运行时间的“最佳”解决方案,我建议如下:

在读取文件时,您应该按照符号本身的值而不是频率对符号进行排序(或散列)。这样,您就可以在已看到的符号列表中快速找到当前符号,而无需搜索整个列表。您还应该具有能够执行快速插入的初始结构-我建议使用哈希的二叉树

阅读完所有符号后,应根据频率计数切换顺序。我会将所有内容读入一个数组,然后执行就地排序,但有很多相同的方法可以做到这一点


希望这有帮助

似乎您有两种选择,hashmap为您提供O(1)频率检索,但没有有序(最频繁到最不频繁)结果,或O(lg n)插入并使用搜索树/堆进行搜索,但为您提供有序(最频繁到最不频繁)结果。二进制堆不是一种特别好的数据结构,因为在堆中查找任意节点相当昂贵。您最好使用二叉树,或者像其他人指出的那样,使用某种哈希表。
function add_to_heap (symbol)
    freq = heap.find(symbol).frequency
    if (freq.exists? == true)
        freq++
    else
        symbol.freq = 1
        heap.insert(symbol)

MaxBinaryHeap heap
while somefile != EOF
    symbol = read_byte(somefile)
    heap.add_to_heap(symbol)
heap.sort_by_frequency()

while heap.root != empty
    root = heap.extract_root()
    do_stuff(root)