一:算法
算法根据数据结构上面描述定义:算法是描述求解问题方法的操作步骤的集合。
二:算法的性质
算法应满足以下性质
- 输入性:具有0个或者若干个输入量
- 输出性:至少产生一个输出或者执行一个有意义的操作
- 有限性:执行语句的序列是有限的
- 确定性:每一条语句的含义明确,无二义性
- 可执行性:每一条语句都有应在有限的时间内完成
三:算法设计目标
- 正确性
- 可读性
- 健壮性
- 高时间效率
- 高空间效率
四:算法效率
上面提到高时间高空间效率,都是指算法效率。
- 时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。
- 空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。
设计算法时,根据系统环境,权衡复杂度,在时间与空间选取一个平衡点。但是,时间复杂度要比空间复杂度更容易产生问题,因此算法研究的主要也是时间复杂度。
五:时间复杂度
分析一个算法中基本语句执行次数和数据元素个数N的函数关系,得出该算法时间复杂度T(n)。
案例,我们根据冒泡排序法对数组a中的N个整数类型的数据元素从小到大进行排序,求该算法的时间复杂度。
首先我们看冒泡排序代码:
package com.lj.TN; import org.junit.Test; public class arrayDemo { @Test public static void arraySort(int a[]) { int n = a.length; int i, j, temp, flag = 1; for (i = 1; i < n && flag == 1; i++) { flag = 0; for (j = 0; j < n - i; j++) { if (a[j] > a[j + 1]) { flag = 1; temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } }
冒泡排序算法的原理如下:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
我们考虑一个最好的情况与一个最坏的情况:
- 那么最好情况,只需要一趟扫描即可完成,比较次数(n-1),移动次数0所以很容易得知空间复杂度为O(n);
- 如果是最坏的情况,需要n-1趟排序,每趟排序要进行n-i次(1≤i≤n-1),所以比较次数n(n-1)/2 ,移动次数3n(n-1)/2,所以空间复杂度为O(n^2);
浙公网安备 33010602011771号