数据结构与算法
文章平均质量分 70
bone_ds
关于明天的事,后天就知道了.
展开
-
[ 数据结构 ] 弗洛伊德算法(Floyd)--------最短路径问题
因为默认开始只有两种路线:直连/不直连,两种情况下默认前驱节点都是出发点,即出发点到任何顶点的前驱节点都是自己,至于后续的改动,不管最短路线改为非直连的两段还是三段,也只是针对不直连的路(即65535),而直连的两个顶点相关数据无需改动,前驱自然就是终点的前驱节点,即出发点。观察:虽然F作为中间点,但是测试时中间点第一个就用F,CD的距离和前驱都未能更新,仅更新了DE之间和DG之间数据,而当F之后的E作为中间点,CD之间数据才能更新,即CD的前驱为F,为什么会如此?为什么如此初始化前驱关系表?原创 2023-01-10 00:00:34 · 1115 阅读 · 0 评论 -
[ 数据结构 ] 迪杰斯特拉算法(最短路径问题)
访问情况数组(用以标记顶点已访问)+前驱节点数组(用以输出最终的最短路径)+距离数组(表示出发点到各顶点的最短距离)说明:主要广度优先搜索,同时定义。原创 2023-01-09 22:47:06 · 553 阅读 · 0 评论 -
[ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法
【代码】[ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法。原创 2023-01-09 22:12:53 · 1305 阅读 · 0 评论 -
[ 数据结构 ] 集合覆盖问题(贪心算法)
因为当多个电台都能覆盖3个地区时,我们选择了第一个,这考虑的过于简单,比如第一个电台如果包月太贵那么是否应该考虑选第2个呢。说明:整个过程中,其实重难点在第2步中如何选择能覆盖最多地区的电台,并不是选择最大的电台,而是k电台与allAreas的。如果最大,说明k就是本轮我们选择的结果,allAreas其实应该理解为目前未被电台覆盖的地区。ps:该算法的解并不一定是最优解,只是。原创 2023-01-09 20:36:04 · 1294 阅读 · 0 评论 -
[ 数据结构 ] 字符串匹配(暴力匹配)
str2[j]),令 i = i - (j - 1),j = 0。3)用暴力方法解决的话就会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着判断,浪费了大量的时间。(采用KMP算法优化)1)如果当前字符匹配成功(即 str1[i] == str2[j]),则 i++,j++,继续匹配下一个字符。2)现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1。1)有一个字符串 str1= ““abcdefg””,和一个子串 str2=“fg”原创 2023-01-09 18:50:18 · 160 阅读 · 0 评论 -
[ 数据结构 ] 背包问题(动态规划)
有一个背包,容量为4磅,现有如下物品1)要求达到的目标为装入的背包的总价值最大,并且重量不超出2)要求装入的物品不能重复(01背包)原创 2023-01-09 18:41:22 · 324 阅读 · 0 评论 -
[ 数据结构 ] 汉诺塔--------分治算法最佳实践
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。温馨__提示__:递归调用的过程中,别认为起始柱一直就是A,也别认为目标柱一直就是C,传参不同,柱子的作用就不同了。如果我们有 n >= 2 情况,我们总是可以看做是两个盘(最下边的盘+上面的盘)把 B 塔的所有盘 从 B->C。把最下边的盘 A->C。原创 2023-01-09 14:39:31 · 307 阅读 · 0 评论 -
[ 数据结构 ] 二分查找算法(非递归)
【代码】[ 数据结构 ] 二分查找算法(非递归)原创 2023-01-09 14:21:45 · 85 阅读 · 0 评论 -
[ 数据结构 ] 图(Graph)--------深度优先、广度优先遍历
为什么要有图?无论是线性表还是树结构,局限于表示一个直接前驱和一个直接后继的关系(一对一/一对多),当我们需要表示的关系时, 这里我们就用到了图节点间的连接成为边,节点称为顶点,一个顶点到另一个顶点所经过的边叫路径,边有方向的叫有向图,边没有方向的叫无向图,边带权值的叫带权图也叫网/邻接表,分别使用二维数组/链表,简单理解:顶点3所表示的一维数组/单链表中,顶点5表示的元素/节点大小就是顶点3和5间边的权值,权值为1表示可直接连接,否则无法直连(通常不用0而使用极大值65535表示)原创 2023-01-09 14:10:08 · 529 阅读 · 0 评论 -
[ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋
数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在。原创 2023-01-09 12:38:57 · 2104 阅读 · 0 评论 -
[ 数据结构 ] 二叉排序树(BST)
对于二叉排序树,中序遍历结果就是原数列升序排序后的结果为什么说二叉排序树结合数组+链表的优点?它的查找速度其实等价于有序数组的二分查找速度,而它的添加速度基于二分查找在找到位置后等于链表的链尾追加操作(改变空指针的指向),因此得名。原创 2023-01-08 22:15:42 · 377 阅读 · 0 评论 -
[ 数据结构 ] 赫夫曼编码--------数据、文件压缩解压
如上图:给定字符串按定长编码处理,最终对应二进制长度为359思考:如何压缩,将359有效降低?----原创 2023-01-08 21:02:40 · 445 阅读 · 0 评论 -
[ 数据结构 ] 哈夫曼树(Huffman Tree)
【代码】[ 数据结构 ] 哈夫曼树(Huffman Tree)原创 2023-01-08 17:00:26 · 279 阅读 · 0 评论 -
[ 数据结构 ] 堆排序--------思路、图解、代码
答:编写adjust方法,用以调整当前堆(a)为大顶堆,但是该方法并不是调用一次就能完成大顶堆,举例说明:如果将父子三节点看成是一个小小堆,那么从最后一个小小堆开始,使小小堆满足父值>子值(即大顶堆的要求),从后往前对小小堆的堆顶调用adjust方法,一直到第一个小小堆,从而实现构建大顶堆。问:整体思路简单,就是不断构建大顶堆,首尾互换,难就难在如何调整,使得构建成满足条件的大顶堆呢?adjust,就能完成构建大顶堆.-----------------看下面图。继续调整,交换,最终得到升序数组。原创 2023-01-08 15:48:36 · 339 阅读 · 0 评论 -
[ 数据结构 ] 二叉树详解--------前序、中序、后序、存储、线索化
why?为什么需要树结构?数组虽然查找快(通过下标访问),但无法动态扩容(拷贝到新的数组),而链表相反,树结构刚好结合两者优点浅谈树?树的存储和读取效率都很高,比如二叉排序树,理解树的抽象模型有助于理解递归的原理,树的模型接近于单向链表,父节点指向左右子树,而链表相比二叉树可以看成单叉。原创 2023-01-08 11:37:21 · 1839 阅读 · 0 评论 -
[ 数据结构 ] 哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。原创 2023-01-07 20:39:56 · 79 阅读 · 0 评论 -
[ 数据结构 ] 查找算法--------线性、二分、插值、斐波那契查找
查找算法有4种:线性查找二分查找/折半查找插值查找斐波那契查找。原创 2023-01-07 19:41:29 · 404 阅读 · 0 评论 -
[ 数据结构 ] 排序算法--------冒泡、选择、插入、希尔、快排、归并、基数、堆
1.1 排序分类内部排序和外部排序,前者数据加载到内存,后者数据量大需借助外部文件.内部排序包含:插入排序:直接插入排序,希尔排序选择排序:简单选择排序,堆排序交换排序:冒泡排序,快速排序归并排序基数排序1.2 复杂度1)度量一个程序时间有两种方法,事后统计或事前估算,事前估算就需要分析时间复杂度2)时间复杂度:算法中的基本操作语句的重复执行次数是问题规模 n 的某个函数, 计算方法:去常数阶–>保留最高阶项–>去除最高阶项系数 常见时间复杂度:常数阶 O(1)、对数阶 O(log2n)、线性阶 O(n原创 2022-12-09 18:57:01 · 821 阅读 · 0 评论 -
[ 数据结构与算法 ] 逆波兰计算器
逆波兰计算器应用场景输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果支持小括号和多位数整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持 对整数的计算。计算后缀表达式案例: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值关键点:判断扫描到的字符串:1.数字直接入栈;2.若是运算符,出栈两个数字并计算,计算结果放回栈中步骤如下:1.从左至右扫描,将 3 和 4 压入堆栈;2.遇到+运算符,因此弹出 4 和原创 2022-03-15 00:01:12 · 2092 阅读 · 0 评论 -
[ 数据结构与算法 ] 栈: 中缀表达式
需求栈的一个实际需求:将字符串对应的表达式(中缀表达式)运算得到结果介绍栈的英文为(stack)栈是一个 先入后出(FILO-First In Last Out) 的有序列表。栈(stack) 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。 。 允许插入和删除的一端,为 变化的一端,称为栈顶(Top) ,另一端为 固定的一端,称为栈底(Bottom) 。根据栈的定义可知 , 最先放入栈中元素在栈底 , 最后放入的元素在栈顶 , 而删除元素刚好相反 , 最后放入的元原创 2022-03-02 01:04:27 · 634 阅读 · 2 评论 -
[数据结构与算法] 单向环形链表 和 Josephu环
Josephu约瑟夫环–单向环形链表的引出 Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 提示:用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后原创 2022-02-25 01:54:12 · 877 阅读 · 0 评论 -
[ 数据结构与算法 ] 双向链表: CRUD.有序插入
双向链表优势单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除节点时,总是找到 temp,temp 是待删除节点的前一个节点.分析了双向链表如何完成遍历,添加,修改和删除的思路应用实例使用带 head 头的双向链表实现遍历,添加,修改,删除遍历方法和单链表一样,只是可以向前,也可以向后查找添加方式1:添加到双向链表的最后(1)先找到双向链表的最后这个节点(2) temp原创 2022-02-23 00:21:44 · 338 阅读 · 1 评论 -
[ 数据结构与算法 ] 单链表: CRUD.反转.逆序查找.逆序打印
单链表链表(Linked List)介绍链表是有序的列表,但是它在内存中是存储如下总结:链表是以节点的方式来存储, 是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现 链表的各个节点不一定是连续存储.链表分 带头节点的链表和 没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下应用实例使用带 head 头的单向链表实现: 水浒英雄排行榜管理完成对英雄人物的增删改查操作添加结点方式1:在添加英雄时,直接添加到链表的尾原创 2022-02-22 02:32:14 · 450 阅读 · 0 评论 -
[ 数据结构与算法 ]稀疏数组和队列
稀疏数组和队列稀疏sparsearray数组需求:编写的五子棋程序中,有存盘退出和续上盘的功能。分析问题:因为该二维数组的很多值是默认值 0, 因此记录了 很多没有意义的数据.-> 稀疏数组。基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组 一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而 缩小程序的规模应用实例使用稀疏数组,来保留类似前面的二维数组(棋盘原创 2022-02-18 01:51:19 · 250 阅读 · 0 评论