
==== 数据结构与算法 ====
文章平均质量分 92
Wayward:)
此人貌似不太懒,写了点东西~
展开
-
五大常用算法入门(三)——回溯算法
文章目录1. 写在前面2. 例子引入3. 正式定义1. 写在前面在正式介绍回溯算法的时候,我们先来回顾一下之前写的解答树的例子。1.1 排列树如果要生成 1−n1-n1−n 的所有排列或者要生成含有 nnn 个元素集合的一个排列,则我们会构造一棵排列树,例如当 n=3n=3n=3 时:我们能得到 3!=3∗2∗1=63!=3*2*1=63!=3∗2∗1=6个叶子结点,每个叶子结点代表一...原创 2019-10-18 10:27:54 · 1037 阅读 · 0 评论 -
五大常用算法入门(一)——贪心算法
文章目录1.贪心算法简介1.1 基本定义1.2 贪心算法案例3.贪心算法的基本思路2.贪心算法最优性证明2.1 贪心算法的前提2.2 最优子结构2.3 贪心算法与动态规划的区别3.贪心算法的经典问题3.1 近似解3.2 最优解参考资料1.贪心算法简介1.1 基本定义在贪婪算法(greedy method) 中,我们要逐步构造一个最优解。每一步,我们都在一定的标准下,做出一个最优决策。做出决策...原创 2019-10-18 10:28:17 · 20728 阅读 · 10 评论 -
五大常用算法入门(二)——动态规划
文章目录1.动态规划算法简介1.1 基本定义1.2 问题的特征1.3 求解步骤2.动态规划的经典问题2.1 0-1背包问题2.1.1 问题描述2.1.2 问题状态的描述2.1.3 动态规划递归方程2.1.4 递归求解2.1.5 无重复计算的递归求解2.1.6 权为整数的迭代求解参考资料1.动态规划算法简介动态规划(Dynamic Programming) ,将原问题分解为相对简单的子问题来求解...原创 2019-08-23 17:15:30 · 743 阅读 · 0 评论 -
有向无环图之拓扑排序——贪心算法
拓扑排序主要可以判断有向无环图(DAG)中是否存在环路,其可以用来判断一个有着先后关系的工程能否顺利进行。1. 有向无环图(DAG)一个不存在环路的有向图称作有向无环图(Directed Acycline Graph),简称DAG图。判断一个图是否存在环路可以有以下两种思路:对于无向图,若深度优先遍历过程中遇到回边(即指向已经访问过的顶点的边),则必存在环路;对于有向图,可以构造...原创 2019-08-23 17:14:51 · 2563 阅读 · 0 评论 -
最短路径之迪杰斯特拉算法(Dijkstra)——贪心算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法。本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的有向图中,选定某一个起点,求解到达其它节点的最短路径。1.算法原理迪杰斯特拉(Dijkstra)算法是一个按照路径长度递增的次序产生最短路径的算法。主要特点是以起始点为中心按照长度递增往外层...原创 2019-03-23 14:34:34 · 10034 阅读 · 3 评论 -
最小生成树——贪心算法
文章目录1.生成树和最小生成树1.1 问题的定义1.2 MST性质2.普里姆算法(Prim)2.1 算法流程2.2 算法正确性证明2.3 算法实现2.4 测试代码3.克鲁斯卡尔算法1.生成树和最小生成树1.1 问题的定义一个连通图 的生成树是一个极小连通子图,它含有图中全部的顶点,但是只有足有构成一棵树的n-1条边。它有如下性质:一棵有nnn个顶点的生成树有且只有n−1n-1n−1条边;...原创 2019-03-19 21:25:59 · 14248 阅读 · 4 评论 -
最短路径之Bellman-Ford算法——动态规划
Bellman-Ford算法主要针对带有负值的单源最短路径问题,当有向图带有其权小于0的边的时候,不能使用迪杰斯特拉算法,但是只要不是带负权的回路,我们依然可以使用Bellman-Ford算法。1.算法原理Bellman-Ford算法的核心思想是动态规划,即我们需要定义子问题的状态 和动态规划递归式。讨论前提如果图中共有nnn个顶点,则所有的最短路径最多只有n−1n-1n−1条边。...原创 2019-10-11 10:36:30 · 2862 阅读 · 0 评论 -
最短路径之弗洛伊德算法(Floyd)——动态规划
弗洛伊德算法(Floyd)主要针对多源最短路径,且可以解决路径中有负权的情况(不包含负权回路),但是迪杰斯特拉算法只能解决正权值的单源最短路径(可以迭代多次求多源)。1.弗洛伊德算法的基本思想弗洛伊德算法从图的带权邻接矩阵cost出发,假设求从顶点viv_{i}vi到vjv_{j}vj的最短路径:如果从viv_{i}vi到vjv_{j}vj有弧,则从viv_{i}vi到vj...原创 2019-03-24 21:26:43 · 4084 阅读 · 0 评论 -
动态规划——子序列问题汇总
文章目录1. 最大连续子序列和2.最长递增子序列1. 最大连续子序列和问题定义即求一个连续子序列,使的其和最大。例如对于序列{5,-3,4,2}来说,最大子序列为{5,-3,4,2},和为8。对于序列{5,-6,4,2},最大子序列为{4,2},和为6。因为是求 连续序列,所以我们以SiS_{i}Si 表示问题状态,代表以AiA_{i}Ai 结尾的子序列的最大和,则我们有下列动态规划...原创 2019-08-28 21:40:15 · 1448 阅读 · 0 评论 -
数据结构——线性表
文章目录1.线性表的定义1.1 线性结构1.2 线性结构的表示1.2.1 顺序表示1.2.2 链式表示2.线性表的实现2.1 常见的线性表操作2.2 线性表实现3. 线性表的应用——多项式1.线性表的定义1.1 线性结构线性结构有以下特点:只有一个 “首元素”;只有一个 “尾元素”;除了首元素外,其余元素只有一个 “直接前驱”;除了尾元素外,其余元素只有一个 “直接后继”;即结构...原创 2019-08-23 17:20:14 · 462 阅读 · 0 评论 -
数据结构——栈和队列
文章目录1.栈和队列的定义2.表示和实现2.1 栈的实现2.2 队列的实现1.栈和队列的定义栈和队列都是操作受限的线性表。其中栈(stack) 是限定在 表尾(称为栈顶top)进行插入和删除操作的线性表,即后进先出(LIFO)。队列(queue) 是限定在表头(称为队头front)进行删除,在表尾(称为队尾巴rear)进行插入的线性表,即先进先出(FIFO)。2.表示和实现和线性表类似...原创 2019-08-23 17:19:33 · 364 阅读 · 0 评论 -
二叉链表树的三种遍历方式(递归与非递归) C++
文章目录1.二叉链表(Binary Linked List)2.二叉链表的先序建立3.二叉树的递归遍历3.1 先序遍历二叉树3.2 中序遍历二叉树3.3 后序遍历二叉树4.非递归遍历二叉树4.1 中序遍历4.2 先序遍历4.3 后序遍历5.完整实例代码1.二叉链表(Binary Linked List)二叉树的节点由一个数据元素和分别指向其左、右子树的两个分支构成,则表示二叉树的链表中的节点至...原创 2019-03-10 20:58:00 · 7110 阅读 · 6 评论 -
数据结构——二叉排序树+AVL树
文章目录@[TOC]1. 定义2.基本操作1. 定义二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),其递归定义如下:一棵空树或者是有以下性质的二叉树左子树不空,则左子树上所有结点的值均小于它的根节点的值右子树不空,则右子树上所有结点的值均大于它根节点的值左右子树也是二叉排序树例如,下图这棵树就是一棵二叉排序树:容...原创 2019-09-09 21:31:58 · 2541 阅读 · 0 评论 -
数据结构——特殊的二叉树
文章目录1.普通二叉树2.满二叉树3.哈夫曼树4.二叉排序树5.平衡二叉树6.红黑树1.普通二叉树1.1 定义二叉树的定义是一种递归定义,它的特点是每个结点至多只存在两棵子树(即二叉树中不存在度大于2的结点),且左右子树有先后顺序之分。一棵二叉树要么是空树,要么是一个根结点加上左、右子树组成的二叉树。其中,左右子树也都是二叉树。二叉树有5种基本的状态:1.2 性质二叉树的常见性质:...原创 2019-09-06 19:11:49 · 711 阅读 · 0 评论 -
数据结构——树状数组
文章目录1.树状数组的基础2.树状数组的基本操作2.1.单点更新2.2 区间查询2.3 例题练习3.高级应用3.1 求逆序对3.2 稍进阶操作4.例题收录1.树状数组的基础树状数组 是一个查询和修改复杂度都在O(logn)O(logn)O(logn) 的数据结构,主要用于数组的单点修改和区间求和。一般,我们常见的二叉树是这样画的:叶子节点代表A数组,A[1]~A[8]。然后,我们稍微变...转载 2019-09-04 18:43:35 · 621 阅读 · 0 评论 -
树与等价问题——并查集
1.等价类的定义在离散数学中,等价类的定义是:如果集合S中的关系R是自反的、对称的和传递的,则称它是一个等价关系。集合S上的关系R可定义为,集合SXS的笛卡尔积的子集,即关系是序对的集合。设R是集合S上的等价关系,对任何x∈Sx∈Sx∈S,由[x]R={y∣y∈S∧xRy}[x]_{R}=\{ y|y∈S \wedge xRy \}[x]R={y∣y∈S∧xRy}给出的集合[x]R⊆...原创 2019-03-19 21:28:27 · 5034 阅读 · 0 评论 -
图——邻接矩阵的存储与基本操作
1.邻接表存储用两个数组分别存储:数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。其形式描述如下:// ----- 图的数组(邻接矩阵)存储表示 ----- //// 常量定义# define INFINITY -1 // 最大权重,表示不邻接关系 # define MAX_VERTEX_NUM 10 // 最大顶点个数 typedef int...原创 2019-03-14 15:00:50 · 7024 阅读 · 0 评论 -
图——邻接表的存储及基本操作
文章目录1.邻接表的介绍1.邻接表的介绍邻接表(Adjacency List) 是图的一种链式存储结构。在邻接表中,对图中每一个顶点建立一个单链表,第iii个单链表中的结点表示依附于顶点viv_{i}vi的边(在有向图中是以顶点viv_{i}vi为尾的弧)。单链表中的每一个表结点由三个域组成,其中邻接点域(adjvex) 指向与顶点viv_{i}vi邻接的该点在图中的位置;...原创 2019-03-16 16:41:36 · 4775 阅读 · 1 评论 -
字符串匹配算法
字符串匹配问题的定义文本(Text) 是一个长度为n的数组T[0...n-1];**模式(Pattern)**是一个长度为m且m≤n的数组P[0...m-1]原创 2019-02-17 16:14:46 · 334 阅读 · 0 评论