时间复杂度、空间复杂度

大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)

posted @ 2022-03-28 20:22  SherryYuan  阅读(38)  评论(0)    收藏  举报