左神算法第一课笔记(基础知识)

时间复杂度

常数时间的操作(固定时间的操作)
如何确定算法流程的时间复杂度?
	当确定的算法表达式,只保留高阶项,去除低阶项,高阶项系数也去掉
	O(忽略高阶项系数的高阶项)

额外空间复杂度

为了完成这个方法需要额外申请的空间

常数时间

完成一次最小单位动作的时间

对数器

1你想要测方法a
2你首先要有一个正确的方法b
3实现一个随机样本产生器(random函数)
4用方法a和方法b跑相同的随机样本,观察a和b的结果是否一样
5如果两次结果不一样,就人工干预样本,排查错误
6当样本数量很大并且a和b结果一样,证明方法a已经成功

log

log x n = log 以x为底n
log n  = log 2 n(默认是以2为底的)
2的3次方等于8,log 8 = log 2 8 翻译成中文就是求2的几次方等于8

(R-L)>> 1 mid = (L+R)/2

这是java里面的一段代码主要是找到L和R中间的数
比如L=100 R=200 mid = (100+200)/2
但是如果L和R很大会导致溢出,所以为了防止溢出改用二进制的方式,我们都知道二进制里左移一位就是乘2右移一位就是除2
mid = (L+R)/2 进化 mid = L +(R-L)/2 进化 L +(R-L)>> 1

局部最小值问题

三种情况:
左边界
n 和n+1(最左边的数比他右边的数小就叫局部最小)
右边界
n-1和n (最右边的数比他左边的数小就叫局部最小)
中间
n-1 n n+1 (中间的数比他左边的小也比他右边的小)

按位或 按位与

按位与,运算符 “&” , 双目运算符,其功能让两个数的二进制位相与,只有两个位均为1 的情况,其结果才是1 ,其余情况为0。如:

1&1=1
1&0=0
0&1=0
0&0=0

按位或, 运算符"|" , 双目运算符,其功能让两个二进制位相或 ,只有两个位均为0的情况,其结果才是0 , 其余情况为1。 如:

1|1=1
1|0=1
0|1=1
0|0=0

取反, 运算符"~" , 单目运算符,其优先级高于双目运算符,其功能让一个数二进制位按位取反,即 1 变 0 , 0 变1。

异或运算

异或:相同为0不同为1(垃圾)记成无进位相加(优秀)
同或:相同以1不同为0

6异或7 => 110 ^ 111 => 001 =>1
异或运算的性质

0 ^ N = 1(0和任何数异或都为1)
N ^ N = 0

交换律结合律
a^b^c = a^c^b(同一批数不管怎么交换顺序异或出来一样)
经典案例变量a和变量b不经过第三个变量交换
a = a^b
b = a^b => b=a^b^b => b=a^0 => b=a 
a = a^b => a=a^b^a => a=b^0 => a=b
经典案例一个数组中一种数出现了奇数次,其他的数都出现了偶数次,怎么找到他
a^b^b^c^c => a^0^0 = a (真骚!)
经典案例把一个整型数最右侧的1提取出来

1010=>0010

N&((~n)+1)
1010 => 0101 =>0110 => 1010&0110 => 0010(真骚!)
经典案例 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到他

a^b^b^c^c^d => a^d => 找到a^b 最右侧1的那一位假设为x,什么意思呢?a^b最右侧为1那一位x一定是a的x位1或者b的x位为1,因为a^b的x位为1所以一定是一个1一个0,1^0才等于1 => 在a b c d中找到x位1的数并做异或,就能求出x位为1的第一个奇数假设为j ,j就是a或b但是我们不知道=> 另外一个就是 a^b^j(a或者b),假设j就是b,那么a^b^b => a^0 => a,这样就求出来了a,b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值