算法

算法

时间复杂度

评价流程的好坏。

常数操作

每次都是固定时间操作,就叫常数操作。

  • 内存寻址
  • 加减乘除操作

定义:

​ 一个流程中,评价常数操作数量的指标。

什么是只要高阶项不要低阶项?

例子

打印在B种不在A中的数。

  1. 第一种方法是两个循环,每次都去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就只移动不打印。

对数器(自己去验证的方法)

  1. 有一个你想要测的方法a
  2. 有一个绝对正确但是复杂度不好的方法b
  3. 实现一个随机样本产生器
  4. 实现比对方法
  5. 把方法a和方法b比对很多次来验证方法a是否正确
  6. 如果有一个样本使得比对出错,答应样本分析是哪个方法出错
  7. 当前样本数量很多时比对测试依然正确,可以确定方法a正确。

对数器的作用

可以用最小的样本值来排错

组成

  1. 产生随机样本的产生器

    1. 列如生成一个数组,这个数组的值和样本都是随机的。
  2. 绝对正确的方法【不能出错】

  3. 大样本测试

    1. 产生一个数组
    2. 开始用两个方法去测同一个数组,然后比对这两个数组中的数据是否完全相等,记住,是完全相等。

    所以在比赛的过程中,或是平常,一定要提前准备一些验错的对数发生器。

    所以,一定要准备模板。

    缺陷

    我们万一不能保证绝对正确的正确怎么办:加一个打印的方法,这样我们就可以自行判断了。

    原因

    因为数组长度相对较短,几乎圈进了所有的情况。【这个我还是有点不太能理解。】

冒泡排序

三种情况

对于选择排序和冒泡排序是严格的这样的复杂度。

他们两个的指标是根据两个数组的排序来定的。和数据状况室友关系的。这样就出现了以上三种情况。

平均情况

最好情况

最坏情况

当数据算法不同和其它条件不同的时候,一律按最差的估计。

最差情况就是你该算法的表达式。

时间复杂度

是一个算法流程中,最坏情况下常数操作的指标。

贪心策略

利用对数器可是验出贪心策略到底是对还是不对。

递归行为的实质以及如何分析递归行为的时间复杂度

额外空间

意思就是说,和原来的目标无关,是我建造的辅助模型。

也就是我申请的空间和原空间之间的关系。

递归

分支思路。

递归函数,就是系统在帮你压栈,然后再调用子过程。然后再把栈顶里面的值返回,重构栈里面所有的数据。就是不停的压栈出栈。所以任何递归行为都可以改成非递归。

所以,所谓的递归函数就是系统栈。

递归的时间复杂度分析
通式

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(NlgN)
这里就会有个问题,如果是奇数该怎么办呢?时间复杂度会不会不一样,当然,是不会的。

因为我们只考虑规模不考虑常数,奇数偶数只决定了后面的常数操作O(N),但项数几乎还是二分之N,进行的次数也就没变,所以还是可以套用上面的公式。

小和问题

在一个数组中,每一个数左边比当前的数小的数累加起来,叫做这个数组的小和。求一个数组的小和。

[1,3,4,2,5]

就是将数组中比他本身小的数的个数的求和就叫做小和。

1 没有

3 一个

4 两个

2 一个

5四个

这个有点像线性代数里面的知识。

这道题就可以用归并排序的思想:

这道题需要转换思维,如果说题意比他小,那么因为小和大是补集关系,所以比他小的数的和,和比它大的书的和是一样的。

小和分组化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值