算法笔记
文章平均质量分 91
瓦耶_
计算机专业本科在读
展开
-
拓扑排序(算法笔记)
拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中u一定在v前面。这个序列又被称为拓扑序列。原创 2023-05-03 20:00:13 · 795 阅读 · 0 评论 -
关键路径(算法笔记)
AOE中的最长路径即为**关键路径**,关键路径上的活动被称为关键活动。原创 2023-05-02 23:07:24 · 5744 阅读 · 1 评论 -
最小生成树(MST)(最小连通子图)(算法笔记)
最小生成树是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G的所有顶点,且所有边都是来自图G的边,并且满足整棵树的边权之和最小。从定义来看,就是要求一个连通方案,使其可以从任一点出发到达连通图的任一点,且这个方案的边权之和需要最小,即求最小连通子图。原创 2023-04-26 17:17:06 · 3179 阅读 · 0 评论 -
哈夫曼树(算法笔记)
已知n个数,寻找树的所有叶子结点的权值恰好为这n个数,并且使得这棵树的带权路径长度最小。带权路径长度最小的树被称为哈夫曼树(又称为最优二叉树),对同一组叶子结点,哈夫曼树形态不唯一,但其最小带权路径长度唯一原创 2023-04-18 18:41:12 · 1331 阅读 · 0 评论 -
堆(算法笔记)
堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。其中,如果父亲结点的值大于或等于孩子结点的值,那么称这样的堆为大顶堆,这时每个结点的值都是以它为根结点的子树的最大值:如果父亲结点的值小于或等于孩子结点的值,那么称这样的堆为小顶堆,这时每个结点的值都是以它为根结点的子树的最小值。堆一股用于优先队列的实现,而优先队列默认情况下使用的是大顶堆。原创 2023-04-17 14:28:50 · 133 阅读 · 0 评论 -
并查集(算法笔记)
并查集是一种维护集合的数据结构,用于处理一些不相交集合的合并及查询问题在数据结构中的作用就是判断图中两点的连通性是一种空间换时间的算法,比搜索来的要更快。构建完成的并查集从其数据结构上来说是树。1.并查集支持下面两个操作:(1)合并:合并两个集合(2)查找:判断两个元素是否在一个集合2.并查集的实现:并查集通过数组来实现,在数组中散列某结点的父亲节点,形成一个记录父亲结点的静态链表,通过判断父系关系来表示元素所属的集,类似反向遍历的树。原创 2023-04-13 16:51:20 · 727 阅读 · 0 评论 -
平衡二叉树(AVL树)(算法笔记)
在上一节中,我们认识到了如果已知序列是一个有序序列,那么生成的BST将是一条链,查找的复杂度会达到O(n),这样就无法实现BST对数据查询优化的目的。所以AVL树就诞生了,其目的是为了使BST的高度在每次插入元素后仍然能保持O(logn)的级别,在建立BST的过程中,通过增加平衡调整功能,使任意结点的左子树和右子树的高度之差的绝对值不超过1,其中左子树与右子树的高度之差称为该结点的平衡因子。原创 2023-04-12 19:49:43 · 318 阅读 · 0 评论 -
二叉查找树(BST)(算法笔记)
数据结构的目的是用来优化数据的使用效率,这是数据结构的本质。二叉查找树是一种特殊形态的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。对树上的每个节点,都满足其左子树上所有结点的数据域均小于或等于根节点的数据域,右子树上所有结点的数据域均大于根结点的数据域。单独使用一颗普通的二叉树对提高数据使用效率没有太大帮助,因为普通二叉树数据之间不存在明显的逻辑联系,在进行插入时,无法提供性质满足插入位置的确定,即插入位置的选择完全是随机的,所以并不会直接考察普通二叉树的插入和删除操作。原创 2023-04-10 15:29:17 · 904 阅读 · 0 评论 -
图的定义、存储及遍历(算法笔记)
图,直观来理解就是地图,是一种逻辑结构为非线性的数据结构,是一种多对多的数据结构,每一个顶点都可以作为起点和终点,将图拆分开就是由若干棵树构成的森林。1.图的定义:图由顶点和边构成,每条边的两个端点必须是图的两个顶点,采用G(V,E)表示图G的顶点集为V、边集为E。一般来说,图可分为有向图和无向图。有向图的所有边都有方向,即确定了顶点到顶点的一个指向:而无向图的所有边都是双向的,即无向边所连接的两个顶点可以互相到达。原创 2023-04-06 11:25:08 · 755 阅读 · 0 评论 -
一般树的遍历(算法笔记)
本节讨论的“树”是指一般意义上的树,即子结点个数不限且子结点没有先后次序的树,而不是上文中讨论的二叉树。首先来回顾二叉树的结点的定义,可以注意到它是由数据域和指针域组成的,其中左指针域指向左子树根结点的地址,右指针域指向右子树根结点的地址。借鉴这种定义方法,对一棵一般意义的树来说,可以仍然保留其数据域的含义,而令指针域存放其所有子结点的地址(或者为其开一个数组,存放所有子结点的地址)。不过这听起来有点麻烦,所以还是建议在考试中使用其静态写法,也就是用数组下标来代替所谓的地址。但这样可能会导致内存使用超过题原创 2023-04-03 20:08:56 · 650 阅读 · 0 评论 -
二叉树(算法笔记)
现实中的树是由树根、茎干、树枝、树叶组成的,树的营养是由树根出发、通过茎干与树枝来不断传递,最终到达树叶的。在数据结构中,树则是用来概括这种传递关系的一种数据结构。为了简化,数据结构中把树枝分叉处、树叶、树根抽象为结点(node),其中树根抽象为根结点(root),且对一棵树来说最多存在一个根结点:把树叶概括为叶子结点(leaf),且叶子结点不再延伸出新的结点;把茎干和树枝统一抽象为边(edge),且一条边只用来连接两个结点(一个端点一个)。这样,树就被定义为由若干个结点和若干条边组成的数据结构,且在树中的原创 2023-04-03 10:21:15 · 399 阅读 · 0 评论 -
最长不下降子序列(LIS)最长公共子序列(LCS)
当前状态记录了历史信息,一旦当前状态确定,就不会再改变,且未来的决策只能在已有的一个或若干个状态的基础进行,历史信息只能通过已有的状态去影响末来的决策。对动态规划可解的问题来说,总会有很多设计状态的方式,但并不是所有状态都具有无后效性,因此必须设计一个拥有无后效性的状态以及相应的状态转移方程,否则动态规划就没有办法得到正确结果。不论是递归还是递推,动态规划的核心永远是状态转移方程,状态转移方程的内涵包括了重叠子问题的存储以及最优子结构的构建。原创 2023-03-28 15:28:54 · 285 阅读 · 0 评论 -
动态规划(DP)(算法笔记)
动态规划(Dynamic Programming,DP)是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。需要注意的是,动态规划会将每个求解过的子向题的解记录下来,这样当下一次碰到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算。注意:虽然动态规划采用这种方式来提高计算效率,但不能说这种做法就是动态规划的核心。原创 2023-03-27 15:19:00 · 2937 阅读 · 0 评论 -
动态规划总结练习(算法笔记)
5道比较简单的动态规划原创 2023-03-30 23:12:32 · 254 阅读 · 0 评论 -
广度优先搜索(BFS)(算法笔记)
深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“广度”作为前进的关键词,采用队列实现。广度优先搜索属于搜索问题的一种,当问题可以被描述为“路径搜索”时,就可以采用搜素问题的所有解的方式来进行解决,所以BFS本质还是暴力。广搜也存在“岔道口”,只是当遇到“岔道口”时,需要将本层所有的岔道都走一遍,然后再走下一层的岔道,符合队列的“先进先出”思想。广搜和深搜的共同点之一是只有一个起点,也就是说一次搜索只能遍历以一个点为起点的所有路径。而BFS更适合需要搜索最优解的问题,原创 2023-03-23 22:37:43 · 2557 阅读 · 1 评论 -
深度优先搜索(DFS)(算法笔记)
深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“深度”作为前进的关键词。实现方式是有很多,最常见的是递归。深度优先搜索属于搜索问题的一种,当问题可以被描述为“路径搜索”时,就可以采用搜素问题的所有解的方式来进行解决,所以DFS本质还是暴力。深度搜索具有两个关键词,即“岔道口”和“死胡同”,这两个词来源于迷宫问题,这也是搜索问题最原始的表现。当碰到岔道口时,总是以“深度”作为前进的关键词,不碰到死胡同就不回头,因此被称为“深搜”。原创 2023-03-22 10:58:14 · 9568 阅读 · 1 评论