一、概念分析
描述一个算法的性能,其关键是运行在算法上的数据规模,这个数据规模通常我们称为n,这篇文章主要帮助大家建立对数据规模的概念,我们通过一个案例在具体看下。
如果对一个对10^5的数据,也就是10万级别的数据进行选择排序,为什么我们的计算机就会出现假死的情况呢?
其实如果我们对数据规模有了概念后,就会理解这个情况非常正常的想象,因为对现在家庭使用的计算机来说,进行10万级的选择排序,其所需要的时间是非常长的。
二、实验
为了帮助我们对数据规模n建立一个概念,现在进行一个简单的实验。下面是一断非常简单的代码,主要是运行一个时间复杂度为O(n)的程序。
public static void main(String[] args) {
// 数据规模每次增大10倍进行测试
// 有兴趣的同学也可以试验一下数据规模每次增大2倍哦:)
for( int x = 1 ; x <= 9 ; x ++ ){
int n = (int)Math.pow(10, x);
long startTime = System.currentTimeMillis();
long sum = 0;
for( int i = 0 ; i < n ; i ++ )
sum += i;
long endTime = System.currentTimeMillis();
System.out.println("sum = " + sum);
System.out.println("10^" + x + " : " + (endTime - startTime) + " ms");
}
}
可以看到,n的值从10 10^2 一直到10^9,也就是10亿级的数据,对其做简单的加法运算,这是一个O(n)的程序,我们实际运行打印一下时间
不同的计算机配置不同,得出来的数字可能不同,不过大概其在数量级不会有差别。可以看到时间基本上是倍数关系增加的,10^8的数据耗时不到1s,而运行10^9级的数据,其计算消耗的时间基本上需要几秒。
三、结论
从实验可以看出,如果要想在1s内解决问题
O(n^2)的算法可以处理大约10^4级别的数据
O(n)的算法可以处理大约10^8级别的数据
O(nlogn)的算法可以处理大约10^7级别的数据
有了这个概念,回到选择排序10^5数量级的数据排序,由于选择排序是O(n^2)的算法,可能需要几十秒的时间计算,整个CPU资源就全都被这个算法占用了,所以会出现假死的情况。
如果面试官告诉你这个数据规模是10^8级别的话,那我们近乎必须设计O(n)级别的算法,有的时候O(nlogn)级别也是可以的,这是因为logn是复杂度非常低的算法,也是非常快的。
对数据规模有了这样的概念后,不仅对我们平时实际编程中有指导作用,而且在面试中也能帮助我们大概的确定我们要设计的算法它的最低的时间复杂度是怎样的。
如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!
一大波微服务、分布式、高并发、高可用的原创系列文章正在路上,欢迎扫描下方二维码,持续关注:
文玥公子