左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算

我们常说,程序=算法+数据结构。结果光搞框架去了,有点说不过去~

时间复杂度

常数时间的操作:如果一个操作的执行时间不以具体样本为转移,每次执行时间都是固定时间。称这样的操作为常数时间操作。
数组的寻址操作就是固定时间操作,与数据量无关。

>>带符号右移
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第1张图片
>>>不带符号右移
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第2张图片
常数时间的操作包括:
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第3张图片
非常数时间操作包括:
链表获取i位置的元素
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第4张图片

选择排序

在0~n-1位置中找到最小值,和0位置的数交换
找1~n-1位置最小值,和1位置的数交换

直到n-1~n-1,不用操作了

整个流程中常数操作的数量:
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第5张图片
我们最终是要将低阶项和高阶项的系数抹掉的。

左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第6张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第7张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第8张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第9张图片
注意
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第10张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第11张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第12张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第13张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第14张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第15张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第16张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第17张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第18张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第19张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第20张图片
一个常用的小技巧
1、两数相加除以2的时候,为了避免溢出,应该先除以2,再相加
2、右移一位>>比除以2的运算更快
3、除以2加1相当于先右移再进行或1| 1
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第21张图片
必须保证两个数在两个独立的空间,否则自己异或自己结果为0。这只是一个骚操作,面试的时候可能或问到,实际上你写的时候不要这么得瑟,因为容易有坑。
问题1
如何在不使用新变量的情况下,交换两个数?
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第22张图片
异或运算和异或的顺序无关
下面这道题,将所有的数全部异或即可
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第23张图片
在这里插入图片描述
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第24张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第25张图片
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第26张图片
在eor中找最右侧的1,这个最右侧的1可以将a,b两个数区分开。整个数组中,我们根据eor最右侧1这个位置,将数组分为两部分,其中一部分一定包含a,另一部分一定包含b。然后再分别对这两部分进行整体的异或操作即可。
左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算_第27张图片

你可能感兴趣的:(马士兵课程)