数据结构与算法教程
文章平均质量分 93
老牛源码
专注于大学生项目实战开发,讲解,答疑辅导等;擅长PHP、asp.net、Java、Python等语言及微信小程、VUE、UNI、Element、Bootstrap等前端框架;全栈开发;有需要可私信联系!
展开
-
【数据结构与算法】(25)高级数据结构与算法设计之 单调队列和栈问题 代码示例与详细讲解
【代码】【数据结构与算法】(25)高级数据结构与算法设计之 单调队列和栈问题 代码示例与详细讲解。原创 2024-02-25 22:49:19 · 819 阅读 · 2 评论 -
【数据结构与算法】(24)高级数据结构与算法设计之 双指针问题 代码示例与详细讲解
与 Leetcode 1 的两数之和区别在于,本题的数组是升序排好的。下面是的题目都会涉及双指针,除此外,还有。原创 2024-02-25 22:47:57 · 698 阅读 · 0 评论 -
【数据结构与算法】(23)高级数据结构与算法设计之 Backtracking Algorithm回溯算法 代码示例与详细讲解
似乎 ArrayList 作为 stack 性能高一些,见下面代码,但是这道题在 leetcode 上执行时间不稳定,相同代码都会有较大时间差异(15ms vs 9ms)与之前的零钱兑换问题其实是一样的,只是。这道题更类似于 77 题,区别在于。原创 2024-02-25 22:46:15 · 795 阅读 · 0 评论 -
【数据结构与算法】(22)高级数据结构与算法设计之 Divide and Conquer 分治法 代码示例与详细讲解
分治思想将大问题划分为两个到多个子问题子问题可以继续拆分成更小的子问题,直到能够简单求解如有必要,将子问题的解进行合并,得到原始问题的解之前学过的一些经典分而治之的例子二分查找快速排序归并排序合并K个排序链表 - LeetCode 23。原创 2024-02-25 22:41:53 · 554 阅读 · 0 评论 -
【数据结构与算法】(21)高级数据结构与算法设计之 Dynamic-Programming 动态规划算法 代码示例与详细讲解
降维2) 最短路径 - Bellman-Ford3) 不同路径-Leetcode 62机器人要从左上角走到右下角,每次只能向右或向下,问一共有多少条不同路径?分析,先考虑较为简单的情况可能路径有三种情况:分析:设坐标为,共有 m 行 n 列如果终点是 (0,1) 那么只有一种走法如果终点是 (1,0) 那么也只有一种走法如果终点是 (1,1) 呢,它的走法是从它的上方走下来,或者从它的左边走过来,因此走法 = (0,1) + (1,0) = 2种如果终点是 (2,0) 那么也只有一种走法如果终点原创 2024-02-25 22:36:23 · 595 阅读 · 0 评论 -
【数据结构与算法】(20)高级数据结构与算法设计之 Greedy Algorithm 贪心算法 代码示例与详细讲解
简单说就是建立【字符】到【数字】的对应关系,如下面大家熟知的 ASC II 编码表,例如,可以查表得知字符【a】对应的数字是十六进制数【0x61】这回解码没问题了,但并非最少字节,因为 c 的出现频率高(7 次)a 的出现频率低(1 次),因此出现频率高的字符编码成短数字更经济。假设传输的字符中只包含 a,b,c 这 3 个字符,有同学重新设计一张二进制编码表,见下图。不行,因为解码会出现问题,因为 10 会被错误的解码成 ba,而不是 c。现在希望找到一种最节省字节的传输方式,怎么办?原创 2024-02-25 22:30:41 · 820 阅读 · 0 评论 -
【数据结构与算法】(19)高级数据结构与算法设计之 图 拓扑排序 最短路径 最小生成树 不相交集合(并查集合)代码示例
荷兰语:[ˈɛtsxər ˈʋibə ˈdɛikstra] 1930年5月11日-2002年8月6日)是一位荷兰计算机科学家、程序员、软件工程师、系统科学家和科学散文家。他因对开发结构化编程语言做出的基础贡献而获得了1972年的图灵奖,并担任德克萨斯大学奥斯汀分校的斯伦贝谢百年计算机科学主席,任职时间从1984年到2000年。在他于2002年去世前不久,他因其在程序计算的自稳定性方面的工作而获得了ACM PODC分布式计算有影响力论文奖。为了纪念他,该年度奖项在接下来的一年更名为迪克斯特拉奖。原创 2024-02-25 22:26:29 · 971 阅读 · 0 评论 -
【数据结构与算法】(18)高级数据结构与算法设计之 图的概念、图的表示、Java表示、DFS、BFS
如果两个顶点之间存在路径,则这两个顶点是连通的,所有顶点都连通,则该图被称之为连通图,若子图连通,则称为连通分量。路径被定义为从一个顶点到另一个顶点的一系列连续边,例如上图中【北京】到【上海】有多条路径。在有向图中,从一个顶点开始,可以通过若干条有向边返回到该顶点,那么就形成了一个环。该图有四个顶点:A、B、C、D 以及四条有向边,有向图中,边是单向的。边可以有权重,代表从源顶点到目标顶点的距离、费用、时间或其他度量。如果是无向图,那么边是双向的,下面是一个无向图的例子。是指与该顶点相邻的边的数量。原创 2024-02-25 22:22:46 · 823 阅读 · 0 评论 -
【数据结构与算法】(17)基础算法 之排序算法(冒泡排序、选择排序、堆排序、希尔排序、插入排序、归并排序、归并插入、计数排序、桶排序、基数排序) 相关示例 详细代码讲解
算法最好最坏平均空间稳定思想注意事项冒泡O(n)O(n2n^2n2O(n2n^2n2O(1)Y比较最好情况需要额外判断选择O(n2n^2n2O(n2n^2n2O(n2n^2n2O(1)N比较交换次数一般少于冒泡堆O(nlognnlognnlognO(nlognnlognnlognO(nlognnlognnlognO(1)N选择堆排序的辅助性较强,理解前先理解堆的数据结构插入。原创 2024-02-25 22:16:26 · 928 阅读 · 0 评论 -
【数据结构与算法】(16)基础算法 之哈希表 相关示例 详细代码讲解
题目中说明 s 由英文字母、数字、符号和空格组成,因此它的范围是有限的(在 0 ~127 之内),可以用数组来替代 HashMap 优化,如下。begin 调整时的解释,遇到重复的 begin 应该向右调整,例如。的过程,其中编号是一个有限范围内的数字(如 int 范围内)未考虑 hash 码的生成,假定该 hash 码由我们提供。但还有一种情况需要考虑,就是连续遇到两次重复,例如。后两行避免 lambda,12 ms。解法1:用 HashSet。sb 避免每次新建 4ms。简洁解法 14 ms。原创 2024-02-25 22:06:51 · 684 阅读 · 0 评论 -
【数据结构与算法】(15)基础算法 之 B 树 相关示例 详细代码讲解
B树(B-Tree)结构是一种高效存储和查询数据的方法,它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database Systems》中的,题目为"Organization and Maintenance of Large Ordered Indexes"。原创 2024-02-25 22:03:12 · 749 阅读 · 0 评论 -
【数据结构与算法】(14)基础算法 之AVL 树相关示例 详细代码讲解
红黑树是一种自平衡二叉查找树,最早由一位名叫Rudolf Bayer的德国计算机科学家于1972年发明。然而,最初的树形结构不是现在的红黑树,而是一种称为B树的结构,它是一种多叉树,可用于在磁盘上存储大量数据。在1980年代早期,计算机科学家Leonard Adleman和Daniel Sleator推广了红黑树,并证明了它的自平衡性和高效性。从那时起,红黑树成为了最流行的自平衡二叉查找树之一,并被广泛应用于许多领域,如编译器、操作系统、数据库等。原创 2024-02-25 22:01:22 · 630 阅读 · 0 评论 -
【数据结构与算法】(13)基础算法 之AVL 树相关示例 详细代码讲解
AVL 树是一种自平衡二叉搜索树,由托尔·哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字:Adelson-Velsky 和 Landis,他们是苏联数学家,于 1962 年发表了一篇论文,详细介绍了 AVL 树的概念和性质。在二叉搜索树中,如果插入的元素按照特定的顺序排列,可能会导致树变得非常不平衡,从而降低搜索、插入和删除的效率。为了解决这个问题,AVL 树通过在每个节点中维护一个平衡因子来确保树的平衡。平衡因子是左子树的高度减去右子树的高度。原创 2024-02-25 21:59:14 · 850 阅读 · 0 评论 -
【数据结构与算法】(12)基础算法 之 查找概述(线性查找、二分查找、哈希表查找)与二叉搜索树相关示例 详细代码讲解
查找算法是一种在数据集中寻找特定数据项的方法。通常,数据集是在计算机程序中存储的,例如数组、链表或散列表。在编写程序时,查找算法是非常重要的,它有助于快速找到所需的数据。在本文中,我们将介绍一些基本的查找算法及其特点。二叉搜索树最早是由Bernoulli兄弟在18世纪中提出的,但是真正推广和应用该数据结构的是1960年代的D.L. Gries。他的著作《The Science of Programming》中详细介绍了二叉搜索树的实现和应用。原创 2024-02-25 21:51:56 · 1338 阅读 · 0 评论 -
【数据结构与算法】(11)基础数据结构 之 二叉树 二叉树的存储与遍历及相关示例 详细代码讲解
对于前、中两种遍历,实际以上代码从右子树向回走时,并未走完全程(stack 提前出栈了)后序遍历以上代码是走完全程了。例如,下面的树遇到的第一个叶子节点 3 所在的层就是最小深度,其他 4,7 等叶子节点深度更深,也更晚遇到。上面两种情况满足时,不应该再把为 null 子树的深度 0 参与最小值比较,例如这样。效率会高于之前后序遍历解法,因为找到第一个叶子节点后,就无需后续的层序遍历了。对于数组表现的二叉树,则直接遍历数组即可,自然为层序遍历的顺序。下面是一种统一的写法,依据后序遍历修改。原创 2024-02-05 22:00:56 · 1152 阅读 · 3 评论 -
【数据结构与算法】(10)基础数据结构 之 堆 建堆及堆排序 详细代码示例讲解
在 https://www.wolframalpha.com/ 输入。求数组中的第 K 大元素,使用堆并不是最佳选择,可以采用快速选择算法。可以扩容的 heap, max 用于指定是大顶堆还是小顶堆。以大顶堆为例,相对于之前的优先级队列,增加了堆化等方法。本题还可以使用平衡二叉搜索树求解,不过代码比两个堆复杂。求数据流中的第 K 大元素,使用堆最合适不过。下面看交换次数的推导:设节点高度为 3。可以使用之前课堂例题的大顶堆来实现。小顶堆(可删去用不到代码)上题的小顶堆加一个方法。原创 2024-02-05 21:57:00 · 747 阅读 · 1 评论 -
【数据结构与算法】(9)基础数据结构 之 阻塞队列的单锁实现、双锁实现详细代码示例讲解
队列从 0 变化到不空,会唤醒一个等待的 poll 线程,这个线程被唤醒后,肯定能拿到 headLock 锁,因此它具备了唤醒 headWaits 上其它 poll 线程的先决条件。下面来看一个难题,就是如何通知 headWaits 和 tailWaits 中等待的线程,比如 poll 方法拿走一个元素,通知 tailWaits:我拿走一个,不满了噢,你们可以放了,因此代码改为。事情还没有完,上面的例子是队列还没有放满的情况,考虑下面的代码(这回锁同时保护了 tail 和 size 的读写安全)原创 2024-02-04 22:56:16 · 785 阅读 · 2 评论 -
【数据结构与算法】(8)基础数据结构 之 优先级队列的无序数组实现、有序数组实现、堆实现详细代码示例讲解
例2 - 完全二叉树(Complete Binary Tree)特点:最后一层可能未填满,靠左对齐。例1 - 满二叉树(Full Binary Tree)特点:每一层都是填满的。题目中要从小到大排列,因此选择用小顶堆来实现,自定义小顶堆如下。这道题目之前解答过,现在用刚学的优先级队列来实现一下。计算机科学中,堆是一种基于树的数据结构,通常用。完全二叉树可以使用数组来表示。原创 2024-02-04 22:52:31 · 1065 阅读 · 0 评论 -
【数据结构与算法】(7)基础数据结构之双端队列的链表实现、环形数组实现示例讲解
双端队列、队列、栈对比定义特点队列一端删除(头)另一端添加(尾)栈一端删除和添加(顶)双端队列两端都可以删除、添加优先级队列优先级高者先出队延时队列根据延时时间确定优先级并发非阻塞队列队列空或满时不阻塞并发阻塞队列队列空时删除阻塞、队列满时添加阻塞Java 中 LinkedList 即为典型双端队列实现,不过它同时实现了 Queue 接口,也提供了栈的 push pop 等方法注2:不同语言,操作双端队列的方法命名有所不同,参见下表操作JavaJavaScript。原创 2024-02-04 22:47:54 · 568 阅读 · 0 评论 -
【数据结构与算法】(6)基础数据结构之栈的链表实现、环形数组实现示例讲解
计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书先提供一个栈接口/*** 向栈顶压入元素* @param value 待压入值* @return 压入成功返回 true, 否则返回 false/*** 从栈顶弹出元素* @return 栈非空返回栈顶元素, 栈为空返回 null*/ E pop();/*** 返回栈顶元素, 不弹出。原创 2024-02-04 22:43:30 · 383 阅读 · 0 评论 -
【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解
计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头,就如同生活中的排队买商品queue先定义一个简化的队列接口/*** 向队列尾插入值* @param value 待插入值* @return 插入成功返回 true, 插入失败返回 false/*** 从对列头获取值, 并移除* @return 如果队列非空返回对头值, 否则返回 null/*** 从对列头获取值, 不移除。原创 2024-02-04 22:40:40 · 926 阅读 · 0 评论 -
【数据结构与算法】(4)基础数据结构 之 递归 单路递归、多路递归示例讲解 附单路递归示例(阶乘、反向打印字符、二分查找、冒泡排序、插入排序、约瑟夫问题)多路递归示例(斐波那契数列、汉诺塔、杨辉三角)
定义计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集recursionreturn;自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)每次调用,函数处理的数据会较上次缩减(子集),而且最后会缩减至无需继续递归内层函数调用(子集处理)完成,外层函数才能算调用完成原理假设链表中有 3 个节点,value 分别为 1,2,3,以上代码的执行流程就类似于下面的伪码return;思路确定能否使用递归求解。原创 2024-02-04 22:35:57 · 824 阅读 · 0 评论 -
【数据结构与算法】(3)基础数据结构 之 链表 单向链表、双向链表、循环链表详细示例讲解
定义在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续可以分类为[^5]单向链表,每个元素只知道其下一个元素是谁双向链表,每个元素知道其上一个元素和下一个元素循环链表,通常的链表尾节点 tail 指向的都是 null,而循环链表的 tail 指向的是头节点 head链表内还有一种特殊的节点称为哨兵(Sentinel)节点,也叫做哑元( Dummy)节点,它不存储数据,通常用作头尾,用来简化边界判断,如下图所示随机访问性能根据 index 查找,时间复杂度O。原创 2024-02-04 22:22:18 · 1022 阅读 · 0 评论 -
【数据结构与算法】(2)基础数据结构 之 数组 动态数组、二维数组详细示例讲解与局限性原理及越界检查
定义在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识arrayelementsorkey因为数组内的元素是连续存储知道了数组的数据起始地址BaseAddressBaseAddress,就可以由公式BaseAddressi∗sizeBaseAddressi∗size计算出索引iii元素的地址iii即索引,在 Java、C 等语言都是从 0 开始size。原创 2024-01-30 14:09:07 · 1312 阅读 · 2 评论 -
【数据结构与算法】(1)初识算法之什么是算法?什么是数据结构?二分查找代码示例
定义在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算algorithm不正式的说,算法就是任何定义优良的计算过程:接收一些值作为输入,在有限的时间内,产生一些值作为输出。定义在计算机科学领域,数据结构是一种数据组织、管理和存储格式,通常被选择用来高效访问数据数据结构是一种存储和组织数据的方式,旨在便于访问和修改可以说,程序 = 数据结构 + 算法,它们是每一位程序员的基本功,下来我们通过对一个非常著名的二分查找算法的讲解来认识一下算法。原创 2024-01-30 13:58:47 · 882 阅读 · 0 评论