ACM春季讲座(一)笔记

来源:互联网 发布:edg淘宝官方旗舰店 编辑:程序博客网 时间:2024/05/15 16:25

ACM春季讲座(一)笔记

2017.03.17

算法复杂度

时间复杂度

时间复杂度是指执行算法所需要的计算工作量;(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。

例子:如 for (i=1;i<=n;i++) –> O(n);
再加一层for循环,则O(n^2);

时间复杂度

空间复杂度是指执行这个算法所需要的内存空间。

例子:如 int a[n]; –> O(n);

冗余

冗余有两层含义,第一层含义是指多余的不需要的部分,第二层含义是指人为增加地重复部分。

例:给定一串序列 X1,X2,X3……Xn,求连续子序列和的最大值。

法一:暴力枚举解法

改进:sum[i][j]存储Xi-Xj的子序列和,则sum[i][j]=sum[i][j-1]+Xj;

再改进:若sum[i][j]<0,则break,因为后面不可能会出现最大值。

证:sum[i][j]<0,设sum[i][j+n]=max,则sum[j+1][j+n]=sum[i][j+n]-sum[i][j]>max,矛盾;

再再改进:若sum[i][j]<0,则i=j+1继续枚举;

法二:前缀和

算出每个数的前缀和C,则题目可变成求 C[R]-C[L] 的最大值,则给定任意R,求1-R的C最小值min,给定R+1的时候,可对比min与C[R+1]的大小即可

贪心

在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

例:1元,5元,10元的硬币,问求需要购买X元的物品最少需要多少个硬币?

则对10元贪心。

例:第I件工作开始的时间为Si,结束时间为Ti,求给定时间最多能做多少工作?

则对结束时间Ti贪心。

分治

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

如需要处理[1,8]个数据,则可以先处理[1,4],[5,8]–>[1,2][3,4],[5,6][7,8]

归并算法与逆序对

(例子忘了记,从百度上截取了一段)

如 设有数列{6,202,100,301,38,8,1}

初始状态:6,202,100,301,38,8,1

第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;

第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;

第三次归并后:{1,6,8,38,100,202,301},比较次数:4;

时间复杂度:O(nlogn) 空间复杂度:O(n)

逆序对:在归并的过程中计算每个小区间的逆序对数,进而计算出大区间的逆序对数

二分

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x

倍增(ST算法解RMQ)

RMQ:Range Minimum/Maximum Query 即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。

ST:SparseTable 在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询,首先进行预处理,然后查询

预处理:先算出一个数的最小值,然后算两个数,然后算四个数,然后算八个数。其中四个数可以通过两个数的最小值互相比较得出,以此类推。

动规方程:F[i, j]=max(F[i,j-1], F[i + 2^(j-1),j-1])

查询:设有n个数,则找出2^i < n < 2^i + 1, 算前面2^i 个数的最小值,算后面2^i个数的最小值,二者相比即可得到

如:给数列{2,1,0,4,7,-1,5}

求2^0个数:2 1 0 4 7 -1 5

求2^1个数:1 0 0 4 -1 -1 5

求2^2个数: [1,2]的2^1 最小值和[3,4]的2^1 最小值相比即可得到 [1,4] 的最小值 以此类推

求[1,7]的最小值可从预处理中得到前四个数最小值,以及后四个数最小值,二者相比即可

贴几个写笔记过程中的参考:

rmq问题–st算法

RMQ问题之ST算法

[Jobdu] 题目1544:数字序列区间最小值

动态规划

下节讲座的内容

先贴上参考博客:

教你彻底学会动态规划——入门篇

很特别的一个动态规划入门教程

后记:收获很大的一节讲座,感觉这是我一直渴望的学习,高中参加竞赛培训时一直很遗憾没能好好学习这些算法思想,而现在我大概找到了自己想要努力的方向。听讲座时讲到RMQ问题完全是一脸懵逼,结束后一群人围在讲台让学长重新讲了遍,还偶遇了师姐,这才是该有的学习的态度啊。感谢学长的精彩授课~笔记没有用很规范的语言写,通俗易懂就好。

0 0
原创粉丝点击