累积频率表是创建线性还是线性复杂度?

时间:2013-10-06 17:00:39

标签: algorithm

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

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

我还没有研究任何算法相关的课程,但我猜它的复杂性大约是O(N ^ 2)。这可以在时间上比O(N ^ 2)更好吗?

1 个答案:

答案 0 :(得分: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))运算的方法。