时间复杂度

常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。

时间复杂度为一个算法流程中,常数操作数量的指标。常用O来表示。具体来说,在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为f(N),那么时间复杂度为O(f(N))

评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是常数项时间

master公式的使用

T(N) = a*T(N/b) + O(N^d)

1) log(b,a) > d -> 复杂度为O(N^log(b,a))

2) log(b,a) = d -> 复杂度为O(N^d * logN)

3) log(b,a) < d -> 复杂度为O(N^d)

/**
	时间复杂度例子
	一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数
	组长度为N,B数组长度为M。
 */
import java.util.Arrays;
public class C03_TimeComplexity {
	//算法流程1:对于数组B中的每一个数,都在A中通过遍历的方式找一下
	public static void fun1(int A[],int B[]){
		System.out.println("算法流程1结果:");
		for (int i = 0; i < B.length; i++) {
			boolean isFind = false;
			for (int j = 0; j < A.length; j++) {
				if(B[i]==A[j]){
					isFind = true;
					break;
				}
			}
			if(!isFind){
				System.out.print(B[i]+" ");
			}
		}
		System.out.println();
	}
	//算法流程2:对于数组B中的每一个数,都在A中通过二分的方式找一下
	public static void fun2(int A[],int B[]){
		System.out.println("算法流程2结果:");
		for (int i = 0; i < B.length; i++) {//B数组中的每一个数
			int left = 0;
			int right = A.length-1;
			boolean isFind = false;
			while(left<=right){//在A中二分
				int mid = left+(right-left)/2;//这种写法是为了防止越界
				if(A[mid]==B[i]){
					isFind = true;
					break;
				}else if(A[mid]<B[i]){
					left = mid+1;
				}else {
					right = mid-1;
				}
			}
			if(!isFind){
				System.out.print(B[i]+" ");
			}
		}
		System.out.println();
	}
	//算法流程3:先把数组B排序,然后用类似外排的方式打印所有在A中出现的数
	public static void fun3(int[] A,int[] B){
		System.out.println("算法流程3结果:");
		int p1 = 0,p2 = 0;//p1,p2分别是arr1,arr2的指针
		while(p1<A.length && p2<B.length){
			if(A[p1]<B[p2]){
				p1++;
			}else if(A[p1]>B[p2]){
				System.out.print(B[p2++]+" ");
			}else {
				p2++;
			}
		}
		while(p2<B.length){//B中剩下的数一定是找不到的
			System.out.print(B[p2++]+" ");
		}
		System.out.println();
	}
	//打印数组
	public static void printArr(int arr[]){
		for (int i : arr) {
			System.out.print(i+" ");
		}
		System.out.println();
	}
	//产生测试数组
	public static int[] testData(int len,int val){
		int arr[] = new int[len];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int)(val*Math.random()-val*Math.random());
		}
		return arr;
	}
	public static void main(String[] args) {
		int []arr1 = testData(10, 20);
		int []arr2 = testData(8, 20);
		printArr(arr1);
		printArr(arr2);
		Arrays.sort(arr1);
		Arrays.sort(arr2);
		fun1(arr1, arr2);
		fun2(arr1, arr2);
		fun3(arr1, arr2);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值