算法
时间复杂度
评价流程的好坏。
常数操作
每次都是固定时间操作,就叫常数操作。
- 内存寻址
- 加减乘除操作
定义:
一个流程中,评价常数操作数量的指标。
什么是只要高阶项不要低阶项?
例子
打印在B种不在A中的数。
- 第一种方法是两个循环,每次都去A中遍历,看看在不在A中。 那么,这个的时间复杂度就是big o(m*n)这个很想概率论里面的知识。
故上面的意思就是,若它的次数可以用一个方程来表示,并且方程是n阶的。那么,我们去掉除n阶以外的其它项,并且,将n阶项前面的系数去掉,剩下的部分就是时间复杂度的估算值。记为O(f(N))。
算法的好坏是什么?big o(N)
我们是先看复杂度的指标的。这个指标就是o(N)。
然后再看系数。
二分法
也就是一次砍掉一半的数。
它的时间复杂度是 以二为底N的对数。
最优寻找
有两个数组,a和b,如果b<=a,name b移动a不移动,如果a=b的话,那么只移动b,如果仅b>a,那么b也要移动,且还要打印。否则b就只移动不打印。
对数器(自己去验证的方法)
- 有一个你想要测的方法a
- 有一个绝对正确但是复杂度不好的方法b
- 实现一个随机样本产生器
- 实现比对方法
- 把方法a和方法b比对很多次来验证方法a是否正确
- 如果有一个样本使得比对出错,答应样本分析是哪个方法出错
- 当前样本数量很多时比对测试依然正确,可以确定方法a正确。
对数器的作用
可以用最小的样本值来排错
组成
-
产生随机样本的产生器
- 列如生成一个数组,这个数组的值和样本都是随机的。
-
绝对正确的方法【不能出错】
-
大样本测试
- 产生一个数组
- 开始用两个方法去测同一个数组,然后比对这两个数组中的数据是否完全相等,记住,是完全相等。
所以在比赛的过程中,或是平常,一定要提前准备一些验错的对数发生器。
所以,一定要准备模板。
缺陷
我们万一不能保证绝对正确的正确怎么办:加一个打印的方法,这样我们就可以自行判断了。
原因
因为数组长度相对较短,几乎圈进了所有的情况。【这个我还是有点不太能理解。】
冒泡排序
三种情况
对于选择排序和冒泡排序是严格的这样的复杂度。
他们两个的指标是根据两个数组的排序来定的。和数据状况室友关系的。这样就出现了以上三种情况。
平均情况
最好情况
最坏情况
当数据算法不同和其它条件不同的时候,一律按最差的估计。
最差情况就是你该算法的表达式。
时间复杂度
是一个算法流程中,最坏情况下常数操作的指标。
贪心策略
利用对数器可是验出贪心策略到底是对还是不对。
递归行为的实质以及如何分析递归行为的时间复杂度
额外空间
意思就是说,和原来的目标无关,是我建造的辅助模型。
也就是我申请的空间和原空间之间的关系。
递归
分支思路。
递归函数,就是系统在帮你压栈,然后再调用子过程。然后再把栈顶里面的值返回,重构栈里面所有的数据。就是不停的压栈出栈。所以任何递归行为都可以改成非递归。
所以,所谓的递归函数就是系统栈。
递归的时间复杂度分析
通式
T ( N ) = a T ( N b ) + o ( N d ) T(N)=aT(\frac Nb)+o(N^d) T(N)=aT(bN)+o(Nd)
其中,里面的b分之n是子过程的样本量。
后面那个呢,就是剩下的部分的时间复杂度。
时间复杂度计算通式
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split} …
a是递归的次数,也就是总共要几次循环,b是子问题被拆成的组数。左边的N是父问题样本量,右边N是子问题样本量。
注意,以上公式是有使用范围的,就是说,你划分的子问题样本量一致。确定a的时候也只用看一次就行了。
例子:
归并排序
一个数组[左,右],我们先将左边排好序,然后再将右排好序,最后利用外排的方式,将整个数组排好,这个就是归并排序。
假设一个数组: {5,3,6,2,0,1}它的项数是6,那么归并排序就是,左边一半先排好,再右边排好序,然后再来一个辅助数组。对比左右两边的数据,将最大的或最小的依次填入辅助数组,最后,将辅助数组赋值给原数组。这个就是归并排序。
那么,左侧部分和右侧部分都是二分之N,然后进行了两次,所以a就是2,然后拷贝的过程是O(N)的复杂度,所以,按照之前的公式,最终的表达式就是:
T
(
N
)
=
2
T
(
N
2
)
+
o
(
N
)
T(N)=2T(\frac N2)+o(N)
T(N)=2T(2N)+o(N)
所以它的时间复杂度就是:
O
(
N
∗
l
g
N
)
O(N*{lgN})
O(N∗lgN)
这里就会有个问题,如果是奇数该怎么办呢?时间复杂度会不会不一样,当然,是不会的。
因为我们只考虑规模不考虑常数,奇数偶数只决定了后面的常数操作O(N),但项数几乎还是二分之N,进行的次数也就没变,所以还是可以套用上面的公式。
小和问题
在一个数组中,每一个数左边比当前的数小的数累加起来,叫做这个数组的小和。求一个数组的小和。
例
[1,3,4,2,5]
就是将数组中比他本身小的数的个数的求和就叫做小和。
1 没有
3 一个
4 两个
2 一个
5四个
这个有点像线性代数里面的知识。
这道题就可以用归并排序的思想:
这道题需要转换思维,如果说题意比他小,那么因为小和大是补集关系,所以比他小的数的和,和比它大的书的和是一样的。
小和分组化。