C/C++ 数据结构与算法
文章平均质量分 92
对算法笔记的总结、以及浙大数据结构的慕课笔记
别看着我笑了
这个作者很懒,什么都没留下…
展开
-
对平衡二叉搜索树Balance Binary Search Tree所有功能的实现的头文件
最近在学计算几何,经常要用到BBST去储存一些数据,正是因为BBST查找效率极高O(logn)并且占用的空间仍是线性的,而其构造的时间需要O(nlogn),是可以接受的。所以在这里总结了BBST插入、删除、查找的功能到一个头文件中:具体实现的原理可见https://blog.csdn.net/derbi123123/article/details/104204220头文件:#include <math.h>#include <iostream>using namespace原创 2020-06-08 21:46:06 · 306 阅读 · 0 评论 -
背包问题——动态规划和暴力解决的具体分析
背包问题是这样的:关于背包问题和动态规划:背包问题的经典就在于它可以清晰的反映出递归的本质、动态规划的巧妙之处、还能让我们理解深度遍历算法。动态规划的精髓就在于任何顶点只与它相邻的顶点有关,处理一个顶点时只需要从它的相邻顶点出发,其实递归也是如此,每次出入递归函数的参数也一定是从其有关联的参数得来的。显然,对于这种问题,我们只需要从边界出发,逐阶段找到最终阶段的解。暴力解决(递归、深度优...原创 2020-02-22 18:17:06 · 593 阅读 · 0 评论 -
分别用拓扑排序和动态规划实现关键路径
关键路径:所谓关键路径,就是例如工程的进展顺序问题,为了合理地安排和调度各活动,这样我们就可以用拓扑排序把每件事的先后顺序理出来。我们来看一个例子:每个活动的最早完成时间就是直接相邻的之前活动中最晚的的最早完成时间加上二者持续时间。所谓机动时间就是在每个顶点的最晚完成时间与最早完成时间的差值,也就是这个工程因为其他工程的工期较长而目的地又相同,可以等一等再做。首先我们来看,这个工程图中在...原创 2020-02-21 12:56:50 · 1584 阅读 · 0 评论 -
十大排序算法的实现以及各自的优缺点、适用情况
学习排序算法的体会:也许在一些题目中我们可以轻松地用STL库中的函数或者容器实现我们排序的需求,但在实际问题中,数据往往会很大要考虑时间空间复杂度,而排序的因素也可能很多,不仅仅是STL库能够解决的,所以我们在排序时不能仅仅考虑写着方便,还应该考虑程序的效率和内存问题。我们有必要熟悉各种排序算法的实现以及他们的优缺点。在说这些排序算法之前,我们先来看看真香的sort库函数究竟是由什么算法实现的...原创 2020-02-15 18:39:57 · 14481 阅读 · 1 评论 -
拓扑排序
拓扑排序的定义及实现:拓扑序: 如果图中从v到w有一条有向路径,则v一定排在w之前,满足此条件的顶点序列称为一个拓扑序,说白了就是想要做w就必须先做v,就像是流程图。拓扑排序就是获得拓扑序的过程。显然要想获得合理的拓扑序,就必须是有向无环图,因为如果存在无(双)向边就不符合v一定要在w之前做,而有环会让顶点存在循环无先后顺序。思路:找到所有度为0的顶点(也就是没有顶点指向它的顶点,也就是...原创 2020-02-14 12:53:39 · 259 阅读 · 0 评论 -
最小生成树的实现:prim算法&&kruskal算法
最小生成树的概念:首先我们来看生成树的概念:这是一个相对于有N个顶点的图的概念,说白了就是从一个顶点出发,经过N-1条边能够实现所有顶点的连通(遍历N个顶点),因为得到的结构与树相同(N个顶点N-1条边),故称为图的生成树。我认为生成树和图的最大区别就在于生成树不会有回路,例:由第一个图可以生成这些生成树,显然,一个图中可以有多个生成树,并且从不同的顶点出发,可以得到不同的生成树。当然,这...原创 2020-02-13 21:45:58 · 269 阅读 · 0 评论 -
最短路径问题:Dijkstra算法、Floyd算法、Bellman-Ford算法和SPFA算法
最短路径问题就是在网络中,让我们求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径,对于不同种类的图和我们我们分为以下几种情况:(1)单源最短路径:从固定源点出发,求其到所有其他顶点的最短路径。(2)多源最短路径:任意两顶点间的最短路径。(3)无权图的最短路径:就是经过边个数最少(也是经过顶点数最少的)的路径,边的个数(顶点数-1)即为最短路径长度。(4)有权图的最短路径:...原创 2020-02-11 20:54:55 · 314 阅读 · 0 评论 -
图的定义、表示、基本操作的实现、遍历
1.什么是图?表示多对多的关系。包含:(1)一组顶点:V(vertex)在线性表中我们称数据对象为元素;在树中称之为结点;在图中就称之为顶点。线性表和树可以有没有数据对象的空表和空树,但空图必须至少有一个顶点,边可以没有。(2)一组边:E(edge)(3)边还可能有权重:代表一些必要信息。当然,顶点也可能有数据。图的相关术语:顶点的度:指与该顶点相连的边的个数,又分为入度和出度,入...原创 2020-02-09 21:31:14 · 982 阅读 · 0 评论 -
哈夫曼树的原理、实现、特点与哈夫曼编码
1.哈夫曼树的定义:什么是哈夫曼树?又称为最优二叉树,是带权路径长度之和最小的二叉树。带权路径长度之和又是什么?设二叉树有n个叶子结点,每个叶子结点的权重为Wk,从根节点到每个叶子结点的长度为Ik,则所有叶子结点带权路径长度( Wk * Ik)的和为该树的带权路径长度之和(WPL)。WPL = ∑nk=1 Wk * Ik;这些只是概念上的东西,所谓带权路径长度之和最小不过就是为了让经...原创 2020-02-08 23:10:25 · 7130 阅读 · 0 评论 -
堆的基本操作的实现
什么是堆?是一种特殊的“队列”,取出元素的顺序依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。堆的特性:(1)结构特性:用数组表示的完全二叉树;(2)有序性:任一结点的关键字是其子树所有结点的最大值或最小值(对应最大堆、最小堆)。故对堆进行操作时一定不能破坏这两特性。堆的基本操作:#define MaxData 。。。//建议设一个堆的最大元素值作为哨兵,在对堆进行操作...原创 2020-02-08 13:57:27 · 508 阅读 · 0 评论 -
并查集及按秩归并和路径压缩
我理解的并查集:其实并查集就是用数组或结构数组静态的表示内部相互联系的集合吧,类似于树。看个简单的例子:可以看出,5的父节点是2,所以S[5]=2,原理就是用s[data]=parent类似树的形式让子元素的数组值等于其父元素来建立起元素之间的联系,根节点的数组值为-1。查找与联合(并)的实现:SetType S[maxsize];ElementType Find(SetType S,...原创 2020-02-07 12:46:40 · 285 阅读 · 0 评论 -
平衡二叉树插入操作的原理及实现
在二叉搜索树中我们知道在删除操作中如果一直用一侧的树来代替删除的父节点就会出现一侧子树过高和一侧子树过低,同样,对于一个这样不平衡的树,再进行二叉搜索树的相关操作时就会降低程序的效率。所以平衡二叉树就应需求而生了,他是左右子树高度差不超过1的二叉搜索树,这样就会使树更对称。关于平衡二叉树的一些概念:平衡因子(Balance Factor):左右子树高度差的绝对值(BF(T) = | hl -...原创 2020-02-07 09:43:29 · 3667 阅读 · 3 评论 -
二叉搜索树主要操作的实现以及其特殊性质的应用
二叉搜索树(Binary Search Tree) 其实就是二叉树加上一个条件:对于二叉树内的每个父节点及其左右子节点,都必须符合左子节点小于父节点,右子节点大于父节点。typedef struct node *BST;struct node{ ElementType data; BST left; BST right;};1.查找元素X:因为非递归函数执行效率更高,所以我们用...原创 2020-02-06 14:06:18 · 168 阅读 · 0 评论 -
二叉树的实现、主要操作以及二叉树的遍历
二叉树的定义:二叉树是每个结点最多有两个子树的树结构。二叉树的重要性质:对于任何非空二叉树,n0表示叶子结点数,n1表示度为1的结点数,n2表示度为2的结点数,满足关系n0=n2+1。二叉树的实现、主要操作typedef struct node *tree;struct node{ ElementType data; *tree left; *tree right;};(1...原创 2020-02-05 23:08:13 · 237 阅读 · 0 评论 -
深度优先算法与广度优先算法的理解与常用场景
深度优先算法:我的理解就像走迷宫,每次遇到岔道口就要选一条路来走,每次遇到死胡同就要原路返回找到上一个路口选择其他的路,直到找到出口,显然最坏的情况是遍历完所有的道路后才找到出路,适用于在一个大整体内找一个达到某种条件或者最优的小整体,最优就必须要遍历完所有组合方案才能找到最优的。这就是深度优先算法。通过两个例子(也是常用场景)来理解:(1)有n件物品,每个物品的重量为w[i],对应价格c...原创 2020-02-05 17:12:47 · 4821 阅读 · 1 评论 -
线性表的实现与链表的操作
链表真的麻烦但是真正学会了它其他的数据结构也会迎刃而解。。。1.线性表用动态链表实现的操作:typedef struct LNode *list;struct LNode{ ELementType data;//ELementType是数据类型的概括 list next;}list ptrl;//链表头指针(1)创建空链表:list create( ){ list ptr...原创 2020-02-04 11:50:05 · 410 阅读 · 0 评论