
数据结构与算法
文章平均质量分 93
在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算。数据结构是一种数据组织、管理和存储格式,通常被选择用来高效访问数据
程序员波特
全网同名,资深Java开发。专注分享Java后端、中间件、架构设计、云原生、面试等干货知识。关注我,一起成长
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【数据结构与算法】Leetcode刷题笔记
对于天数 n = 6,最多进行 3 次交易,如果此时 k > 3,意味着不限次交易。对于天数 n = 7,最多进行 3 次交易,如果此时 k > 3,意味着不限次交易。与 Leetcode 1 的两数之和区别在于,本题的数组是升序排好的。,有大厂完整面经,工作技术,架构师成长之路,等经验分享!的数字,从 1 开始,返回数字的比例减半,例如。下面是的题目都会涉及双指针,除此外,还有。设计一个方法调用若干次,每次返回。本文,已收录于,我的技术网站。原创 2024-10-10 09:15:00 · 842 阅读 · 0 评论 -
【数据结构与算法】Backtracking Algorithm
似乎 ArrayList 作为 stack 性能高一些,见下面代码,但是这道题在 leetcode 上执行时间不稳定,相同代码都会有较大时间差异(15ms vs 9ms),有大厂完整面经,工作技术,架构师成长之路,等经验分享!与之前的零钱兑换问题其实是一样的,只是。这道题更类似于 77 题,区别在于。本文,已收录于,我的技术网站。原创 2024-10-09 16:00:00 · 604 阅读 · 0 评论 -
【数据结构与算法】Divide and Conquer
分治思想将大问题划分为两个到多个子问题子问题可以继续拆分成更小的子问题,直到能够简单求解如有必要,将子问题的解进行合并,得到原始问题的解之前学过的一些经典分而治之的例子二分查找快速排序归并排序合并K个排序链表 - LeetCode 23。原创 2024-10-09 08:00:00 · 755 阅读 · 0 评论 -
【数据结构与算法】Dynamic-Programming
如果终点是 (1,1) 呢,它的走法是从它的上方走下来,或者从它的左边走过来,因此走法 = (0,1) + (1,0) = 2种。如果终点是 (2,1) 呢,它的走法是从它的上方走下来,或者从它的左边走过来,因此走法 = (1,1) + (2,0) = 3种。不要被题目名字误导了,本题类似于零钱兑换518题,区别在于零钱兑换求的是组合数,本题求的是排列数。本质上是完全背包问题,把钢条总长度看作背包容量,切分后的钢条看作物品。,有大厂完整面经,工作技术,架构师成长之路,等经验分享!,问一共有多少条不同路径?原创 2024-10-08 14:30:00 · 1459 阅读 · 0 评论 -
【数据结构与算法】Greedy Algorithm
简单说就是建立【字符】到【数字】的对应关系,如下面大家熟知的 ASC II 编码表,例如,可以查表得知字符【a】对应的数字是十六进制数【0x61】这回解码没问题了,但并非最少字节,因为 c 的出现频率高(7 次)a 的出现频率低(1 次),因此出现频率高的字符编码成短数字更经济。假设传输的字符中只包含 a,b,c 这 3 个字符,有同学重新设计一张二进制编码表,见下图。不行,因为解码会出现问题,因为 10 会被错误的解码成 ba,而不是 c。,有大厂完整面经,工作技术,架构师成长之路,等经验分享!原创 2024-10-07 10:27:40 · 1246 阅读 · 0 评论 -
【数据结构与算法】图
他因对开发结构化编程语言做出的基础贡献而获得了1972年的图灵奖,并担任德克萨斯大学奥斯汀分校的斯伦贝谢百年计算机科学主席,任职时间从1984年到2000年。如果两个顶点之间存在路径,则这两个顶点是连通的,所有顶点都连通,则该图被称之为连通图,若子图连通,则称为连通分量。在有向图中,从一个顶点开始,可以通过若干条有向边返回到该顶点,那么就形成了一个环。该图有四个顶点:A、B、C、D 以及四条有向边,有向图中,边是单向的。如果是无向图,那么边是双向的,下面是一个无向图的例子。本文,已收录于,我的技术网站。原创 2024-10-08 08:00:00 · 1209 阅读 · 0 评论 -
【数据结构与算法】排序算法
算法最好最坏平均空间稳定思想注意事项冒泡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-10-07 18:30:00 · 1597 阅读 · 0 评论 -
【数据结构与算法】哈希表
题目中说明 s 由英文字母、数字、符号和空格组成,因此它的范围是有限的(在 0 ~127 之内),可以用数组来替代 HashMap 优化,如下。begin 调整时的解释,遇到重复的 begin 应该向右调整,例如。的过程,其中编号是一个有限范围内的数字(如 int 范围内),有大厂完整面经,工作技术,架构师成长之路,等经验分享!但还有一种情况需要考虑,就是连续遇到两次重复,例如。后两行避免 lambda,12 ms。本文,已收录于,我的技术网站。解法1:用 HashSet。简洁解法 14 ms。原创 2024-10-07 14:30:00 · 1013 阅读 · 0 评论 -
【数据结构与算法】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-10-07 09:51:44 · 1413 阅读 · 0 评论 -
【数据结构与算法】红黑树
红黑树是一种自平衡二叉查找树,最早由一位名叫Rudolf Bayer的德国计算机科学家于1972年发明。然而,最初的树形结构不是现在的红黑树,而是一种称为B树的结构,它是一种多叉树,可用于在磁盘上存储大量数据。在1980年代早期,计算机科学家Leonard Adleman和Daniel Sleator推广了红黑树,并证明了它的自平衡性和高效性。从那时起,红黑树成为了最流行的自平衡二叉查找树之一,并被广泛应用于许多领域,如编译器、操作系统、数据库等。原创 2024-10-01 21:35:20 · 1241 阅读 · 0 评论 -
【数据结构与算法】AVL树
AVL 树是一种自平衡二叉搜索树,由托尔·哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字:Adelson-Velsky 和 Landis,他们是苏联数学家,于 1962 年发表了一篇论文,详细介绍了 AVL 树的概念和性质。在二叉搜索树中,如果插入的元素按照特定的顺序排列,可能会导致树变得非常不平衡,从而降低搜索、插入和删除的效率。为了解决这个问题,AVL 树通过在每个节点中维护一个平衡因子来确保树的平衡。平衡因子是左子树的高度减去右子树的高度。原创 2024-09-28 16:00:00 · 1566 阅读 · 0 评论 -
【数据结构与算法】二叉搜索树
二叉搜索树最早是由Bernoulli兄弟在18世纪中提出的,但是真正推广和应用该数据结构的是1960年代的D.L. Gries。他的著作《The Science of Programming》中详细介绍了二叉搜索树的实现和应用。在计算机科学的发展中,二叉搜索树成为了一种非常基础的数据结构,被广泛应用在各种领域,包括搜索、排序、数据库索引等。随着计算机算力的提升和对数据结构的深入研究,二叉搜索树也不断被优化和扩展,例如AVL树、红黑树等。int key;原创 2024-09-28 15:00:00 · 891 阅读 · 0 评论 -
【数据结构与算法】基础算法之查找概述
查找算法是一种在数据集中寻找特定数据项的方法。通常,数据集是在计算机程序中存储的,例如数组、链表或散列表。在编写程序时,查找算法是非常重要的,它有助于快速找到所需的数据。在本文中,我们将介绍一些基本的查找算法及其特点。原创 2024-09-27 15:00:00 · 1457 阅读 · 0 评论 -
【数据结构与算法】二叉树
对于前、中两种遍历,实际以上代码从右子树向回走时,并未走完全程(stack 提前出栈了)后序遍历以上代码是走完全程了。例如,下面的树遇到的第一个叶子节点 3 所在的层就是最小深度,其他 4,7 等叶子节点深度更深,也更晚遇到。上面两种情况满足时,不应该再把为 null 子树的深度 0 参与最小值比较,例如这样。效率会高于之前后序遍历解法,因为找到第一个叶子节点后,就无需后续的层序遍历了。对于数组表现的二叉树,则直接遍历数组即可,自然为层序遍历的顺序。,有大厂完整面经,工作技术,架构师成长之路,等经验分享!原创 2024-09-27 10:00:00 · 1062 阅读 · 0 评论 -
【数据结构与算法】堆
本文,已收录于,我的技术网站,有大厂完整面经,工作技术,架构师成长之路,等经验分享!原创 2024-09-26 16:00:00 · 764 阅读 · 0 评论 -
【数据结构与算法】阻塞队列
队列从 0 变化到不空,会唤醒一个等待的 poll 线程,这个线程被唤醒后,肯定能拿到 headLock 锁,因此它具备了唤醒 headWaits 上其它 poll 线程的先决条件。下面来看一个难题,就是如何通知 headWaits 和 tailWaits 中等待的线程,比如 poll 方法拿走一个元素,通知 tailWaits:我拿走一个,不满了噢,你们可以放了,因此代码改为。糟糕的是,由于指令交错的顺序不同,得到的结果不止以上一种,宏观上造成混乱的效果。两把锁这么嵌套使用,非常容易出现死锁,如下所示。原创 2024-09-26 10:00:00 · 1548 阅读 · 0 评论 -
【数据结构与算法】双端队列
双端队列、队列、栈对比定义特点队列一端删除(头)另一端添加(尾)栈一端删除和添加(顶)双端队列两端都可以删除、添加优先级队列优先级高者先出队延时队列根据延时时间确定优先级并发非阻塞队列队列空或满时不阻塞并发阻塞队列队列空时删除阻塞、队列满时添加阻塞Java 中 LinkedList 即为典型双端队列实现,不过它同时实现了 Queue 接口,也提供了栈的 push pop 等方法注2:不同语言,操作双端队列的方法命名有所不同,参见下表操作JavaJavaScript。原创 2024-09-25 16:00:00 · 1509 阅读 · 0 评论 -
【数据结构与算法】栈
计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书先提供一个栈接口/*** 向栈顶压入元素* @param value 待压入值* @return 压入成功返回 true, 否则返回 false/*** 从栈顶弹出元素* @return 栈非空返回栈顶元素, 栈为空返回 null*/ E pop();/*** 返回栈顶元素, 不弹出。原创 2024-09-25 10:00:00 · 368 阅读 · 0 评论 -
【数据结构与算法】队列
计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头,就如同生活中的排队买商品queue先定义一个简化的队列接口/*** 向队列尾插入值* @param value 待插入值* @return 插入成功返回 true, 插入失败返回 false/*** 从对列头获取值, 并移除* @return 如果队列非空返回对头值, 否则返回 null/*** 从对列头获取值, 不移除。原创 2024-09-24 16:00:00 · 1326 阅读 · 0 评论 -
【数据结构与算法】递归
2.3 递归1) 概述定义计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller instances of the same problem.比如单链表递归遍历的例子:void f(Node node) {原创 2024-09-24 10:00:00 · 1356 阅读 · 0 评论 -
【数据结构与算法】链表
定义在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续可以分类为[^5]单向链表,每个元素只知道其下一个元素是谁双向链表,每个元素知道其上一个元素和下一个元素循环链表,通常的链表尾节点 tail 指向的都是 null,而循环链表的 tail 指向的是头节点 head链表内还有一种特殊的节点称为哨兵(Sentinel)节点,也叫做哑元( Dummy)节点,它不存储数据,通常用作头尾,用来简化边界判断,如下图所示随机访问性能根据 index 查找,时间复杂度On。原创 2024-09-23 16:00:00 · 1377 阅读 · 0 评论 -
【数据结构与算法】数组
定义在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识arrayelementsorkey因为数组内的元素是连续存储知道了数组的数据起始地址BaseAddressBaseAddress,就可以由公式BaseAddressi∗sizeBaseAddressi∗size计算出索引iii元素的地址iii即索引,在 Java、C 等语言都是从 0 开始size。原创 2024-09-23 10:00:00 · 808 阅读 · 0 评论 -
【数据结构与算法】初识算法
定义在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算algorithm不正式的说,算法就是任何定义优良的计算过程:接收一些值作为输入,在有限的时间内,产生一些值作为输出。定义在计算机科学领域,数据结构是一种数据组织、管理和存储格式,通常被选择用来高效访问数据数据结构是一种存储和组织数据的方式,旨在便于访问和修改可以说,程序 = 数据结构 + 算法,它们是每一位程序员的基本功,下来我们通过对一个非常著名的二分查找算法的讲解来认识一下算法。原创 2024-09-22 20:32:32 · 1132 阅读 · 0 评论 -
红黑树
什么是红黑树红黑树依然是一棵二分搜索树,《算法导论》中的红黑树定义如下:每个节点或者是红色的,或者是黑色的根节点是黑色的每一个叶子节点(最后的空节点)是黑色的如果一个节点是红色的,那么他的孩子节点都是黑色的从任意一个节点到叶子节点,经过的黑色节点是一样的 在学习红黑树之前,我们有必要先学习一下什么是2-3树,学习2-3树不仅对于理解红黑树有帮助,对于理解B类树,也是有巨大帮助的。我们常用到的磁盘存储、文件系统、数据库等相应的数据存储都是采用的B类树这样的数据结构。什么是2-3树原创 2020-07-09 15:42:38 · 155 阅读 · 0 评论 -
AVL树(平衡二叉树)
什么是平衡二叉树?为什么叫AVL树? 因为AVL树是由 G.M.Adelson-Velsky 和 E.M.Landis 这两位俄罗斯科学家在1962年的论文中首次提出,是最早的自平衡二分搜索树结构。 由于AVL树是自平衡二分搜索树,所以本质上还是二分搜素树,也就是二分搜索树的性质AVL树都满足,由于二分搜索树在添加有序元素时,会退化成链表,造成时间复杂度为O(n),但AVL树是不会出现这种情况的,因为AVL树通过自平衡来解决了退化成链表的问题,关于二分搜索树,你可以看我之前二分搜索树(Binary原创 2020-07-09 15:39:31 · 177 阅读 · 0 评论 -
并查集(Union Find)
并查集介绍 我们之前讲的树结构,都是由父亲节点指向孩子节点,而并查集却是由孩子指向父亲的这样一种数据结构。 给出图中任意的两点,问这两点之间是否可以通过一个路径连接起来?并查集就是处理这类连接问题的很好的数据结构。即用来处理网络中节点的连接状态,这里的网络是个抽象慨念,可以是用户之间形成 的网络。其实这类连接问题我们也可以使用集合类来进行实现,即求两个集合的并集。本文设计的并查集主要支持两个操作:union(p,q) 并,对传入的两个数据p和q,在并查集内部将这两个数据,以及这两个数据所在的原创 2020-07-09 15:34:04 · 217 阅读 · 0 评论 -
Trie(字典树、前缀树)
文章目录什么是Trie?创建一棵Trie向Trie中添加元素Trie的查询操作对比二分搜索树和Trie的性能leetcode上的问题什么是Trie? Trie是一个多叉树,Trie专门为处理字符串而设计的。使用我们之前实现的二分搜索树来查询字典中的单词,查询的时间复杂度为O(logn),如果有100万(220)个单词,则logn大约等于20,但是使用Trie这种数据结构,查询每个条目的时间复杂度,和一共有多少个条目无关!时间复杂度为O(w),w为被查询单词的长度!大多数单词的长度小于10。 Tri原创 2020-07-09 15:15:57 · 484 阅读 · 0 评论 -
线段树(区间树)
文章目录为什么要使用线段树?什么是线段树?创建一棵线段树线段树的查询操作线段树的更新操作为什么要使用线段树?最经典的线段树问题:区间染色 有一面墙 ,长度为n,每次选择一段儿墙进行染色,m次操作后,我们可以看见多少种颜色? 例如上图,我们第一次将[1,8]的位置染成蓝色,然后再将[5,9]的位置染成黄色,然后将[6,15]的位置染成红色,最后把[12,15]的颜色染成绿色,我们通过这几次操作可以发现,图中被重复染色的位置是会被覆盖的,比如[12,15]这个位置显示被染成红色,然后又被染成了绿色原创 2020-07-09 15:08:27 · 414 阅读 · 0 评论 -
堆和优先队列
什么是优先队列? 我们在常见的线性结构中,已经知道什么是普通队列了,普通队列就是一种“先进先出,后进后出”的数据结构,即普通队列的出队顺序和入队顺序是一样的,但我们的优先队列,它的出队顺序和入队顺序无关,它的出队顺序是和优先级相关的,当然这个优先级我们可以自己定义。为什么使用优先队列? 举一个生活中的例子,就是医院里需要做手术的病人,医院不会根据哪个病人先来就先送去手术室,而是会根据病人生命危险的程度来决定应该谁先进入手术室。再说一个计算机中的例子,例如在操作系统中,进行任务的调度,在我们现在的操原创 2020-07-09 15:06:39 · 178 阅读 · 0 评论 -
集合和映射(Set And Map)
集合 Set Set是一种新的数据结构,类似于数组,但是不能添加重复的元素,基于Set集合的这个特性,我们可以使用Set集合进行客户统计和词汇统计等,集合中常用的方法如下:public interface Set<E> { void add(E e); //添加元素e,不能添加重复元素 boolean contains(E e); //当前集合中是否包含元素e void remove(E e); //删除元素e int getSize(); //获取当前集原创 2020-07-09 15:04:12 · 432 阅读 · 0 评论 -
二分搜索树(Binary Search Tree)
###什么是二叉树? 在实现二分搜索树之前,我们先思考一下,为什么要有树这种数据结构呢?我们通过企业的组织机构、文件存储、数据库索引等这些常见的应用会发现,将数据使用树结构存储后,会出奇的高效,树结构本身是一种天然的组织结构。常见的树结构有:二分搜索树、平衡二叉树(常见的平衡二叉树有AVL和红黑树)、堆、并查集、线段树、Trie等。Trie又叫字典树或前缀树。 树和链表一样,都属于动态数据结构,由于二分搜索树是二叉树的一种,我们先来说说什么是二叉树。二叉树具有唯一的根节点,二叉树每个节点最多有两个孩原创 2020-07-09 15:02:01 · 336 阅读 · 0 评论 -
常见的线性结构
前言 本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间复杂度分析,对不同的实现进行比较和优化,即侧重于代码实现。由于数据结构是实践性比较强的一个科目,希望大家在看这篇博客时,自己也去写一下代码,看一下运行结果是不是自己想要的,我也会贴出我的运行结果来进行分析。数组数组介绍 数组是在内存中存储相同数据类型的连续的空间,最大的优点:查询快速。 数组最好应用于“索引有语意”的情况,例如索引代表学生学号,我们可以根据学号获取这个学原创 2020-07-09 15:00:57 · 1107 阅读 · 0 评论