随笔分类 - 复习心得和材料
课程考试复习的时候一些新的记录和课件的截图
摘要:堆的应用范围也比较广泛,经常游走在各种面试题目之前,不论算法设计的题目还是海量数据处理的题目,经常能看到这种数据结构的身影。堆其实就是一个完全二叉树的结构,经常利用数组来实现。包含最大堆和最小堆两种。最大堆的性质:针对每个根节点,其节点值大于其后继节点。最小堆的性质:针对每个根节点,其节点值小于...
阅读全文
摘要:1.判断是个二叉树是不是平衡二叉树。 二叉树的定义都是利用递归的方法,所以二叉树有着天然的递归属性。所以一般情况下,递归解决二叉树问题中,递归解法比较简洁。平衡二叉树的定义是左子树和右子树均是平衡二叉树,并且左子树和右子树的高度差不超过1,三个条件缺一不可。 根据递归的定义,递归实现起来需要返回...
阅读全文
摘要:今天在某个群中看到有人问在流式的数据中如何动态的维护中位数的方法,因为之前看到同学的一个问题,当时他没答出来。但是后来了解到类似top(k),last(k)需要用到最大堆,最小堆一样,中位数需要利用双堆维护一下。 先复习一下,如果是静态的数据求取中位数的方法有哪些呢? (1)排序 ...
阅读全文
摘要:今天学习到二叉树的时候,看到了二叉树的先序,后序,中序遍历方法。然而二叉树遍历方法递归实现十分简单,迭代版本实现起来些许复杂,就又上手试试二叉树的各种遍历方法以及实现版本,当是温习一遍之前了解到的实现方法。 三种遍历方法中递归实现难度相当,代码相当简略。 三种遍历方法中利用栈实现的迭代版本中...
阅读全文
摘要:堆在实现优先队列中经常用到,这里介绍3种堆的设计原理以及时间复杂度分析:具体的实现及原理待续,
阅读全文
摘要:贪心算法应该算是动态规划中的一种特例~如果一个事例满足贪心选择性质和最优子结构性质,则可以利用贪心算法,每一步可以做出局部最优的选择,因为具有贪心选择性质,又因为具有最优子结构,所以每次的局部最优选择能够达到全局的最优,所以最优就是一个全局的最优解~ 接下来贴一下课件的说明,考试结束了,心情很放松,有空补充一些具体问题的实现代码。 接下来通过一个活动选择问题的描述体会一下贪心算法与动态规划之间的关系。问题描述动态规划解决方案:跟据上面的递归式,可知至少是一个O(n2)的算法,因为内层的k的循环为1至n,外层循环为1至n,所以猜测下届至少是这个复杂度。贪心解决方案:理论基础:
阅读全文
摘要:由于要考试了,这里只是简单的罗列一下,考试完毕之后继续完善~单元最短路径单元最短路径有很多变体问题,比如单元目的最短路径,最短路径也有很多性质~,这些性质是算法正确性的基础,这些考试之后来完善,关于每个算法都要用到的松弛操作如下RELAX(u,v,w) if d[v] > d[u]+w(u,v) d[v]= d[u]+w(u,v) father[v]=u关于每个算法的初始化操作也写在前面INITIALIZE-SINGLE-SOURCE(G,s) for each vertex v in G d[v]= MAX fath...
阅读全文
摘要:这篇只是作为学习笔记之用,记录复习中的一些知识,算法设计也均是伪代码表示,如果你想要找代码实现就不必看这些内容了,不过如果想要简单回顾一下相关知识还是可以浏览一下的。如果时间不仓促每个算法实现一下还是挺好的,不过这都是考试结束之后的事情了~图的分类 图分为有向图和无向图,两种都可以表示为G={V,E},分别是顶点和边,有向无向均是针对边来说的。 下面的lgE=lgV是同一个数量级的这个在最小生成树算法的算法复杂度分析中比较重要,所以这里罗列出来。 图的两种表示方法图的表示方法有两种,邻接链表和邻接矩阵: 邻接链表有一个握手定理,就是遍历邻接表中所有点的邻接点,在无向图中需要2E次,有向图中需.
阅读全文
摘要:前面介绍了一个比较常用的算法设计技术,分治法,当碰到一个实际的问题时,看能够利用分治法解决,分治法适应于解决子问题独立且不重叠的,但是如果子问题出现重叠就不利用分治法了。这里介绍另外一种算法设计方法,动态规划,这种算法设计方法虽然基本思想和分治法很相似,划分子问题,通过子问题解决更高层的问题。但是两者明显的区别在于动态规划划分的子问题具有重叠的性质(不过独立性还是要保证的),而且一般用于解决最优化的问题~ 动态规划算法的解决步骤:1、我认为首先比较重要的还是正确的抽象化问题,然后得到问题的最优子结构。有一部分题目的描述方式完全是文字化的描述,这时就先抽象出其中的数学结构,然后根据数学结构得出.
阅读全文
摘要:选择问题定义,实际上所有处理均可以推广到集合中包含重复数值的情形。 输入:一个包含n个(不同的)数的集合A和一个数i,1<=i<=n。 输出:元素x属于A,它恰大于A中其他的i-1个元素。1、最大值最小值 针对一个序列取得最大和最小值均需要n-1次比较。这是一个下限,确定最大值或者最小值的算法可以看作各个元素之间一场锦标赛,每次比较都是一场比赛,两个元素中较小的或者较大的获胜,除了最终的最大值和最小值,所有其他元素都需要输一次,所以n-1次是必须的。 接下来是一些比较有意思的问题,比如同时找出最小值和最大值,当然可以n-1次比较找出最大值,然后n-2次比较找出最小值,不过还是有比这
阅读全文
摘要:算法要考试了,复习到了排序的知识,所以对复习的内容进行以下总结,参考书目《算法导论》。排序问题是算法与数据结构中常讲到的问题了,有次面试问到了具体的快速排序的原理以及实现,顿时当时就愣了,平时各种语言提供的类库中都有实现好的快速排序算法,针对这个算法原理也就没有在意;不过这次算法课程结束了感觉算法内容还是挺重要的,不过参考算法导论的话真的学了好多数学知识,也被许多数学知识给吓住了,算法导论一书重点不在于算法的实践,经典的算法只是给出了伪代码,然后大量的篇幅进行正确性证明,复杂度分析,胡言乱语一番,接下来具体算法的介绍啦。1、插入排序插入排序的原理是访问过的部分是有序的,不过只记住原理有时候是.
阅读全文
摘要:递归分析一般利用的方法是主定理,辅助的方法有替换法,递归树方法~主定理:递归树:主定理的证明可以通过递归树的方法进行;主定理适用的范围比较局限,有些情况不能被包括,这些情况就需要利用递归树的方法了,主定理的case1是f(n)小于nlogba多项式时间,原定理描述为f(n)=O(nlogba-ε)且ε>0,它与case2中f(n)=Θ(nlogba)中间差一些情况,就是f(n)小于nlogba,但是多余的不是多项式时间;另外就是case2和case3之间相差的部分,就是f(n)大于nlogba,但是如果不大于多项式时间,就不能满足主定理了;另外一种是case3中的f(n)不满足后面的情况
阅读全文
摘要:这里的想说的NPC不是Non-Player-Controled,非玩家控制角色,而是Non-determinisitc Polynomial complete problem,它属于一类很特殊的问题,迄今为止,没有人能够找出求解NPC问题的多项式时间的算法,同时也没有人能够证明对于这类问题不存在多项式时间算法; 最短(Bellman -Ford)与最长简单路径,欧拉游程(Fleury)和哈密顿回路,2-CNF可满足性和3-CNF可满足性,这些问题看起来差别很小,但是成对的问题中前者存在多项式时间的算法,而后者属于NPC问题,不存在多项式时间的算法;其实算法中关于这个问题的研究感觉也仅仅存在理.
阅读全文
摘要:KMP算法,以为一个简简单单的算法,看了我一天时间竟然没有看懂...果然图样图撕破了,三位大师提出的算法岂是我等屌丝能够迅速的理解的?不过话说看了这次算法才知自己的智力有多么的吃紧,还是要努力学习呀~智力不行就要加把劲了。(接下来字符串匹配算法均参考算法导论) 字符串匹配,算法的模型不用提出大家都知道,仅仅是在文本T字符串中精确匹配模式串P,简简单单,轻轻松松的就知道这么一个模型,自然而然的能够想到一个最笨最实用的算法,朴素算法,朴素算法就是逐个比对,然后在文本串中下移一位在进行逐个比对,算法复杂度O((n-m+1)m), 不过这种简单的方法的时间复杂度不是我们能够容忍的,提高一点有一...
阅读全文