常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。
时间复杂度为一个算法流程中,常数操作数量的指标。常用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);
}
}