排序:
A(长度为N)数组有序,B(长度为M)数组无序。要求找出A中所有不在B中的元素。
常规高时间复杂度思路,每取出数组B的一个元素对A遍历N次,时间复杂度O(MN)
两种解决办法:
a.首先遍历B数组,然后对数组A进行二分查找,时间复杂度为O(MlogN)
b.首先对B数组进行排序,采用类似外排的方式,分别用指针a指向A,指针b指向B,如果a指向的值小于b指向的值,则打印a指向的值并移动a指针;如果a=b,不打印,移动b指针;如果a>b,不打印移动b指针。a,b指针有任一到头则结束。时间复杂度O(M)+O(M+N)
冒泡排序时间复杂度:O(N2)
选择排序时间复杂度:O(N2)
插入排序时间复杂度:O(N2)或O(N),与数组的状况有关,若数组有序递增,则O(N)
对数器:
用来验证自己写的方法是否出错
1.首先准备一个时间复杂度高但不会出错的方法
2.完成一个时间复杂度优秀的自己写的方法
3.准备一个随机样本生成器
4.用随机样本生成器生成的样本测试两个方法并对每次测试的结果进行判断
6.如果两个方法的测试结果不相等,则打印出出错的结果,检查方法
递归:
递归行为时间复杂度的估算
master公式的使用(子部分的划分必须一致才适用)
T(N) = aT(N/b)+O(N^d)
b代表分成几部分递归,N/b代表各子部分递归的样本量,aT(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)
归并排序
时间复杂度O(N*logN),额外空间复杂度O(N)