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

标签 algorithm pseudocode binary-heap

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

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

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)

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

最佳答案

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

但是,如果不同符号的数量受到合理数量的限制(1 字节是理想的,2 字节应该仍然可以),您可以只使用该大小的数组并再次具有 O(1),但具有显着降低固定成本。

关于algorithm - 有没有更好的方法来计算文件中所有符号的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7652798/

相关文章:

algorithm - 该伪代码的渐近复杂度是多少?

image - 伪代码:如何从位和字节解码 PNG 文件?

algorithm - 减少匹配器的最佳方法

java - 数据结构(Weiss Java 书): Why allocate Comparable[] in BinaryHeap<T> array instead of T[]?

algorithm - 处理和理解句子

c# - 从序列号生成激活 key

algorithm - 向已包含 n 个元素的二叉堆插入 n 个元素的渐近时间复杂度

binary-search-tree - 二叉堆 - 查找某个高度的节点数

algorithm - 为什么这种等式在 Floyd–Warshall 算法中成立?

java - 查找三个数组中至少两个数组中存在的数字