17 算法复杂度

问题

解释一下算法复杂度

答案

  • 算法一般包括以下衡量指标:正确性、可读性、健壮性、良好的时空效率,其中的时空效率就是对算法复杂度的衡量。
  • 算法的效率一般由以下因素决定:
    (1)算法采用何种策略,排序算法中快速排序就快于冒泡排序
    (2)问题的规模,寻找10以内的质数显然快于寻找1000以内的质数
    (3)书写程序的语言,汇编语言的效率显然高于java
    (4)编译程序产生的机器代码的质量,机器代码质量越高执行越快
    (5)机器执行指令的速度,I7上的执行显然快于I5。
    以上因素的考量当然是在其他因素固定的情况下去思索的。
  • 算法复杂度包括时间复杂度和空间复杂度。因为java有垃圾回收机制,只要不是在循环中反复申明不可释放的变量,内存必然稳定。所以,我们更为关心时间复杂度,即CPU时间,而CPU时间又可以转化为语句执行次数。因此,我们分析时间复杂度,只需要找出一个问题规模n与关键代码执行次数的关联关系即可。请看以下的代码:
private static void bubble(int[] n)
	{
		for (int i = 0; i < n.length - 1; i++)
		{
			for (int j = 0; j < n.length - i - 1; j++)
			{
				if(n[j] > n[j + 1])
				{
					int temp = n[j];
					n[j] = n[j + 1];
					n[j + 1] = temp;
				}
			}
		}
	}

这段代码的关键代码是交换逻辑。最好的情况是n={1,2,3,4,5,6,7,8,9,10};最坏的情况是n={10,9,8,7,6,5,4,3,2,1}。对于前者来说,关键代码的执行次数是0;对于后者来说,关键代码的执行次数是90,即10*(10-1),进一步转换为n*(n-1),再转换为n平方-n,平方显然比n的影响要大,所以,舍小取大,这段冒泡排序的时间复杂度就是n平方。

发布了358 篇原创文章 · 获赞 0 · 访问量 2748

猜你喜欢

转载自blog.csdn.net/langli204910/article/details/105228250