数据结构
文章平均质量分 95
记录学习数据结构的历程
SunAlwaysOnline
开始工作的第3年!
展开
-
探究MySQL的索引结构选型
本文将探究MySQL索引结构的技术选型,分析哈希表、二叉搜索树、AVL树、红黑树、B树与B+树各自的优缺点。解释了MySQL最终选择B+树作为其索引的组织方式的原因,并在最后增加了3道常问的面试题。原创 2021-11-20 14:15:15 · 5271 阅读 · 3 评论 -
带你一步一步认识跳跃链表
一、链表单链表是一种很常见的数据结构,其进行查找时,需要从头开始遍历,直到查找到指定的值,因此查找的时间复杂度为O(n)。双链表在单链表的基础上,为每个结点增加前驱指针(pre)。那么在查找的时候,可以从两头开始遍历。因此双链表的查询效率高于单链表,不过其实在使用率上,单链表的使用率远远高于双链表。具体原因可以先移步我的另外一篇文章谈谈单链表和双链表...原创 2020-10-24 15:04:16 · 1616 阅读 · 0 评论 -
【leetcode.101】对称二叉树
一、题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3] 是对称的。但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的:进阶:你可以运用递归和迭代两种方法解决这个问题吗?二、思路所谓对称二叉树,即如下图所示:那么,对于任意一对结点p、q,都有这样的性质:p.left.val=q.right.val,p.right.val=q.left.val如果使用递归,我们大可以写出一个判断两个互为镜像位...原创 2020-10-15 20:04:56 · 502 阅读 · 2 评论 -
【leetcode.547】朋友圈(形象生动讲解并查集)
本文转载自Union-Find 算法详解今天讲讲 Union-Find 算法,也就是常说的并查集算法,主要是解决图论中「动态连通性」问题的。名词很高端,其实特别好理解,等会解释,另外这个算法的应用都非常有趣。说起这个 Union-Find,应该算是我的「启蒙算法」了,因为《算法4》的开头就介绍了这款算法,可是把我秀翻了,感觉好精妙啊!后来刷了 LeetCode,并查集相关的算法题目都非常有意思,而且《算法4》给的解法竟然还可以进一步优化,只要加一个微小的修改就可以把时间复杂度降到 O(1)。废话转载 2020-09-28 14:51:56 · 672 阅读 · 0 评论 -
【leetcode.235】二叉搜索树的最近公共祖先
一、题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出...原创 2020-09-27 13:52:39 · 372 阅读 · 1 评论 -
【leetcode.106】从中序与后序遍历序列构造二叉树
一、题目描述根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder =[9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树:二、思路思路来源于图解构造二叉树之中序+后序,画得图是真心棒前提解决此问题的关键在于要很熟悉树的各种遍历次序代表的什么,最好能够将图画出来。本题解带你先进行中序遍历和后续遍历二叉树,然后再根据遍历结果将二叉树进行还原。首先,来.原创 2020-09-25 16:18:23 · 3223 阅读 · 0 评论 -
【leetcode.232】用栈实现队列
一、题目描述使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false...原创 2020-09-24 21:29:30 · 1217 阅读 · 0 评论 -
【leetcode.347】前 K 个高频元素
一、题目描述给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) ,n是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任...原创 2020-09-24 20:47:18 · 346 阅读 · 0 评论 -
【leetcode.226】翻转二叉树
一、题目描述翻转一棵二叉树。示例:二、题目背景Homebrew的作者Howell去面试谷歌惨遭拒绝,因为他不会翻转二叉树,即使谷歌公司90%的工程师都在使用他写的软件。之后LeetCode把这道题纳入了题库,并将难度标记为简单题...我要是会了这道题,那我可以进谷歌啊?当然,把这件事当做一个小故事看看算了。企业拒绝一个人才的原因有很多,我在知乎上看到一些很有意思的回答。如何评价 Homebrew 作者因为不会在白板上翻转二叉树而被谷歌面试拒绝?三、思路在这里放原创 2020-09-24 16:34:43 · 427 阅读 · 0 评论 -
【leetcode.108】将有序数组转换为二叉搜索树
一、题目描述将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:二、思路二叉搜索树,即对于其中任何一个结点node,其左子树上的节点值都小于等于node值,其右子树上的结点都大于等于node值,那么其中序遍历正好就是一个升序数组。题目要求这棵树是一个平衡树,因此树中任意一个节点左右两个子树的高度差不可以超过1。所以我们可以将数组最中间元素或紧靠中间左右两边的元素(即nums[.原创 2020-09-24 14:02:35 · 326 阅读 · 0 评论 -
【leetcode.617】合并二叉树
一、题目描述给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点。示例1:注意:合并必须从两个树的根节点开始。二、思路使用深度优先策略,遍历两颗二叉树的同一个位置,会出现以下情况两个节点都为null,则合并后的节点也为null两个节点都不为null,则创建一个新的节点,其值为...原创 2020-09-23 17:38:48 · 446 阅读 · 0 评论 -
【leetcode.559】N叉树的最大深度
一、题目描述给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。例如,给定一个3叉树:我们应返回其最大深度,3。说明:树的深度不会超过1000。 树的节点总不会超过5000。二、思路采用深度优先搜索,递归获取子节点的最大深度,接着更新maxRootDepth即可。该方案的时间复杂度为O(N),N代表节点总数,空间复杂度为O(1)。 public int maxDepth(Node root) { ...原创 2020-09-23 15:06:15 · 402 阅读 · 0 评论 -
一步一步推导出 Mysql 索引的底层数据结构
Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。我们知道,索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同数据结构的选择,实现各种数据快速检索。在数据库中,高效的查找算法是非常重要的,因为数据库中存储了大量数据,一个高效的索引能节省巨大的时间。比如下面这个数据表,如果 Mysql 没有实现索引算法,那么查找 id=7 这个数据,那么只能采取暴力顺序遍历转载 2020-05-18 09:48:33 · 348 阅读 · 0 评论 -
【数据结构】谈谈单链表和双链表
首先谈谈数组和单链表的区别数组的特点在内存中连续 利用下标定位元素,因此查找操作的时间复杂度为O(1) 增加与删除元素时,需要进行移动,因此增加与删除操作的时间复杂度为O(n) 数组大小固定,不能直接扩容。如果需要扩容,也是创建一个更大的数组,再将元素复制过去。链表的特点在内存中可以不连续 增加与删除元素的操作很方便,只需要移动指针,不需要移动元素,因此增加与删除的操作的时间...原创 2020-03-26 17:40:07 · 3849 阅读 · 0 评论 -
【数据结构】求二叉树的最大深度
求二叉树的最大深度二叉树的最大深度即二叉树的高度,一般有两个解法,第一种是递归,代码简单,但不太好理解。第二种是使用层序遍历的方式,记录每层的节点数,遍历完一层,层数计数器加一。一、递归想要求一颗二叉树的高度,即求孩子节点的最大深度,要么是左孩子,要么是右孩子,那么我们只需要对传入的孩子节点递归调用即可。...原创 2018-11-02 20:25:49 · 18064 阅读 · 2 评论 -
【JAVA面试】JAVA常考点之数据结构与算法(1)
JAVA常考点之数据结构与算法(1)JAVA常考点之数据结构与算法目录1、二分查找 12、冒泡排序 33、层序遍历二叉树 44、选择排序 55、反转单链表 66、插入排序 77、判断链表是否有环 88、快速排序 119、求二叉树最大的深度(宽度) 1210、爬楼梯 1311、合并两个有序链表...原创 2018-10-28 12:46:37 · 12132 阅读 · 6 评论 -
【数据结构】树的遍历
树的遍历以前序遍历为例(1)先遍历树根(2)然后前序遍历左子树(3)最后前序遍历右子树对于这样的一个二叉树前序遍历结果:ABDEGCF遍历流程:【1】首先遍历树根,输出A【2】对A的左子树进行前序遍历,怎么前序遍历?对于B这个左子树而言,首先遍历根...原创 2018-08-06 20:49:06 · 16758 阅读 · 2 评论 -
【数据结构】各种数据结构的简单特点
各种数据结构的简单特点1、列表包括(1)数组【1】会在内存中开辟一个连续的内存空间【2】随机访问的效率比链表高。数组只要给定下标,则可以直接定位到该下标所对应的元素,而链表每次都是从头节点开始遍历。【3】对元素的增删操作的效率比链表低。这里说的是从数组的中间插入或删除一个元素,并且数组中元素...原创 2018-08-06 19:33:46 · 8957 阅读 · 0 评论