算法笔记 - 认识复杂度、对数器、二分法与异或运算

算法学习笔记(左神网课)

评估算法的核心指标
1时间复杂度(流程决定)
2额外空间复杂度(流程决定)
3常数项时间(实现细节决定)


基础内容

常数时间的操作

  1. 不以数据量为转移
  2. 每次执行时间都固定的
    常见的常数时间操作
    常见的算术运算(+、-、*、/、% 等)
    •常见的位运算(>>、>>>、<<、|、&、^等)
    •赋值、比较、自增、自减操作等
    •数组寻址操作

结论: 执行时间固定的操作都是常数时间的操作。执行时间不固定的操作,都不是常数时间的操作。

非常数时间操作
-需要遍历的操作就是非常数时间操作
-时间流程复杂度 就是常数时间操作量

如何确定算法流程的总操作数量与样本数量之间的表达式关系
1.想象算法流程所处理的数据状况,按照最差情况来
2.把整个流程彻底拆分为一个基本动作,保证每个动作都是常数时间的操作
3.如果数据量为N,看基本动作的数量和N的关系

如何确定算法的时间复杂度
当完成了表达的建立,只要把高阶项留下即可,低阶项都去掉,高阶项的系数也去掉

*当样本量大到一定程度,低阶项和系数就不重要了

排序示例

时间复杂度
想要了解时间复杂度,要先知道什么是常数时间操作。
常数时间操作:一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数时间操作。(包括:位运算,加,减,乘,除,取余,数组寻址等)
例如:int p=3+5。p的取值所需的时间与数据的大小无关。

时间复杂度就是执行完一个流程所需常数时间操作,只保留N的最高阶项(不包括其系数),称为时间复杂度。

意义: 评价两个个算法在数值趋向于正无穷时哪个更快。

例如: O(N)和O(N2),数值趋于无穷时显然,前者较快。

比较流程:1.比较时间复杂度 2.如果时间复杂度相等,构建多个数据,以实验的方式进行比较。(考虑到其固定时间不同的情况)

额外空间复杂度
即完成一个流程需要新开的额外空间。

作为输入参数的空间,不算额外空间。
作为输出结果的空间,也不算额外空间。
因为这些都是必要的、和现实目标有关的。所以都不算。
但除此之外,你的流程如果还需要开辟空间才能让你的流程继续下去。这部分空间就是额外空间。

额外空间复杂度大小:

如果程序运行过程中,不需要额外的数据结构,只是使用了额外的几个变量。那么额外空间复杂度为O(1);
如果要申请一个和原数组大小一样的数组,那额外空间复杂度为O(n);
如果申请一个是原数组大小一半的数组,那额外空间复杂度为O(n)(因为系数是可以忽略的)

算法流程的常数项
我们会发现,时间复杂度这个指标,是忽略低阶项和所有常数系数的。

难道同样时间复杂度的流程,在实际运行时候就一样的好吗?
当然不是。
时间复杂度只是一个很重要的指标而已。如果两个时间复杂度一样的算法,你还要去在时间上拼优劣,就进入到拼常数时间的阶段,简称拼常数项。

算法流程的常数项的比拼方式 :
放弃理论分析,生成随机数据直接测。

为什么不去理论分析?
不是不能纯分析,而是没必要。因为不同常数时间的操作,虽然都是固定时间,但还是有快慢之分的。

评价算法的最优解
一般情况下,认为解决一个问题的算法流程,在时间复杂度的指标上,一定要尽可能的低,先满足了时间复杂度最低这个指标之后,使用最少的空间的算法流程,叫这个问题的最优解。

一般说起最优解都是忽略掉常数项这个因素的,因为这个因素只决定了实现层次的优化和考虑,而和怎么解决整个问题的思想无关。

常见时间复杂度

  • O(1)
  • O(logN)
  • O(N)
  • O(N*logN)
  • O(N^2) O(N^3) O(N^k)
  • O(2^N) O(3^N) O(k^N)
  • O(N!)

认识对数器

  1. 想测试方法A
  2. 实现复杂度不好但是容易实现的方法B
  3. 实现一个随机样本产生器
  4. 把方法a和放b跑相同的随机样本,看看结果是否一样

对数器就是逐字比较 目标结果 与 实际运行结果的方式,遍历结果返回true或者false

二分法

  1. 经常见到的类型是在一个有序数组上,展开二分搜索
  2. 只要能正确构建左右两侧的淘汰逻辑,就可以使用二分

异或运算
0^N ==N
N^N ==0

题目一
如何不用额外变量交换两个数

题目二
一个数组中有一个数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个数

题目三
怎么把一个int类型的数,提取出最右侧的1来

题目四
一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值