2,算法分析
2,1分类
1. 时间复杂度分析:对运行的时间进行分析
2. 空间复杂度分析:对运行的空间进行分析
2.1.1时间复杂度分析方法分类
事后分析法(相对不好)
事前估算法
事前分析:
1,采用的策略和方案
2,编译产生的代码质量
3,问题的输入规模
4,机器执行指令的速度
随算法输入规模的增大,算法的阐述操作可以忽略不计,最高次项的常数因子不会影响算法的空间复杂度。最高次项指数大的,随n的增大结果也会增长特别快。算法函数中n最高次幂越小,算法效率越高。
2.1.2大O记法
程序执行次数 = 执行时间
1,用常数1取代UN性事件中的所有加法常数
2,在修改后的运行次数中,只保留最高阶项。
3,如果高阶项存在,且常数因子不为1,则去除这个项的常数。
常见的大O阶
1,线性阶 O(n) 单层循环
2,平方阶 O(n^2) 两层循环(嵌套循环)
3,立方阶 O(n^3) 三层循环
4,对数阶 O(logn) 二分策略 二分查找
5,常数阶 O(1)
常用的大O阶
6,线性对数阶 O(Nlogn) 分冶思想 归并排序
7,指数阶 O(2^N) 穷举查找
时间复杂度大O排序
O(1 )<O(logn)<O(n)<O(nlogn)<O(n2)< O(n3)
1, Java中基本数据类型的内存占用情况。
byte short int long float double boolean char
1 2 4 8 4 8 1 2
2,计算机读取访问的方式都是一次一个字节。
3,一个引用需要8个字节表晒(一个字节8位)
4,每个对象自生占用16个字节
5,一般内存的使用,如果不够8字节,会被自动填充。
2.2.2算法的空间复杂度分析
案例:对指定数组元素进行反转,并返回反转内容。
方法一:
import java.util.Arrays;
public class demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []a = {1,2,3,4,5,6,7,8,9};
System.out.println(Arrays.toString(reversel(a)));
}
public static int[] reversel(int[] arr) {
int n = arr.length;
int temp;
for (int start = 0,end = n - 1; start <= end; start++,end--) {
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
return arr;
}
}
时间复杂度为:O(8)即为O(1),空间复杂度位O(1)
方法二:
import java.util.Arrays;
public class demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []a = {1,2,3,4,5,6,7,8,9};
System.out.println(Arrays.toString(reversel(a)));
}
public static int[] reversel(int[] arr) {
int n = arr.length;
int[] temp = new int[n];
for (int i = n-1; i >= 0; i--) {
temp[n - i - 1] = arr[i];
}
return temp;
}
}
时间复杂度为:O(1)空间复杂度为:O(4n+24),24是自开销;