步步为营-算法学习
文章平均质量分 64
ACM初级、中级的文章。
理论+题解,对于基本功的提升很有帮助。
Kernight
骨灰级程序员。
展开
-
步步为营(十六)搜索(二)BFS 广度优先搜索
上一篇讲了DFS,那么与之对应的就是BFS,也就是 宽度优先遍历,又称广度优先搜索算法。首先,让我们回忆一下什么是“深度”: 更学术点的说法,可以看做“单位距离下,离起始状态的长度”那么广度是什么呢? 个人觉得,可以这么归纳: 何为广度? 可以看做“距离初始状态距离相等的结点”的集合那么BFS的核心思想就是:从初始结点开始,搜索生成第一层结点,检查目标结点是否在这些结点中,若没有,再将原创 2015-07-30 17:13:02 · 851 阅读 · 0 评论 -
步步为营(十五)搜索(一)DFS 深度优先搜索
前方大坑预警!先讲讲什么是搜索吧。有一天你去一个果园摘梨子,果农告诉你,有一棵树上有一个金子做的梨子,找到就是你的,你该怎么找? 地图如下: S 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 G废话,挨个找呗~ 这就叫做搜索。 在一个区间内找到符合条件的值的过程,就是搜索。(?)最简单的就是穷举,挨个找。因为都可以走,所以从(1,1)到原创 2015-07-30 16:47:05 · 1172 阅读 · 0 评论 -
步步为营(十四)常用数据结构(7)STL-Queue(队列)priority_queue(优先队列)
与栈相对的就是队列了,二者都是容器适配器一级的数据结构。Queue的默认实现也是通过Deque实现的(这丫的通吃啊),也就最大程度保证了效率和空间的平衡。 Queue是 先进先出(FIFO)的线型表。 Queue只允许在尾端进行数据的插入,在头端进行数据的删除。 话不多说,上图: 队列需要注意的就是他的先进先出特性,这在以后学广度优先搜索时比较方便。操作还是那几种:queue原创 2015-07-28 16:12:28 · 911 阅读 · 0 评论 -
步步为营(十三)常用数据结构(6)STL-Stack(栈)
在聊Stack之前,要说到一个概念:容器适配器。 之前我们接触了两种容器:顺序容器(也有叫序列容器的)和关联容器。那么已知的数据结构有那么多,我们是不是都需要去一一实现呢? 当然不用,因为那些数据结构大都可以通过现有的数据结构实现,于是便出现了容器适配器。 容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。 例如,stack适配器可使任何一种顺序容器以栈的方式工作原创 2015-07-28 15:44:33 · 926 阅读 · 0 评论 -
步步为营(十二)常用数据结构(5)STL-Set(集合)
Set也属于关联容器,而且和Map的实现方法相同,都是红黑树。 简单来说,Set就是key和Value相等的Map。值得注意的是,由于红黑树的自平衡性(额,也就是自动排序的结果),所以不能直接修改节点的值,每次想要修改一个节点的值,就必须删除原来的元素,然后重新插入。Map为什么没提这一点? 因为Map的节点是Key值,应该不会有人会去修改Key值的吧…………同样的,对于结构体来说,我们可以原创 2015-07-28 11:29:55 · 822 阅读 · 0 评论 -
步步为营(十一)常用数据结构(4)STL-Map(应该是散列表)
Map的直译是图,但是STL里的map容器和图半毛钱关系都没有~Map属于关联容器,而之前讨论的List,Vector,Deque都属于顺序容器。 差别么…… 个人觉得,关联容器是单纯查找用的,顺序容器的功能更注重数据的存储。 Map的存储形式是 < key, value >。 其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值。Map内部的实现是红黑原创 2015-07-28 11:07:29 · 877 阅读 · 0 评论 -
步步为营(十)常用数据结构(3)STL-Deque(双端队列)
和前两个不同,双端队列(double-end queue)更像是一种折衷的产物。可能是人们发现Vector和List的水火不容,于是发明了这么一个集两家所长的东西。 双端队列具有Vector和List的优点,或者说二者的特征点都可以在Deque里实现。我真想说,这是一个凑不要脸的结构……原因如下: 支持随机访问(下标访问,也就是[]操作符)(Vector) 支持在两端进行数据插入原创 2015-07-28 10:43:04 · 1304 阅读 · 0 评论 -
步步为营(九)常用数据结构(2)STL-Vector(动态数组)
和链表相对的就是数组了,这两种结构是最基本的数据结构类型了。 C++自身实现了一个array容器,但是STL里的动态数组Vector(直译为向量)使用更方便,这里还是讨论下Vector。 Vector是内存连续的,空间按需增长的结构。Vector和List是刚好相反的,Vector在随机存储的操作上非常方便,但是在增加和删除元素时非常麻烦。如果你想删除一个元素,就必须移动后面所有的元素向前一原创 2015-07-28 10:21:44 · 850 阅读 · 0 评论 -
步步为营(八)常用数据结构(1)STL-List(双端链表)
额,这个真的有必要说么~~ 链表是空间动态分配的,内存不连续,不能随机进行访问和储存的结构。链表的存储方式注定了链表在查找时面临着O(n)的时间复杂度,虽然看起来不算很大,但是这是单次查找的复杂度,如果要进行稍微复杂一点的操作,复杂度便很可能会飙升到O(n^2),这个复杂度真的会死人的……不过链表的优点也很明显,如果程序对随机存储(也可以理解为下标式操作)的效率要求不高,那么使用链表存储数据比原创 2015-07-28 10:15:00 · 934 阅读 · 0 评论 -
步步为营(七)贪心(6)小结
贪心,递推,动态规划,这三种算法思想都是很难掌握的。因为没有死板的公式和套路的代码,只能通过日常的学习和思考,去不断加深自己对这类题目的敏感度和熟练度,提高自己的思维能力,才能对这类题目游刃有余。 深山三十年,最终习得一身的内功。眼望之处,再无敌手。贪心算法,也就是三大步: 1. 最优解情况的证明 2. 贪心策略的制订 3. 数据的预处理过程。大家如果接触过20+的贪心题目,就会发现大多原创 2015-07-24 11:17:32 · 807 阅读 · 0 评论 -
步步为营(六)贪心(5)最小区间覆盖问题
关于区间相关贪心算法的讨论,点击这里,有一份详细的资料,还有几个问题没有说到 《浅谈信息学竞赛中的区间问题》 在贪心算法的层面上,我们能够进行解决的区间覆盖,指的就是最小区间覆盖问题。 问题描述为: 给定n个区间和一个范围[a, b],选择尽量少的区间,使得[a, b]能够被完全覆盖。贪心的策略我们可以思考一下: 对于当前区间[a,b]来说,选择的下一个区间的左端点值a原创 2015-07-24 10:45:29 · 1877 阅读 · 0 评论 -
步步为营(五)贪心(4)部分背包问题
部分背包问题虽说是归于背包问题的一种,而且背包问题大多数是通过动态规划的出的结果,但是贪心算法解部分背包,不管是思想还是操作上来说,都是非常简单的。首先,我们来看一下什么叫做部分背包。 有N个商品,每个商品的重量为WI,价格为:PI,现有一个背包,最多能装M的重量. 其中(0<=I< N,0< wi<.M). 问:怎样装能使包中装入的商品价值最高(对于每个商品可以只装该商品的一部分)原创 2015-07-23 11:48:47 · 1199 阅读 · 0 评论 -
步步为营(四)贪心(3)区间选点问题
区间选点的问题大致可以描述为: 给定N个区间[a,b],取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以重复)。关于贪心算法的验证过程就不再赘述,现在思考一下贪心策略的制定。 对于区间[a1, b1] 、[a2, b2]、 [a3, b3] 来说, 如果想选择最少的点,那么必须选择每个区间的右端点,示意图如下: 当你每一次都选择区间的最右端,才能保证每一个选的点覆盖的范围都是原创 2015-07-23 10:25:28 · 1668 阅读 · 0 评论 -
步步为营(三)贪心(2)选择不相交区间
之前基本了解了贪心的基本思想,现在我们来看一下比较经典的几个贪心问题。 这篇文章讨论的是”选择不相交区间“,具体什么意思,我们同样先看一道题。题目来源:NYOJ 14 会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4(这个原创 2015-07-20 10:03:04 · 1067 阅读 · 0 评论 -
步步为营(二) 贪心(1)理论初探
等待了一年时间,这个系列的坑终于又开始填了……不说废话,直接开始正题。1.何为贪心? 贪心算法实际上指的是把问题划分成一个一个的子问题,然后针对当前的子问题,求出局部最优解,然后将子问题的最优解合并,最终获得总问题的最优解。 值得注意的是,在对问题求解时,贪心算法总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它做出的仅是在某种意义上的局部最优解。2.如何判断贪心从上面原创 2015-07-18 09:04:20 · 972 阅读 · 0 评论 -
步步为营(一) 知识架构和要点分析
打算写算法学习的系列很久了,看到网上那些大牛一个个都写了很多总结和知识点讲解,逐渐明白自己的不足主要就是在基本功上。很多算法和思路需要重新梳理才能更好的掌握和运用,正好集训还有一个月时间,够自己慢慢的把这些东西梳理完。原创 2014-07-21 21:16:12 · 1595 阅读 · 0 评论