
数据结构与算法
文章平均质量分 77
WayneSlytherin
凡物之骤为之而追成焉者,其器小也;物之一览而易尽者,其中无有也。
展开
-
40.弗洛伊德(Floyd)算法
我们此前拆解过迪杰斯特拉(Dijkstra)算法,与它一样,弗洛伊德(Floyd)算法也是用于寻找给定的加权图中顶点间最短路径的算法。该算法是1978年图灵奖获得者、斯坦福大学计算机科学系教授及其团队发现的,以主要创始人 弗洛伊德 命名。迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径,而弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。原创 2023-10-29 19:00:00 · 358 阅读 · 0 评论 -
39.克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔(Kruskal)算法,相信自己,每一步不至于信,也就没有那么复杂。原创 2023-10-22 22:24:13 · 621 阅读 · 1 评论 -
38.迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。原创 2023-10-14 14:00:00 · 273 阅读 · 0 评论 -
37.普利姆(Prim)算法
要想富,先修路”,郝乡长最近为了德胜乡修路的事情愁白了头。得胜乡有A、B、C、D、E、F、G七个村子,现在需要修路把7个村庄连通,但是又想要耗费的公路建材最少(修建公路的总里程最短),聪明的你是否有什么好办法呢?注:各个村庄的距离用边线(权值)来表示。我们可以帮助郝乡长想想这个问题的解。思路上,尽可能选择少的路线,并且每条路线最小,是不是就能保证总里程数最小呢?原创 2023-10-08 20:39:23 · 186 阅读 · 0 评论 -
36.骑士周游算法及其基于贪心算法的优化
骑士周游算法,叫做“马踏棋盘算法”或许更加直观。在国际象棋8x8的棋盘中,马也是走“日字”进行移动,相应的产生了一个问题:“如果要求马 在每个方格只能进入一次,走遍全部的64个方格需要如何行进?”这就是著名的 骑士周游算法的由来。原创 2023-10-01 10:18:59 · 693 阅读 · 0 评论 -
35.浅谈贪心算法
相信大家或多或少都对贪心算法有所耳闻,今天我们从一个应用场景展开。假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号?原创 2023-09-24 15:40:13 · 4062 阅读 · 0 评论 -
34.KMP算法,拒绝暴力美学
今天我们来聊一聊字符串匹配的问题。比如有字符串str1 = “豫章故那,洪都新府。星分翼轸,地接衡庐。襟三江而带五湖,控蛮荆而引瓯越。”,字符串str2 = “襟三江而带五湖”。现要判断str1是否含有str2,如果有则的返回第一次出现的位置,如果没有返回-1。面对字符串匹配问题,我们通常都会直观的选择暴力匹配算法来解决,这固然能够满足业务要求但不可否认,它效率极低。原创 2023-09-17 11:08:30 · 107 阅读 · 0 评论 -
33.二分查找算法(非递归)与分治算法
分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,比如我们此前说过的快速排序归并排序,以及著名的傅立叶变换(快速傅立叶变换)等等。原创 2023-09-03 19:00:00 · 188 阅读 · 2 评论 -
32.图的存储形式及深度优先算法与广度优先算法
前面我们讲了线性表和树,线性表局限于一个直接前驱和一个直接后继的关系。同时树也只能有一个直接前驱,也就是父节点。当我们需要表示多对多关系时,就需要用到图。原创 2023-08-27 13:22:44 · 119 阅读 · 0 评论 -
31.图解B树、B+树、B*树
B-tree即B树,B即Balanced,平衡。这里需要强调,B树及其常见的变体有三种,即B树、B+树、B*树。没有B-树,有些资料将B-tree翻译为B-树,很容易引起误解,以为B-树是一种树而B树是另一种树,这是错误的。B-tree就是B树。Balanced Tree 首先是平衡树,同时要求必须是一棵搜索树,也就是我们常说的排序树。原创 2023-08-20 19:00:00 · 121 阅读 · 0 评论 -
30.B树之2-3树
我们在理解B树之前不妨先回忆下,似乎我们在前面几篇一直都在说二叉树的优点,那么二叉树是否存在致命的缺陷呢?又是否有什么办法可以解决呢?原创 2023-08-12 19:38:21 · 111 阅读 · 0 评论 -
29.平衡二叉树(AVL树)的左旋、右旋与双旋转
上一篇我们着重了解了何为二叉排序树(BST),那么我们不妨来看下面这一棵BST有什么问题:它完全符合BST的要求,但是也很明显,它不对劲,它的左子树全部为空,从形式上看它其实更像一个单链表;插入速度没有影响,但查询速度完全没有体现出BST的树结构的优势,甚至比单链表还慢,因为它每次还需要比较已经为空的左子树;那么就不得不提到我们今天的主角 —— 平衡二叉树(AVL)原创 2023-07-30 13:39:15 · 178 阅读 · 0 评论 -
28.二叉排序树(BST)
前阵子和久未见面的朋友线上闲聊,说起了关于程序员市场供求关系的话题。我觉得这几点都凝聚了很多思考,这些担忧也不无道理。其实各行各业都是一样,只不过十几年来互联网风口安逸的风吹的太多程序员躺在红利上忘了还债。似乎这个行业动动脑子手指就可以轻松高薪。我记得小时候在老家有一个“全市连锁”的大超市,生意越来越红火,结账的售货员也越招越多,后来扫码结账的机器出现了,大量的售货员被辞退,仅留了一两个值守,而他们无一例外都要会操作那台机器甚至是排障。原创 2023-07-22 19:25:41 · 79 阅读 · 0 评论 -
27.哈夫曼算法之压缩与解压
铺垫了两篇,就为了今天的实现,哈夫曼算法之压缩与解压,快来看看吧~原创 2023-07-15 13:00:41 · 155 阅读 · 0 评论 -
26.哈夫曼编码树与哈夫曼编码表
其实很多同学可能会与我有相同的疑问,哈夫曼树的实现似乎有它独特的道理,甚至在软件设计师考试中也是每年的必考题目,但是它究竟可以做什么呢?原创 2023-07-08 18:27:48 · 520 阅读 · 0 评论 -
25.哈夫曼(Huffman)树
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为,也称为(HuffmanTree),也有资料翻译为霍夫曼树/赫夫曼树(不纠结哈,下文统称哈夫曼树)。哈夫曼树是带权路径长度最短的树,也就是说,权值越大的节点理应离根节点越近。原创 2023-07-01 19:58:17 · 233 阅读 · 0 评论 -
24.堆排序
将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;将堆顶元素与末尾元素交换,将最大元素“沉”到数组末端;重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。原创 2023-06-25 21:33:35 · 97 阅读 · 0 评论 -
23.顺序与线索化二叉树
这一章我们从顺序二叉树的存储开始,了解了顺序二叉树的前中后序遍历。通过对完全二叉树资源利用不完全分析出了线索化二叉树的方式以及对应的实现。原创 2023-06-17 11:11:24 · 145 阅读 · 0 评论 -
22.二叉树的遍历、检索与删除
在上一篇中我们着重对二叉树相关的概念做了说明,这一篇我们“捞点干的”,从代码的角度解以下二叉树的前中后序遍历、查找以及二叉树节点的删除。原创 2023-06-10 21:16:44 · 69 阅读 · 0 评论 -
21.浅谈二叉树
相信真正从事了几年软件开发,尤其是后端开发的程序员都或多或少有这样的感悟:“似乎一谈到具体的技术架构,不拿出一些中间件来用就会显得自己很不专业。原创 2023-06-04 17:29:55 · 180 阅读 · 0 评论 -
20.哈希表(散列)
散列表(Hash table),也称哈希表,是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。这个映射函数叫做散列函数,存放记录的数组称为散列表。原创 2023-05-28 19:00:00 · 77 阅读 · 0 评论 -
19.插值查找算法与斐波那契算法
由插值算法的实现过渡到斐波那契算法的实现。一串神秘代码——0.618。原创 2023-05-20 11:17:50 · 139 阅读 · 0 评论 -
18.线性查找算法与二分查找算法
在此前的一段时间中,我们花了很大的篇幅逐一的拆解了主流的排序算法。在实际的业务实现中,与排序算法旗鼓相当的另一个领域就是查找算法。,或者说。常用的查找算法一共有四种,分别是顺序(线性)查找、二分查找(折半查找)、插值查找、斐波那契查找(黄金分割查找),下面的章节我会对以上四种查找算法逐一讲解。原创 2023-05-13 15:27:25 · 109 阅读 · 0 评论 -
17.基数排序
基数排序又称“桶排序”,属于分配式排序,也称“桶子法”。通过键值各个位的值,将要排序的元素分配到某些桶中,进而达到排序的目的。基数排序是效率较高的稳定排序,实际上,它也是桶排序的扩展。早在1887年,赫尔曼·何乐礼就通过将整数切割成不同的数字而后按位比较实现了基数排序。原创 2023-05-06 21:47:19 · 83 阅读 · 0 评论 -
16.归并排序
(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略。的旨在将目标问题分成一些小的问题然后递归求解,而的阶段则将分的阶段得到的各答案"修补"在一起。原创 2023-04-30 20:45:00 · 89 阅读 · 0 评论 -
15.快速排序
一文带你吃透快速排序,了解排序效率。原创 2023-04-22 21:01:57 · 96 阅读 · 0 评论 -
14.冒泡排序
外科手术式讲解交换排序的经典实现——冒泡排序原创 2023-04-15 20:06:51 · 92 阅读 · 0 评论 -
13.简单选择排序
简单选择排序,最容易理解的排序算法。原创 2023-04-08 22:07:25 · 82 阅读 · 0 评论 -
12.希尔排序
希尔排序,看这一篇就够了。原创 2023-03-31 22:42:51 · 172 阅读 · 0 评论 -
11.直接插入排序
插入排序属于内部排序法,是对欲排序的元素以插入的方式找寻该元素的适当位置。以达到排序的目的。“直接插入排序”是插入排序的典型代表。原创 2023-03-24 23:19:38 · 93 阅读 · 0 评论 -
10.排序算法与时空复杂度概述
一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)= O(f(n)),称 O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。T(n)不同,但时间复杂度可能相同。原创 2023-03-18 15:20:09 · 92 阅读 · 0 评论 -
9.八皇后问题(回溯算法)
回溯算法验证八皇后问题原创 2023-03-11 19:19:54 · 641 阅读 · 0 评论 -
8.迷宫问题
递归就是方法自己调用自己,每次调用时传入不同变量。递归有助于解决复杂问题,同时可以让代码变得更加简洁。原创 2023-03-04 21:34:59 · 116 阅读 · 0 评论 -
7.前缀、中缀、后缀表达式与逆波兰计算器
一文带你搞懂前缀、中缀、后缀表达式(逆波兰表达式)原创 2023-02-26 01:15:01 · 526 阅读 · 0 评论 -
6.栈与中缀表达式计算器
栈的数组实现,手撕中缀表达式计算器实现。原创 2023-02-18 19:50:47 · 173 阅读 · 0 评论 -
5.环形链表与约瑟夫(Josephus)问题
约瑟夫问题看这一篇就够了原创 2023-02-12 12:08:42 · 124 阅读 · 0 评论 -
4.数据结构之双链表
双向链表,看这一篇就够了原创 2023-02-10 22:01:44 · 93 阅读 · 0 评论 -
3.数据结构之单链表
关于单链表,看这一篇就够了。原创 2023-02-04 16:18:27 · 122 阅读 · 0 评论 -
2.数据结构之队列
手写基础数据结构,编程也可以很有趣。数组实现队列、环形队列原创 2023-01-29 22:45:24 · 176 阅读 · 0 评论 -
1.稀疏数组
浅谈数据结构数据结构通常可以分为线性数据结构和非线性数据构。顾名思义,线性数据结构中存在着数据元素间一对一的线性对应关系,如数组 array[i] = x等,而非线性数据结构则没有这个特点。同时线性结构拥有着两种不同的存储结构,分别是顺序存储(顺序表)和链式存储(链表)。今天我们要谈的稀疏数组在结构上属于非线性数据结构中的二维数组。原创 2023-01-22 16:23:43 · 228 阅读 · 0 评论