时间复杂度
**常数操作:**一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作
时间复杂度是一个算法流程中,常数操作作为一个指标,常用O表示。具体来说,先要对一个算法流程非常熟悉,然后去写这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式
在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,如果剩下的部分为f(N),那么时间复杂度为O(f(N))
评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是常数项时间
异或的性质
- 0 ^ N=N,N ^ N=0
- 满足交换律和结合律
int a = 甲;
int b = 乙;
a = a ^ b; //a=甲^乙,b=乙
b = a ^ b;//a=甲^乙,b=甲^乙^乙=甲
a = a ^ b;//a=甲^乙^甲=乙,b=甲
位运算
获得第i位的数字:(a>>i)&1 或者 a&(1<<i)
设置第i位为1:a=a|(1<<i)
设置第i位为0:a=a&(~(1<<i))
把第i位取反:a=a^(1<<i)
取出一个数的最后一个1:mid & (~mid + 1);
排序思路
二分法
- 有序数组查找数字
- 有序数组查找大于等于某一个数的最左侧的位置
- 无需数组中找某一区间的最小值
剖析递归行为和递归行为时间复杂度的计算
归并排序
快排