复杂度
包括固定时间的操作和非固定时间的操作,也就是时间复杂度、额外空间复杂度、常数项时间。
固定时间的操作
- 常数操作
- 数组寻址(连续的)
非固定时间的操作
- LinkedList的寻址(不连续的)
评估算法优略的核心指标
- 时间复杂度(流程决定)‘
- 额外空间复杂度(流程决定)
- 常数项时间(实现细节决定)
- 常见的算数运算(+、-、*、/、%等)
- 常见的位运算(>>、>>>、<<、|、&、^等)
- 赋值、比较、自增、自减操作等
- 数组寻址操作
总结
- 执行时间固定的操作都是常数时间的操作
- 执行时间不固定的操作都不是常数时间的操作
二分法
- 只要能正确建立左右两侧的淘汰逻辑,就可以二分
- 常见的面试题
- 在一个有序数组中,找某个数是否存在
- 在一个有序数组中,找>=某个数最左侧的位置
- 在一个有序数组中,找<=某个数最右侧的位置
- 局部最小值问题
对数器
算法写出来之后,需要大量的实例验证,所以必须要有一个方法对算法进行校验,即对数器。比如排序算法,利用对数器,随机生成数组,进行几十万上百万的验证,完全没有问题,才能证明算法是对的。