时间复杂度、空间复杂度
大O阶表示方法的规则:
1.用常数1取代运行时间中的所有加法常数;
2.在修改后的运行次数中,只保留高数阶;
3.如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数
空间复杂度:
(每8位是一个字节)
1.计算机访问内存的方式,都是一次一个字节
2.一个引用(机器地址)需要8个字节表示:
例如:Date date=new Date(); 则date这个变量需要占用8个字节来表示
3.创建一个对象,例如new Date(),除了Date 对象内部存储的数据(例如年月日等信息)占用的内存,该对象本身也有内存开销,每个对象的自身开销是16个字节,用来保存对象的头信息。
4.一般内存的使用,如果不够8个字节,都会被自动填充为8字节。
例如:
public class A{
public int a=1;
}
通过new A()创建一个对象的内存占用如下:
1.整型对象变量a占用4个字节;
2.对象本身占用16个字节;
那么,创建该对象总共需要20个字节,但由于不是以8为单位,会自动填充为24个字节
5.java中数组被限定为对象,他们一般都会因为记录长度而需要额外的内存,一个原始数据类型的数组一般需要24字节的头信息(16个自己的对象开销,4字节用于保存长度以及4个填充字节)再加上保存值所需的内存。
案例:对指定的数组元素进行反转,并返回反转的内容。
方法1:头尾交换
public static int[] reverse1(int[] arr1){
int n=arr.length; //申请4个字节
int t; //申请4个字节
for(int start=0,end=n-1;start<=end;start++,end--){
t=arr[start];
arr[start]=arr[end];
arr[end]=t;
}
return arr;
}
注意,不是二重循环,注意判断条件
空间复杂度为O(8)→O(1)
方法2:创建一个新数组,对原数组从后往前倒着遍历放入新数组
public static int[] reverse2(int[] arr){
int n=arr.length; //申请4个字节
int[] temp=new int[n]; //申请n*4个字节+数组自身头信息开销24个字节
for(int i=n-1;i>=0;i--){
temp[n-1-i]=arr[i];
}
return temp;
}
空间复杂度为O(4n+28)→O(n)