目录
评估算法优劣的核心指标:
时间复杂度(流程决定)、额外空间复杂度(流程决定)、常数项时间(实现细节决定)
非常数时间的操作:Linked List,执行时间跟样本量有关,就不是常数时间的操作
时间复杂度就是衡量流程中发生了多少次常数操作,最后拆分的操作每一步都是常数级别的操作,就可以了,如果数据量为N,看看基本动作的数量和N是什么关系。
一个问题的最优解:先满足时间复杂度最低这个指标之后,使用最少的空间算法流程。
对数器
generateRandomArray 产生一个随机数组
Math.random() 在[0,1) 上等概率返回任何一个小数,在计算上,这个区间是有穷尽的
(int) (Math.random() * N ) 得到 [0,N-1]
二分
mid = (L + R) / 2 ===》 mid = L + (R - L) >> 1
>> 表示带符号右移,运算比除运算快
无序,相邻不等的 依然可以二分 求局部最优解
先看0 位位置是不是局部最小, 再看N 在 N-1 位置上是不是最小,之后进行二分。
找到类似于“先下在上”的 这个趋势,即中间的位置就是最优解。所以无序数组求局部最优也可以使用二分法。
只要构建出有排他逻辑的就可以进行二分。
异或运算:
异或运算:相同为0,不同为1;异或运算可以记忆为:无进位相加!符号 ^
同或运算:相同为1,不同为1
异或运算的性质:
1) 0 ^ N == N N ^ N == 0
2) 异或运算满足交换律和结合律
不用额外变量的情况下,交换两个数
a = a ^ b
b = a ^ b
a = a ^ b
这样运算必须保证内存是独立的,否则异或之后的结果是0
只有一种数,出现偶数次:将所有数异或起来,最后的结果就是这个数
把一个整型的数,提取出最右侧的1:N & (~N + 1)
有两个数出现基数次,其他数出现偶数次:最先异或所有得到 eor = a ^ b
1)找出最右侧的1,即可过滤出两个子数组,一边有a,另一边则是b;
2)异或任意一边得到a,a^eor 得到 b
数出二进制中1的个数:提取最右侧的1,抹掉最右侧的1:原数 ^ 最右侧的1