给定一个范围,我必须计算数组中数字的频率.给定的解决方案是否有效

Given a range, I have to calculate the frequency of numbers in an array. Is the given solution efficient?

本文关键字:数字 数组 频率 有效 是否 解决方案 计算 一个 范围      更新时间:2023-10-16
#include<iostream.h>
int main()
 {
   int a[10]={1,2,3,5,2,3,1,5,3,1};
   int i;
   int c[10]={0};
   for(i = 0 ; i < 10 ; i++)
       c[a[i]]++;
   for(i=0;i<10;i++)
      cout<<i<<": "<<c[i]<<endl;
   return 0;
 }

算法的运行时间为 O(n),但它占用了额外的 O(n) 空间。我能做得更好吗?

谢谢!

取决于什么对你很重要 - 你可以创建一个算法,占用 O(n^2) 时间,但占用 O(1) 空间(使用两个循环,请参阅下面的代码),但你不能将时间复杂度提高到 O(n) 以下。

for(i=0;i<10;i++) {
  count = 0;
  for(j=0;j<10;j++)
    if (c[j] == i) count++;
  cout<<i<<": "<<count<<endl;
}

O(1) 空间的另一种可能性是就地排序数组,然后遍历一次,这应该具有使用就地合并排序的时间复杂度 O(n log n)。

不,你不能。这是你能做的最好的事情。

什么是

"高效"?向我们展示性能要求和性能测量。然后我们可以告诉您它是否有效。 在此之前,这是一个广泛的开放问题,有很多错误的答案,也没有正确的答案。到目前为止,答案是正确的,只有"高效"一词意味着"尽可能快地运行"。

也许你有一台内存很少的快速计算机。

您始终可以使一段代码运行得更快,或者使用更少的内存、更少的磁盘空间或更少的磁盘空间。 如果它不够"高效",我见过人们手工组装以使其更快。 通常这是浪费时间和精力。优化尚未分析的代码是一个愚蠢的游戏。

如果所有数字都在 1 到 n 的范围内,那么 in 可以以 O(n) 时间复杂度和 O(1) 空间复杂度完成。

如果存在索引 X 和数组 A,使得 A[X]=Y,则将 N 添加到索引 Y.So 处的值,A[Y] 变为 A[Y]=原始+N.继续这样做,值将是形式 (原始+KN),其中 k>=0.To 检索我们可以做的原始元素 (original+KN)%N 因为 (x+kn)%n=x 并且计数可以通过 (original+KN)/N 找到。