给定一个范围,我必须计算数组中数字的频率.给定的解决方案是否有效
Given a range, I have to calculate the frequency of numbers in an array. Is the given solution efficient?
#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 找到。
相关文章:
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 数组/c++中的大量数字
- 遍历并行数组以确定C++中的最大数字
- 整数区间(或 int 数组)中每个数字的出现次数
- 如何在 C++ 中将文件中的逗号分隔数字读取到数组中?
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 获取 2D 数组 c++ 中的所有数字对
- 为什么使用数组元素查找最大数字的程序不起作用?
- 如何从向量或数组中选择最常见的数字?(前五名)C++
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 以十为基数的数字到布尔数组,该数组要求二进制/基数为 2 的数字
- C++ 检查结果数组中有多少次数字
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 如何在C++中有效地将数字值重新分配给字符数组
- 查找数组中的最小数字
- 查找数组中重复(重复)数字的索引
- 我必须找到给定数组中所有数字的周期,就像有很多解决方案,但数组的大小是 10^5
- 类、数字/数组或对象中的对象