algorithm - 具有线性创建或优于线性复杂度的累积频率表?

标签 algorithm

我正在尝试解决一个算法问题,并在时间限制内解决它,我需要实现一个累积频率表,其创建时间是线性的还是优于线性的?我的输入只是整数;因此,我的频率表键只是整数。我想出的一个简单实现如下(假设 cumulative_freq_table 是以下代码中的 hashmap。):

read x
for key in range(x, N):
 if key in cumulative_freq_table:
  cumulative_freq_table[key] += 1     

我没有学过任何算法相关的类(class),但我猜它的复杂度在 O(N^2) 左右。这能比 O(N^2) 更及时地完成吗?

最佳答案

离线方法

如果您乐于使用两次通行证,那么您可以这样做:

for each x:
  read x
  freq_table[x] += 1

t = 0
for key in range(0,N):
  t += freq_table[key]
  cumulative_freq_table[key] = t 

这将是线性的。

在线方法

线性方法的问题在于,它需要先查看所有数据,然后才能访问累积频率表。

有其他方法可以持续访问累积频率,但复杂度更高。

例如,看看 Fenwick Trees对于对每个元素使用 O(log(N)) 操作的方法。

关于algorithm - 具有线性创建或优于线性复杂度的累积频率表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19211453/

相关文章:

algorithm - 将 N 个不同半径的圆放在一个较大的圆内而不重叠

python - 如何使用生成器在 Python 中生成不带 "reverse duplicates"的列表排列

algorithm - 寻找启发式传教士和食人者

java - 为什么 isBinarySearchTree() 函数不正确

algorithm - n 阶乘时间函数的正确时间复杂度是多少?

c - 按降序对堆栈进行排序

java - 比较java中的字符串并删除字符串中相同的部分

algorithm - 最近格点类型题

algorithm - 没有Endgame Tablebases的国际象棋残局引擎的实现

algorithm - 在通用哈希表中查找项目?