
数据结构与算法
文章平均质量分 84
数据结构与算法
_Shelcon
努力分享成长的点点滴滴
展开
-
Astar算法
1.什么是Astar算法?Astar算法是一种图形搜索算法,常用于寻路。它是个以广度优先搜索为基础,集Dijkstra算法与最佳优先(best fit)算法特点于一身的一种算法。它通过下面这个函数来计算每个节点的优先级,然后选择优先级最高的节点作为下一个待遍历的节点。优先级函数:其中:1.g(n) 是节点n距离起点的代价。2.h(n)是节点距离终点的预计代价,也就是A*算法的启发函数。A*算法伪代码如下://使用open_set、close_set来表示待遍原创 2021-11-02 14:47:22 · 9204 阅读 · 1 评论 -
分治法、动态规划、贪心算法区别
1.分治法字面意思就是分而治之,将原问题分解为多个子问题,然后其规模若还没有小到可以直接解决,则再次分解。最后将子问题的解合并成为原问题的解。特征:1.子问题小到一定规模就可以直接解决2.子问题之间是相互独立的,即子问题之间不包含公共子问题3.原问题可以分解为规模较小的相同问题,即具有最优子结构性质4.子问题的解合并可成为原问题的解第2条影响着分治法的效率,若子问题之间包含公共子问题,那么将重复很多计算,这时候使用动态规划会比较好。分治法求解的经典案例有:快速排序,归并排序,二分原创 2020-07-19 12:28:18 · 1294 阅读 · 0 评论 -
哈夫曼编码
哈夫曼树的应用很广,哈夫曼编码就是其在电讯通信中的应用之一。广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。在电讯通信业务中,通常用二进制编码来表示字母或其他字符,并用这样的编码来表示字符序列。例:如果需传送的电文为 ‘ABACCDA’,它只用到四种字符,用两位二进制编码便可分辨。假设 A, B, C, D 的编码分别为 00, 01,10, 11,则上述电文便为 ‘00010010101100’(共 14 位),译码员按两位进行分组译码,便可恢复原来的电文。能否使编.转载 2020-07-19 11:10:32 · 12768 阅读 · 0 评论 -
哈夫曼树(HuffmanTree)
1.基本概念首先给出定义哈夫曼树所要用到的几个基本概念:(1)路径(Path):从树中的一个结点到另一个结点之间的分支构成这两个结点间的路径。(2)路径长度(Path Length):路径上的分支数。(3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。(4)结点的权(Weight of Node):在一些应用中,赋予树中结点的一个有实际意义的数。(5)结点的带权路径长度(Weight原创 2020-07-15 21:29:36 · 944 阅读 · 0 评论 -
动态规划
动态规划思想动态规划的基本思想是把问题拆分成一个个相互联系的子问题,先求解子问题,最后将子问题合并形成最终的求解。其实质上是通过开辟记录表,记录已求解过的结果,当再次需要求解的时候,可以直接到那个记录表中去查找,从而避免重复计算子问题来达到降低时间复杂度的效果。实际上是一个空间换时间的算法。动态规划,通常可以把指数级的复杂度降低到多项式级别。动态规划的两个重要性质:1.子问题重叠性质:解决冗余,它对于重复出现的子问题,会在第一次求解后使用一个表储存下来,供之后使用,本质上也是一个空间换时间的思想原创 2020-07-15 11:21:10 · 840 阅读 · 1 评论 -
Dijkstra算法
Dijkstra 算法找到了从任意指定顶点到任何其他顶点的最短路径,而且证实可以到达图中的所有其他顶点。它使用了通常被称为贪心的策略或算法。贪心算法把问题分解成小块或步骤,并且在每一步中确定最优解,用这些最优解合并生成最终的解。Dijkstra 算法的思想就是首先把起点到所有点的距离存下来找个最短的,之后把这个距离最短的点作为中转站再来遍历一遍更新所有点的距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。原创 2020-07-13 18:35:47 · 167 阅读 · 0 评论 -
求最小生成树的两种算法(Kruskal算法和Prim算法)
关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。 生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条转载 2020-07-13 16:19:57 · 382 阅读 · 0 评论 -
图的搜索---深度优先搜索和广度优先搜索
确定从一个顶点能到达哪些顶点是在图上经常执行的一种操作。人们可能需要知道在地图上哪些路可以从一个 城镇到达其他城镇,或者从一个机场到其他机场可以走哪条航线。 在图上执行这些操作都用到了查找算法。图上可以执行两种基础查找:深度优先(depth-first)搜索和广度优先 (breadth-first)搜索。本小节会研究这两种算法原创 2020-07-12 16:18:48 · 567 阅读 · 0 评论 -
邻接矩阵和邻接表
图的存储结构主要分两种,一种是邻接矩阵,一种是邻接表。1.邻接矩阵邻接矩阵的存储方式是用两个数组来表示图。一个一维数组储存图中顶点信息,一个二维数组储存图中的边或弧的信息。无向图这里右图是把顶点作为矩阵内行和列的标头罗列出来。如果在两个顶点之间存在一条边,那么就把 1 放在这个位置上。如果边不存在,那么就赋值为 0。从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都转载 2020-07-05 19:30:41 · 13473 阅读 · 1 评论 -
跳跃表(C#代码)
AVL 树和红黑树在数据搜索和排序方面都是有效的数据结构,但是这两种数据结构都需要重新平衡操作来保持树的平衡,这就导致大量费用和复杂性。还有另外一种数据结构可以使用,它特别适用于查找。这种数据结构提供了树的功效且不需要担心重新平衡问题。这种数据结构叫做跳跃表。跳跃表提供了一种基于树结构的可替换选择。大多数程序员发现它们更容易实现且效率和类树结构相当。如果在处理一个完全或几乎有序的数据集合,那么跳跃表可能是比树更好的一种选择。跳跃表的原理推荐一篇文章:https://blog.youkuaiyun.com/qp原创 2020-06-30 17:42:47 · 687 阅读 · 0 评论 -
图文详解红黑树及代码实现
1红黑树介绍AVL 树并不是处理不平衡二叉搜索树的唯一方法。另一种可以用到的数据结构就是红黑树。红黑树根据一系列规则把树上的节点指定为红色或者黑色。通过对树中节点适当的染色,就可以使得树处于近乎完美地平衡。一个红黑树实例如下:1.1红黑树特点1)树中的每个节点标记成不是红色就是黑色。 2)把根节点标记为黑色。...原创 2020-06-27 01:39:49 · 540 阅读 · 0 评论 -
二叉树的高度和深度的区别
高度和深度是相反的表示,深度是从上到下数的,而高度是从下往上数。我们先来看看高度和深度的定义,某节点的深度是指从根节点到该节点的最长简单路径边的条数,而高度是指从该节点到叶子节点的最长简单路径边的条数。注意:这里边的条数是规定根节点的深度和叶子节点的高度是0;所以树的深度和高度是相等的,而对其他节点来说深度和高度不一定相等。如 B和C节点深度都为1,因为从根节点到到该节点的边数为1,B的高度为2,而C的高度为1。当然树的深度是3高度也是3。树的高度和深度是相等的。原文:https转载 2020-06-25 18:30:24 · 3097 阅读 · 0 评论 -
图文详解AVL树
AVL树(平衡二叉树)详解原创 2020-06-25 22:52:36 · 750 阅读 · 0 评论 -
详解二叉搜索树(BinarySearchTree)
I 二叉搜索树特点每个结点有唯一的值,且每个结点的值均不相同; 若它的左子树不为空,则它的左子树的所有结点均小于根节点的值; 若它的右子树不为空,则它的右子树的所有结点均大于根结点的值; 它的左右子树均为二叉搜索树。II 二叉搜索树的操作二叉查找树由节点组成,所以需要一个 Node 类public class Node{ public int Data; public Node left; public Node right; public void.原创 2020-06-24 17:51:15 · 934 阅读 · 1 评论 -
完美二叉树、满二叉树、完全二叉树
一、完美二叉树一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树。二、满二叉树如果一棵二叉树只有度为 0 的结点和度为 2的结点,则这棵二叉树为满二叉树。三、完全二叉树三者对比完美(Perfect)二叉树一定是完全(Complete)二叉树,但完全(Complete)二叉树不一定是完美(Perfect)二叉树。 完美(Perfect)二叉树一定是满(Full)二叉树,但满(Full)二叉树不一定是完美(Perfect)二叉树..原创 2020-06-23 17:05:26 · 1959 阅读 · 0 评论 -
四个高级排序算法
一、希尔排序希尔排序是插入排序算法的一个改进,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲。希尔排序是通过自定义控制增量来将一组数据分成若干组,对每个组内元素先进行插入排序,然后再控制增量变小使每个组内的元素越来越多,当增量减小至1时,算法终止,排序就完成了。比如[5,4,3,2,1]如果直接用插入排序,外层循环会从4开始以增量1一步步扩大有序序列。而使用希尔排序,我们可以控制增量gap = arr.length/2 = 5/2 = 2 . 那么 最终会将此数据分原创 2020-06-23 21:23:01 · 587 阅读 · 0 评论 -
三大基础排序算法
最容易理解和实现的基础排序算法原创 2020-05-28 22:41:13 · 286 阅读 · 0 评论