数据结构与算法
数据结构与算法总结,这部分内容学习自拉钩教育的算法课程,大部分内容都来自课程pdf。
jiqiren1994
基本所有文章都是总结性质得文章,将网上大部分博主的内容整合了一下,加入了部分自己的理解,方便自己工作时查阅资料用,好处就是不用忘记了去搜各种文章。
展开
-
B树与B+树
一、B树1.1 简介一个n叉树数据结构,每个节点通常有多个孩子。1.2 特点m阶的B树具有如下特征根结点要么没有子女要么至少有两个子女每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m每一个叶子节点都包含k-1个元素,其中m/2 <= k <= m所有的叶子结点都位于同一层节点中的元素从小到大排列,节点中k-1个元素正好是k个孩子包含的元素的值域分划二、B+树2.1 简介B树的一个升级版,充分利用节点空间,查询速度接近于二分查找。原创 2021-09-15 00:28:44 · 88 阅读 · 0 评论 -
红黑树学习
一、红黑树简介1972年Rudolf Bayer发明,称为平衡二叉B树(symmetric binary B-trees),在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为“红黑树”,一种特化的AVL树,在插入和删除时通过特定操作保持二叉查找树的相对平衡,从而获得较高的查找性能。红黑树不是严格的AVL树,只是黑色平衡,如上图所示,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的。二、红黑树特点符合二叉搜索树基本特性,同时具备以下特性:原创 2021-09-14 14:36:40 · 332 阅读 · 1 评论 -
滑动窗口 Sliding window
一、滑动窗口简介像窗口一样滑动,窗口内大部分元素不变。滑动窗口的应用: 网络限流,令牌桶算法。二、滑动窗口特点用以解决数组/字符串的子元素问题,查找满足一定条件的连续区间的问题,例如“请找到满足xx的最x的区间(子串、子数组)的xx。可以将嵌套的循环问题转换为单循环问题,当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,从而减少重复计算,降低了时间复杂度。三、示例题目3.1 固定长度窗口给定一个整数数组,计算长度为 k 的连续子数组的最大总和。暴力解法:从头开始计算相邻k个总和原创 2021-09-14 11:38:48 · 424 阅读 · 0 评论 -
树映射 TreeMap常用方法总结
lowerKey(key1): 小于key1的最大的键值对所对应的KEYhigherKey(key1):大于key1的最小的键值对所对应的KEYfloorKey (key1): 小于等于key1的最大的键值对所对应的KEYceilingKey(key1):大于等于key1的最小的键值对所对应的KEYlowerEntry()、higherEntry()ceilingEntry()、floorEntry()...原创 2021-09-14 11:22:17 · 279 阅读 · 0 评论 -
单调栈学习
一、单调栈简介一类具备单调性(顺序)的特殊栈普通栈,对入栈的数据没有顺序要求,单调栈要求栈中的数据是有序的。、二、递增栈与递减栈单调递增栈:栈中数据出栈的序列为单调递增序列单调递减栈:栈中数据出栈的序列为单调递减序列三、代码实现Stack<Integer> stack=new Stack<>();for (int value:array) { if (stack.isEmpty() ||stack.peek()>=value){ //栈为空或 栈顶元原创 2021-09-14 11:20:42 · 81 阅读 · 0 评论 -
位图BitMap
一、位图简介用二进制的每一位来压缩存放很多数据的状态,通常用于判断某个数据是否存在。如果某个数字存在就在对应位置置为1,比如标识0、8、22三个数字存在。位图的大小取决于要存放的数据范围,数据到下标的对应关系需自行设计,超过32位可分段存储。二、位图常见操作2.1 采用位运算快速将某个位置置为1采用按位或int bitMap;public void setBit(int pos) { int bit = 1 << pos; bitMap |= bit;}采用按位异或调原创 2021-09-14 11:03:56 · 287 阅读 · 0 评论 -
动态规划:监控二叉树
一、题目描述给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。二、理解题意在本题中,每个节点可以监视父节点、自身以及子节点要求在所有节点都被监视到时候所需最小的摄像头的数目摄像头放到非叶子节点上监视的范围最大(父节点+左右子节点)任意一个节点是否放置摄像头取决于其父节点+左子节点+右子节点的状态三、解法一:暴力搜索从上往下,依次搜索所有可能性,取最小interval=2, 则当原创 2021-09-14 10:09:37 · 131 阅读 · 0 评论 -
动态规划学习
一、动态规划学习动态规划来源于运筹学,是求解决策过程最优化的一种数学方法。在20世纪50年代初美国数学家R. E.Bellman等提出的最优化原理,动态规划的核心思想是利用各阶段之间的关系,逐个求解,最终得到全局最优解。设计一个动态规划算法的关键点是确认原问题与子问题、动态规划的状态、边界状态值和状态转移方程等。二、动态规划解题步骤想清楚原问题与子问题设计状态设计状态转移方程确定边界状态值三、动态规划示例-爬楼梯3.1 题目描述在爬楼梯的时候,每次可以往上爬1阶台阶或2阶台阶,问n原创 2021-09-13 22:34:23 · 375 阅读 · 0 评论 -
位运算学习
一、位运算符二、常见的位运算问题2.1 异或特点n^n=0 n^0=n数组中每个数字都出现了两次,只有一个出现了一次,找到出现一次的数字(leetcode 136)根据异或特点n^n=0 n^0=n,异或到最后只剩下0^npublic static int singleNumber(int[] nums) { int num = 0; for (int i = 0; i < nums.length; i++) { num = num ^ nums[i]; } re原创 2021-09-13 21:31:24 · 85 阅读 · 0 评论 -
回溯的理解
递归是一种算法结构,而回溯是一种算法思想,可以用递归实现。回溯就是一种试探,类似于穷举,但回溯有“剪枝”功能。如在求和问题。给定7个数字,1 2 3 4 5 6 7求和等于7的组合。从小到大搜索,选择1+2+3+4 =10>7,则5 6 7就没必要再继续了,这就是剪枝。从问题的某一种可能出发, 搜索从这种情况出发所能达到的所有可能, 当这一条路走到“尽头”的时候, 再倒回出发点, 从另一个可能出发, 继续搜索。这就是回溯。...原创 2021-09-13 17:32:17 · 1748 阅读 · 0 评论 -
最小生成树+并查集: 找到最小生成树的关键边和伪关键边
一、题目描述找到最小生成树里的关键边和伪关键边。给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。请你找到给定图中最小生成树的所有关键边和伪关键边。如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。伪原创 2021-09-13 15:00:09 · 176 阅读 · 0 评论 -
生成树和最小生成树
一、生成树和最小生成树简介生成树(Spanning Tree):在无向连通图中,生成树是将图中所有顶点以 最少的边 连通的子图。• 图必须是无向连通图,非连通图和有向图都没有生成树的概念• 生成树是一个连通子图,是给定图的一个子集,它连接了所有节点且没有环• 生成树不止一种,生成树含有图中全部n个顶点,以及包含图中n-1条边最小生成树(Minimum Spanning Tree,MST ):生成树中,边的权值和最小,是“最小权重生成树”的简称。二、关键边和伪关键边关键边:如果从图中删去某条边,原创 2021-09-13 14:24:01 · 2644 阅读 · 0 评论 -
并查集学习
一、并查集简介并查集,处理一些不相交集合(Disjoint Sets)的合并及查询问题。常用于判断无向图中连通分量的个数和任意两个顶点是否连通。二、并查集操作初始化:把每个元素所在集合初始化为其自身合并(Union):把两个不相交的集合合并成一个集合,通常,合并之前会检查两个元素是否属于同一个集合。查询(Find):查询元素所在的集合(代表节点/代表元),也可以用于判断两个元素是否属于同一个集合。路径压缩(find):查找时,使节点x到root之间的所有节点都指向root。原创 2021-09-13 12:56:03 · 93 阅读 · 0 评论 -
并查集+深度优先:岛屿数量
一、题目描述岛屿数量。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。二、理解题意三、数据结构及算法思维选择四、解法一:广度优先搜索public int numIslands(char[][] grid) { if (grid == null || grid.length == 0) return 0; int gridLe原创 2021-09-13 12:28:13 · 155 阅读 · 0 评论 -
拓扑排序学习
一、拓扑排序思想在计算机科学领域,有向图的拓扑排序是对其顶点的一种线性排序,使得对于图中的每个有向边 uv,u 在排序中都在v之前。拓扑排序是对一个有向图的顶点进行排序。它关心的是图中各个顶点的连接关系,这种连接关系也叫拓扑关系,因为它不关心各个顶点的位置与距离。例如,图的顶点可以表示要执行的任务,边可以表示一个任务必须在另一个任务之前执行的约束;在这个应用中,拓扑排序只是一个有效的任务顺序。 当且仅当图中没有定向环时(即有向无环图),才有可能进行拓扑排序。对于下面的有向图,我们可以进行拓扑排序得到原创 2021-09-13 11:37:00 · 325 阅读 · 0 评论 -
矩阵中的最长递增路径
一、题目描述给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。二、理解题意问题建模将矩阵中每个元素当成一个节点,连接上下左右相邻的元素,我们可以得到一个图由于题目要求寻找最长递增路径,我们可以只保留从小元素指向大元素的有向边那么该问题也就变成了寻找有向图中的最长路径由于该图中的邻接关系是固定的,我们并不用显式构建邻接表或邻接矩阵,直接使用该矩阵即可三、解法一:深度优先遍历法p原创 2021-09-13 10:49:09 · 691 阅读 · 0 评论 -
图中最短路径:网络延迟时间
一、题目描述有 N 个网络节点,标记为 1 到 N。给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。二、理解题意• 我们需要找到从给定节点k发出的信号多久后可以到达所有节点。• 每条边都被赋予了长度(边权),即信号在该边传输所用的时间。• 观察:从原创 2021-09-12 23:57:47 · 297 阅读 · 0 评论 -
迪杰斯特拉算法
一、迪杰斯特拉算法简介• 迪杰斯特拉算法,是由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年发现的算法。戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题。• 迪杰斯特拉算法的主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。二、迪杰斯特拉算法主要思想定义一个节点集合D表示从源点k出发已经确定最短路径的前n近的节点比原创 2021-09-12 23:41:57 · 614 阅读 · 0 评论 -
图:节点间通路
一、题目描述节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。二、理解题意给定一些节点,某些节点间存在单向通路需要查找是否存在从节点a到节点b的通路例如图中存在0→1, 0→3, 0→2, 1→3的通路不存在3→1, 3→2, 3→0的通路额外信息• 节点数量n在[0, 100000],节点编号大于0小于n• 可能存在自环和平行边三、解法一:广度优先遍历public boolean findWhetherExistsPath(int n, int[][原创 2021-09-12 23:13:26 · 580 阅读 · 0 评论 -
数据结构—图
一、图的简介• 在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。• 顶点有时也被称为节点或者交点,边有时也称为链接。• 边可以是单向的,也可以是双向的。二、图的分类无向图:无向图是由顶点和边构成。有向图:有向图是由顶点和有向边构成。完全图:如果任意两个顶点之间都存在边叫完全图,有向的边叫有向完全图。如果无重复的边或者顶点到自身的边叫简单图。三、图的表示3.1 邻接矩阵• 使用一个n×n的布尔值矩阵原创 2021-09-12 22:55:30 · 79 阅读 · 0 评论 -
树状数组学习
一、什么是树状数组?二、树状数组的两个基本操作三、代码实现/** * * <p>树状数组或二叉索引树(英语:Binary Indexed Tree),以其发明者命名为Fenwick树。 * 其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题, * 现多用于高效计算数列的前缀和, 区间和。</p> * * <p>虽然BIT的名字是“二叉索引树”,实际上我们并没有使用一个“树”的结构去存储BIT对象, * 而是将其放原创 2021-09-12 22:40:36 · 75 阅读 · 0 评论 -
线段树学习
一、简介线段树是一种平衡二叉搜索树(完全二叉树),它将一个线段区间划分成一些单元区间。对于线段树中的每一个非叶子节点,表示区间[a, b]的和,它的左孩子表示的区间为[a,(a+b)/2],右孩子表示的区间为[(a+b)/2+1,b],最后的叶子节点数目为N,与数组下标对应。线段树一般包括建立、查询、插入、更新等操作,建立规模为N的时间复杂度是 O(NlogN),其他操作时间复杂度为O(logN) 。二、结构由于线段树是完全二叉树,线段树可以使用数组保存,对二叉树进行层次遍历。假设某个节点下标为i,原创 2021-09-12 16:34:51 · 138 阅读 · 0 评论 -
PriorityQueue学习
一、简介PriorityQueue是一个基于优先级的无界队列,Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。Java中PriorityQueue默认是最小堆,可以通过传入Comparator实现最大堆。二、使用//小顶堆,默认容量为11PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();//大顶堆,容量11PriorityQueue<Integer>原创 2021-09-12 16:03:06 · 97 阅读 · 0 评论 -
字典树学习
一、字典树介绍又叫做trie树或前缀树。是一种有序的、用于统计、排序和存储字符串的数据结构。关键字不直接保存在结点中,而是由结点在树中的位置决定,每个结点代表一个字符。根结点代表空字符串,第一层孩子结点到某个标记的结点代表了存储的字符串。一个结点及其所有子孙结点都有相同的前缀,也就是这个结点对应的字符串。只有叶子结点和某些被标记的内部结点,才存储了字符串。字典树最大优点是利用字符串的公共前缀来减少存储空间和查询时间,从而最大限度的减少无谓的字符串比较,是非常高效的字符串查找结构,插入和查找的时原创 2021-09-12 15:01:25 · 73 阅读 · 0 评论 -
二叉搜索子树的最大键值和
一、题目描述给出一棵root为根的二叉树,请你返回任意二叉搜索子树的最大键值和二、理解题意如何判断一棵子树是否是二叉搜索树?如何记录一棵子树的键值和?如何得到最大键值和?三、Choose 数据结构及算法思维选择四、后序遍历解法理解本题关键点在于判断一棵子树是否是BST• BST = 左子树是BST + 右子树是BST + 左子树最大值 < 根结点值 + 右子树最小值 >= 根结点值解法递归三要素确定函数等价关系式(参数,返回值)• 参数是根节点+目标值,返回值原创 2021-09-12 12:00:11 · 205 阅读 · 0 评论 -
二叉搜索树学习
一、简介如果左子树不为空,则左子树所有结点值都小于根结点的值。如果右子树不为空,则右子树所有结点值都大于或等于根结点的值。任意一棵子树也是一棵二叉搜索树。二、特点当你需要完成的功能是插入、删除、检索时,二叉搜索树具有极佳的性能二叉搜索树在排序、检索、数据库管理系统及人工智能等方面广泛应用二叉搜索树的中序遍历序列是一个递增的序列三、二叉搜索树的建立给定一个序列,对序列的每一个元素插入到二叉搜索树:如果二叉搜索树为空,则该元素即为根结点如二叉搜索树为非空,如该元素值小于根结点值,插原创 2021-09-12 11:29:59 · 96 阅读 · 0 评论 -
二叉树的莫里斯遍历
一、中序遍历1.1 算法思路中序遍历要求每个结点被遍历一次,最优时间复杂度为O(n),递归和迭代都需要记录中间状态。注意观察需要改变指向的节点的共同特点• E是A的左子树的中序遍历最后一个点(可以理解为最近的前继节点)• D是B的中序遍历最后一个点(可以理解为最近的前继节点)1.2 算法描述假设当前遍历至结点x:如果x没有左子树,将其加入目标序列,再遍历右子树,x=x.right如果x有左子树,找到左子树上中序遍历最后一个结点(记作ex-point)• 如果ex-point的右子树为原创 2021-09-11 23:13:50 · 155 阅读 · 0 评论 -
二叉树的最大深度
一、题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点最长路径上的节点数。二、理解题意二叉树最大深度:该二叉树所有深度的最大值。三、Choose 数据结构及算法思维选择DFS(递归)BFS是横向遍历每一个节点,需要O(n)的空间复杂度DFS将会纵向遍历节点,在遍历每个节点时,即可得到当前节点至根节点的深度,无需存储四、代码实现// 递归三要素// 1)确定函数等价关系式(参数,返回值)。参数是传入树的根节点,返回值是树的深度public int ma原创 2021-09-11 21:41:35 · 247 阅读 · 0 评论 -
树结构的学习
一、定义树(tree)是n(n>0)个结点(node)的有限集T,其中:有且仅有一个特定的结点,称为根(root)当n=0时,称为空树。当n>1时,其余结点可分为m(m>0)个互不相交的有限集,每个集合本身是一棵树,称为根的子树(subtree)。二、树的性质结点(node):树的元素,包括数据项+若干指向其子树的分支结点的度(degree):结点拥有的子树的数目叶子(leaf):度为0的结点结点的层次(level):从根结点算起,根为第一层,其孩子为第二层 ……原创 2021-09-11 20:59:33 · 98 阅读 · 0 评论 -
二分查找学习
一、算法简介使用折半的方式在有序数组中查找某一特定元素。二、算法描述从数组的中间元素开始查找,如果中间元素等于目标元素,查找结束;• 如果中间元素小于目标元素,则在右半部分继续查找;• 如果中间元素大于目标元素,则在左半部分继续查找;• 如果在某一步骤数组为空,则代表找不到,查找结束;每一次比较都使查找范围缩小一半。三、算法实现//二分查找算法,在a[start] ~ a[end]中查找keypublic int binarySearch(int key, int a[], int st原创 2021-09-11 17:01:06 · 51 阅读 · 0 评论 -
归并排序学习
一、算法简介归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。二、算法描述归并排序是用分治思想,分治模式在每一层递归上有三个步骤:分解(Divide):将n个元素分成个含n/2个元素的子序列。解决(Conquer):用合并排序法对两个子序列递归的排序。合并(Combine):合并两个已排序原创 2021-09-11 16:26:33 · 56 阅读 · 0 评论 -
分治算法:排序矩阵查找
一、题目描述给定M×N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。二、理解题意输入一个整形矩阵,查找某元素是否在矩阵中出现矩阵的每一行、每一列都按升序排列三、数据结构及算法思维选择3.1 数据结构选择二维矩阵3.2 算法思维选择从矩阵右上方元素开始,比较当前元素与目标值的大小• 若当前元素等于目标值,那么返回true• 若当前元素小于目标值,那么当前元素左侧的元素都会小于目标值,指针下移• 若当前元素大于目标值,那么当前元素右下方的元素都会大于目标值,指针左移•原创 2021-09-11 13:44:18 · 541 阅读 · 0 评论 -
分治算法学习
一、简单介绍把复杂的问题分成两个或更多的相同或相似的子问题,直到子问题可直接求解,原问题的解即子问题的解的合并。在计算机科学中,分治法一种很重要的算法范式。是很多高效算法的基础,如二分查找,快速排序,归并排序。二、分治法解题的一般步骤(1)分解:将要解决的问题划分成若干规模较小的同类问题;(2)求解:递归地求解各个子问题,当子问题划分得足够小时,用较简单的方法解决;(3)合并:按原问题的要求,将子问题的解逐层合并构成原问题的解。...原创 2021-09-11 13:35:37 · 89 阅读 · 0 评论 -
选择排序学习
一、选择排序思想依次从数组或者队列的开头取出第一个数,第二个,第n个和后面的数进行比较。把每次比较得到的最大值或者最小值放在数组的最前面。二、选择排序实现public class SelectSort{ public static void main(String[] args) { Solution26 solution = new Solution26(); int[] arr= {5,3,1,10}; solution.sor原创 2021-09-11 11:55:42 · 48 阅读 · 0 评论 -
递归的学习
一、概念数学与计算机科学范畴,是指在函数的定义中使用函数自身的方法。递归算法是一种直接或者间接调用自身函数的算法。二、本质递归,去的过程叫"递",回来的过程叫"归",递是调用,归是结束后回来。是一种循环,而且在循环中执行的就是调用自己。三、递归三要素结束条件函数主功能函数的等价关系式(参数、返回值、关系)四、递归方法模板public int recursion(int n) { //结束条件 if (n == 1) { return 1; } //do something原创 2021-09-11 11:04:41 · 49 阅读 · 0 评论 -
双端队列学习
一、简介Deque是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。二、用途Deque有三种用途:普通队列(一端进另一端出):Queue queue = new LinkedList()或Deque deque = new LinkedList()双端队列(两端都可进出)Deque deque = new LinkedList()堆栈Deque d原创 2021-09-10 22:32:07 · 54 阅读 · 0 评论 -
哈希表与哈希算法
一、哈希表哈希表,也叫散列表,把关键码值映射到表中的一个位置,以加快查找速度。二、哈希函数哈希表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。Hash算法:这类算法接受任意长度的二进制输入值,对输入值做换算(切碎),最终给出固定长度的二进制输出值。MD5 可能是最著名的一种Hash算法。三、哈希冲突哈希冲突的解决:开放寻址;再散列;链地址法;推荐查看本篇文章 java中哈希表及其应用详解...原创 2021-09-10 22:11:15 · 496 阅读 · 0 评论 -
双指针-删除排序数组的重复项
一、题目描述给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。二、理解题意删除重复出现的元素,使每个元素只出现一次返回移除后数组的新长度双指针解法:定义两个指针(索引)分别指向目标位和待移动元素位• 初始目标位为0,待移动元素位为1比较两个指针对应的数据• 比较相等:目标位不变,待移动位加1• 比较不等:目标位加1,待移动元素赋值到目标位;待移动位原创 2021-09-10 21:39:52 · 125 阅读 · 0 评论 -
跳表的结构学习
一、简介跳表是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度更短,其设计思想与链表相似。Skip List,跳跃表,简称跳表实质是一种可以进行二分查找的链表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找,以空间换时间二、跳表的特点多层结构,每一层随机概率产生每一层都是有序链表,默认升序,最底层包含所有元素,即原链表每个节点包含两个指针:向右(right,同级链表)、向下(down,下级链表原创 2021-09-10 18:33:55 · 251 阅读 · 0 评论 -
快慢指针-追击问题
一、题目描述给定一个链表,判断链表中是否有环。存在环返回 true ,否则返回 false。二、理解题意可以理解为“追击”问题,如果存在环,跑得快的一定能追上跑得慢的。快慢指针法:当我们在遍历链表的时候,我们设计两个指针,分别是快指针和慢指针,块指针每次走2步,而慢指针每次走1步,这样的话在当我们两个指针在链表中,如果会第二次相遇则说明这里面的链表是环形链表。三、Choose 数据结构及算法思维选择数据结构:两个变量,只需要额外定义slow和fast两个变量算法思维:遍历、快慢指针原创 2021-09-10 17:29:44 · 148 阅读 · 0 评论