Algrithm
宋霖轩
已搬迁cnblog
展开
-
Huffman树
这几天重新把Huffman树重新捡了起来,发现了以前一个从来没有注意到的点:Huffman树的结构问题。 Huffman树并不是一个单边节点很多的一个二叉树,而是一个任意结构的二叉树,其构造结果和初始的权重值很有关系,这是以前从来没注意到的。 其次,在写代码中也注意到,寻找数组中以寻求两个索引较小的值的时候,需要注意索引大小和次序上的排列,最后,遍历Hufman树并且进...原创 2018-05-15 08:48:02 · 168 阅读 · 0 评论 -
关于Bellman-Ford算法的个人理解
坦白而言,这一次学习确实比原来更深入不少,对于算法的内容和大致执行的流程也有了一个更深入的了解;Bellman-Ford算法也是最短路径生成算法,但是其和迪杰斯特拉算法不一样的是可以进行负权值路径的判别。而迪杰斯特拉算法所使用的前提条件之一就是不能出现负权值路径。其实从这个算法收获的有两个东西:1.算法本身的思路,和迪杰斯特拉不同;2.负权值路径和负权值回路会出现什么样的问题;...原创 2019-01-25 18:08:05 · 5840 阅读 · 0 评论 -
关于kruskal算法的一些个人理解
在图论中最小生成树算法中,除了常用的Prim算法之外,还有kruskal算法,该算法也是贪心的思想。如果说Prim算法是贪心策略是选取当前距离集合最小的边,而kruskal算法的策略测试选择所有边中最小的边,这点和最短路径中的Bellman算法有异曲同工之妙。详细的判定流程和方法也很简单:首先要明确的是,选取的边的两个节点都是所谓的“连通量”;所谓连通量和prim算法中的集合大致意义相...原创 2019-01-26 21:09:14 · 753 阅读 · 0 评论 -
关于拓扑排序的一些个人理解
拓扑排序首先针对的是有向无环图,其主要的目的是将一个有向图变为一个线性序列,就像任务排序那样的感觉。对于任何任务,必然先要完成其先导任务,对于同等级的任务,就可以随意进行排序处理,当是一个正常可完成的无环图,必然可以使得生成一个同节点个数的线性序列;对于拓扑排序,核心的步骤要借助队列进行;首先,根据我们的观察,一个可以进行拓扑排序的图必然存在入度为0的点,这也是我们必须要先进行处理的点。第...原创 2019-01-26 22:08:09 · 513 阅读 · 0 评论 -
关于最长路径的一些个人理解
最短路径我已经学习了两种经典解法,对于最长路径来说,思想跟简单,直接权值*-1,转化为寻找最短路径问题就可以了;唯一值得注意的就是不能采用迪杰斯特拉算法,而应该采用Bllman-Ford类型算法,此时,负环判断的条件也变成了出现正环则不能进行路径生成。...原创 2019-01-27 13:11:25 · 712 阅读 · 0 评论 -
关于关键路径的一些个人理解
在之前的一篇文章,提到了拓扑排序的相关概念,其实拓扑排序所操作的对象类型就是AOV网。先介绍一下AOV网和AOE网的相关概念:AOV网,也就是顶点活动,就是前面文章所阐述的一种有向无环图。其节点代表活动,使用边来代表节点之间的序列关系;AOE网,也就是边活动,其用边来代表具体的活动,并且用定点代表事件,其中边权代表完成活动的时间。这里要区分事件和活动这一概念。这里的事件更像是一种标志,...原创 2019-01-27 16:35:58 · 2100 阅读 · 0 评论 -
基础排序——选择排序
最简单的一种排序,也是最简单的一种排序。本质上对一个数组内的逐个子区间进行操作,将最小的元素放在第一位。子区间由范围位i~n,其中i每次循环自增;代码如下:#include<cstdio>#include<iostream>#include<vector>#include<stdlib.h>using namespace std...原创 2019-01-16 21:24:03 · 185 阅读 · 0 评论 -
基础排序——直接插入排序
插入排序也是一种简单的排序方法,这里只介绍直接插入排序。直接插入排序的思想为:在数组的前端确立一个0~i的有序序列,将i+1位元素插入之前的有序序列,使得新的0~i+1序列有序,并进行下一步的迭代。对于第一次操作,是将数组中的第0位作为有序序列,从而进行插入排序操作。所以,n次操作,进行n-1次排序操作。具体流程如上图所示;具体代码如下所示:#include<cstdi...原创 2019-01-16 22:05:22 · 193 阅读 · 0 评论 -
关于DFS的一些个人理解
之前用DFS可能最多的就是树类问题,但是随着最近图论的深入,看了看相关的问题,发现问题并不局限于此;由于之前接触过动态规划还有贪心算法,突然发现DFS和动态规划貌似有点类似,之前个人感觉可能不同的点在于两点:1.动态规划有相关的状态转移方程,定下边界之后,就严格的按照状态转移方程来进行解决;2.动态规划具有重叠子问题,进行逐步的计算,用小问题的解解决大问题。但是个人感觉,DFS貌似也有...原创 2019-02-01 18:12:21 · 958 阅读 · 0 评论 -
动态链表/静态链表
链表也是一类老生常谈的问题,以前也学习过,没什么比较新鲜的东西,所以这里提及一下静态链表和动态链表的概念区分;所谓动态链表就是使用人工操作方式使得一个个Node节点指向下一个节点,其每个节点中的连接方式使用的是指针连接;而静态链表使用的方式是构造一个数组,其数组元素就是一个个节点,节点的前驱后继关系使用索引的方式。构造方式大致如下:struct Node{ typenam...原创 2019-01-28 14:49:25 · 239 阅读 · 0 评论 -
关于Prim算法的个人理解
既然接触了最短路径算法,也就肯定会接触最小生成树中的Prim算法。Prime算法主要是来从一个无向图(注意,是无向图)来生成一个权值和最小的最小生成树(一定无环),最小生成树当然权值和唯一但是生成树的结构不唯一。Prim算法的主体构造和迪杰斯特拉算法极其相似,并且采用的都是贪心思想,也就是在选取当前最小的权值边,加入该边对应的节点,从而进行构造;其主要的思路和流程如下所示:对于主体来说...原创 2019-01-25 17:44:41 · 2084 阅读 · 1 评论 -
关于图论中Dijkstra算法的一些个人理解
迪杰斯特拉自己也不知道重新复习过多少次了,借着刷题的机会总结一下基础的知识点和思路;一、算法的基本思路:Dijkstra目的是求最短路径的一个算法,在借助更新权值数组的手段,来进行n次迭代,使得借助权值数组的更新来逐步生成和寻找一个最短路径。其大体的思路如下:如上图所示(图片转载)。对于算法主体,我们有n次迭代,每次迭代的内容都是相同的,就是更新权值数组。更新权值数组的意思...原创 2019-01-24 16:50:15 · 622 阅读 · 0 评论 -
关于动态规划的一些个人学习和看法
以前一直只是接触过动态规划相关的内容,但是从未系统学习过,所以这一次来做一个系统的总结。 一、概述动态规划和递归,分治思想,贪心类似,但是又不同。动态规划之所以特殊不同,是因为所有可以使用动态规划解决的问题都会涉及到两个特点:1.具有重叠子问题;2.具有最优子结构;所谓重叠子问题,就是指在能够将整个大问题进行整体性分割之后,小问题可以互相联系和互相解决。这是和分治思想最...原创 2018-12-12 16:40:20 · 272 阅读 · 0 评论 -
关于堆的基本定义和操作的个人理解
一、堆的基本定义和概念:堆说白了也并不是什么高大上的东西,其本质建立在完全二叉树的基础之上。对于堆来说,最主要的一点就是对于任何一个子树来说,其对应的根节点必大于该子树的任何子节点。总而我们可以在堆的基础上进行各种建堆和排序操作,例如堆排序。二、堆的基本操作和数据结构:堆的基本数据结构采用数组来保存,且为一维数组,所有的操作都建立在一维数组之上;const int m...原创 2018-12-20 17:13:11 · 423 阅读 · 0 评论 -
关于平衡二叉树的一些个人理解
一、平衡二叉树的定义和概念:平衡二叉树的概念基于先前学习的查找二叉树的概念。之前提到过,由于查找二叉树存在建树或者删除节点顺序的的问题,会导致链式二叉树的存在。这样查找的时间复杂对就会变为O(n)。而为了让时间复杂度仍然保持O(logn)级别,所以加上了平衡的要求,这样的查找二叉树被称为平衡二叉树,英文缩写为AVL树;二、平衡二叉树的数据结构:平衡二叉树附加了一个平衡因子,用于衡量...原创 2019-02-12 15:08:56 · 559 阅读 · 0 评论 -
动态规划——背包问题
背包问题在以前的时候自己也听过,今天做一下基本的总结;背包问题目前接触的有两种——01背包问题和完全背包问题;一、01背包问题:题目描述如下:有n件物品,每件物品的重量为w[i],价值为c[i],现有一个容量为V的背包,问如何选取物品入背包,使得背包中的物品总价值最大,其中每一个物品都只有一件。样例:n=5 v=83 5 1 2 2 ——w[i]4 5 2 1 3 ——...原创 2018-12-16 14:45:56 · 319 阅读 · 0 评论 -
关于树基本的概念和操作(基础)
关于树已经算接触的很多了,但是从来没有做过一个系统的总结,总是学完忘忘了学,为此做一个基本的总结。首先,对于基本的树结构来说,有几个名词还是值得注意的,例如深度,层次空树等,对于一些基本的理论内容,本次总结不再赘述,后续另开一章总结,本次总结主要以思想和代码为主。一、二叉树的存储和基本操作对于二叉树来演,最基本的还是其存储结构和基本操作。对于二叉树的基本存储结构,就采用一个简单的结...原创 2018-12-17 15:18:30 · 360 阅读 · 0 评论 -
二叉查找树 (BST)
一、二叉查找树的基本定义:以前刷题接触过二叉查找树,这次做一个基础的总结。所谓二叉查找树,就是一棵有序的二叉树(该树可以为空)。对于任意一个节点,如果该节点有左子树或者右子树,对于左子树上的所有节点,其值(称为数据域)都小于该节点;该节点的右子树上的所有值(称为数据域)也都大于该节点。如下图所示。对于二叉查找树来说,其本身为二叉树的变种,所以同样可以对二叉查找树进行相应的构建和...原创 2018-12-17 16:42:26 · 331 阅读 · 0 评论 -
关于并查集的一些基础总结
一、并查集的基本概念:初次见并查集,并不知道这个东西是干嘛的。。只是觉得为什么合并和进行集合操作要用这么复杂的东西,后续才体会到他的经典用处。并查集主要支持两个操作:其一,合并:进行两个集合的合并;其二,查找:判断两个元素是否在一个集合;并查集的基础结构为一个数组,所有操作也都是基于这个数组来实现的。这个一维数组内存放的是一个或多个树形结构,数组的下标代表树中的元素序号,对应内...原创 2018-12-18 17:53:13 · 199 阅读 · 0 评论 -
转载——常见的OJ输出信息
Wrong Answer:你的程序运行的结果和正确结果不同。状态页面CASE那一览显示的是你的程序在第几个样例上出错的。 Time Limit Exceeded:你的程序运行时间太长了,超过了对应题目的时间限制。 Memory Limit Exceeded:你的程序运行所用的内存太多了,超过了对应题目的限制。 Output Limit Exceeded:你的程序输出了太多的...转载 2019-01-17 20:04:52 · 424 阅读 · 0 评论 -
关于贪心算法的一些个人学习(基础)
之前接触过背包问题和动态规划,对贪心算法和其区别做过相关的总结,即便如此,遇到这一类问题还是稍微有点懵逼,所以本文的主旨在于阐述贪心算法中简单贪心的一些基本概念以及和动态规划的具体区别。一、简单贪心的基础概念:贪心算法就是求解一类最优化问题的方法,其主要考虑当前情况下局部状态的最优解,从而使得全局结果达到最优。对于简单贪心的证明,我们可以使用反证法和数学归纳法给予证明,这里不做过多阐述。在...原创 2019-01-17 22:03:34 · 369 阅读 · 0 评论 -
关于BFS广度优先搜索的一些个人理解
对于BFS,其实相比之下比DFS更加简单一些。如果说DFS是为了走出一条最深的路径,那么BFS就是更像是为了层层扩张来达到访问所有节点的目的,例如树中的层序遍历,也可以认为是一种BFS;BFS更像是逐层扩散的过程,所以BFS不需要回溯,所以也就不需要递归,更多的实现方式是利用队列,来进行层序输出;之前刷题中,也利用过队列进行过BFS的逐层访问,来记录树的层数,其实现在想想,利用DFS更直观...原创 2019-02-02 20:15:32 · 402 阅读 · 0 评论