![](https://img-blog.csdnimg.cn/20210511094506536.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 81
常见数据结构与算法原理分析与代码实现。
愤怒的可乐
主要研究NLP、机器瞎学、大模型。添加微信:greyfoss_szu 一起交流~,添加时请备注CSND。
展开
-
图解B树
引言今天去面试面试官:mysql数据库索引这么快,知道是通过什么实现的吗?我(一脸懵逼):不知道面试官淡淡的说:你心里有没有点B数概念?我:(擦,不就是不知道吗,用得着骂人吗)当场站起来走了,回去搜了一下,才知道面试官问我知不知道B-树。今天我们要介绍的就是B树,看完这篇文章之后,我相信你心里一定有B树了。B树也称B-树,它是一颗平衡的多路搜索树。我们描述一颗B树时需要指定它的...原创 2020-04-18 15:45:26 · 1950 阅读 · 2 评论 -
一文带你弄懂什么是索引二叉堆
索引二叉堆是啥?索引二叉堆又称为最小索引优先队列。它的特点是堆元素位置不变,通常改变索引的位置来实现二叉堆的结构。原创 2020-03-31 08:58:17 · 883 阅读 · 2 评论 -
十分钟弄懂什么是跳表,不懂可以来打我
今天我们来学习一种可以快速查找、插入、删除的数据结构,据说可以代替红黑树。这些都不重要,重要的是原理简单,实现起来也简单!原创 2020-03-28 13:27:41 · 28812 阅读 · 60 评论 -
排序算法之——插入排序分析
前言最简单的排序算法之一是插入排序(insertion sort)。思路插入排序的思路是这样的:插入排序。由N-1趟排序完成,对于i=1到N-1趟,保证从位置0到位置i上的元素为已排序状态(但不保证已排序的值一定小于未排序的值)。过程:对于位置i,先把i位置的值保存起来,然后把i挖空。依次与前一个位置比较,比较i-1到0位置上的元素;若发现i对应的值小于某个位置的值,则将该位置的...原创 2019-04-30 11:22:26 · 1225 阅读 · 1 评论 -
图论算法——Prim算法和Kruskal算法
引言我们要学习的第一种计算最小生成树的算法,它每一步都会为一颗生长中的树添加一条边。下面分析下算法思路思路一开始这棵树只有一个顶点,然后会向它添加V-1条边,每次总是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入树中。每次当我们向(生成)树中添加了一条边之后,也向树中添加了一个顶点。要维护一个包含所有横切边的集合,就要将连接这个顶点和其他所有不在树中的顶点的边加入优先队列。要注...原创 2019-05-24 15:56:48 · 1254 阅读 · 0 评论 -
图论算法——加权有向图的数据结构
引言要解决最短路径问题,先引入加权有向图的数据结构。这和 加权无向图的数据结构很类似。有关概念可参考博文数据结构之图的概述加权有向边package com.algorithms.graph;/** * @author yjw * @date 2019/6/5/005 */public final class DirectedEdge { /** * 边的起...原创 2019-06-05 18:11:44 · 4529 阅读 · 0 评论 -
图论算法——最短路径算法
引言在Prim算法和Kruskal算法中,我们学习了寻找加权无向图的最小生成树的Prim算法:构造最小生成树的每一步都向生成树中添加一条新的边。今天要学习类似的方法来计算最短路径——Dijkstra算法。Dijkstra算法最短路径树中的边:edgeTo[v]的值为树中连接v和它的父节点的边。最短路径树:包含了顶点s到所有可达的顶点的最短路径...原创 2019-06-10 21:02:06 · 3121 阅读 · 0 评论 -
数据结构——树的概述
引言对于大量的输入数据,链表的线性访问时间太慢,不宜使用。本篇讨论一种简单的数据结构——树,它大部分操作的运行时间平均为O(logN)O(logN)O(logN)。数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。基本概念树(tree)是一些节点的集合。该集合可以是空集,若不是空集,则树由称为根(root)r的节点以及0个或多个非空的子树组成。每颗子树的根就做根...原创 2019-06-11 18:36:35 · 2735 阅读 · 0 评论 -
图解二叉查找树
引言二叉树的一个重要应用是它们在查找中的使用。二叉查找树(二叉排序树\二叉搜索树)定义:二叉查找树或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值左、右子树也分别为二叉查找树没有键值相等的节点上图中只有左边的是二叉查找树,右边的因为节点7属于根节点6的左子树,但是大...原创 2019-06-11 18:36:48 · 1439 阅读 · 3 评论 -
图解二叉树的遍历
引言本文介绍了二叉树的先/中/后序遍历的递归实现和非递归实现,以及层次遍历的实现。先序遍历所谓先序遍历,就是先访问根节点,再访问左右子节点。在这些遍历策略中,左子节点的访问都在右节点访问之前。我们以这样一颗二叉树为例,其实它是更为严格的二叉搜索树。对该树进行先序遍历,输出:3 1 0 8 5 16 11 10 13 19...原创 2019-06-13 18:38:35 · 1212 阅读 · 2 评论 -
图解AVL树
引言AVL树是带有平衡条件的二叉查找树,它保证树的深度须是O(logN)O(logN)O(logN)。特性:它每个节点的左子树和右子树的高度最多差1。空树的高度定义为-1。上图中左边的树是AVL树,而右边不是。右边树左子树高度为3,右子树高度为1,相差超过1。实现树节点结构private static class Node<E> { E data; No...原创 2019-06-18 17:43:33 · 1050 阅读 · 0 评论 -
图解双层伸展树
引言伸展树的出发点是这样的:考虑到局部性原理(刚被访问过的数据,极有可能很快地再次被访问),因此将刚被访问过的节点移(旋转)到根节点。如果没有了解过AVL树,建议先看下 图解AVL树伸展策略那么该如何旋转呢?逐层伸展联系刚刚学过的AVL树,我们可以从待访问的节点开始,逐层往上旋转。我们使用的手段无非是,当待访问节点v是左孩子,进行一次右旋操作。若是右孩子,则进行一次左旋操...原创 2019-06-26 18:04:27 · 676 阅读 · 0 评论 -
Java中的优先队列——二叉堆
前言今天在看ThreadPoolExecutor的介绍时,看到了它的workQueue中有一种优先任务队列,本质上是一个二叉堆(最多有2个孩子节点)。今天就来开始分析一下二叉堆这种数据结构优先队列和队列类似,但是出队的元素是优先级最高的元素。如下图所示,我们定义元素值越小,优先级越高。优先队列一般用二叉堆来实现。完全二叉堆完全二叉堆就结构性质上来说就是一个完全填满的二叉树,满足结构性...原创 2019-04-23 23:48:07 · 1098 阅读 · 2 评论 -
非递归归并排序详细分析
前言以前做的一个分析,今天把它发出来了代码import java.util.Arrays;import java.util.Random;import java.util.Scanner;/** * 归并排序的非递归实现,主要是思想 用 int 数组模拟 * 要先理解思路: 将待排序集合一分为二,直到 待排序集合只剩下 1 个元素为止 。 然后不断合并2个排好序的数组段。...原创 2018-07-03 13:58:47 · 2929 阅读 · 0 评论 -
Java二叉查找树最简单实现
什么是二叉树简单来说,二叉树首先是一棵树,然后有以下条件每个节点最多有2个孩子节点二叉树有一个根节点一个左子树(可能为空)一个右子树(可能为空)特例完全二叉树 叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树 满二叉树 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树...原创 2018-04-12 17:30:31 · 1079 阅读 · 0 评论 -
并查集Java实现
定义就是有“合并集合”和“查找集合中的元素”两种操作的关于数据结构的一种算法。连接两个对象判断是否这两个对象是连接的上例中,0,7是没有路径的;8,9之间有一条可达路径,因此是连接的。建模关于连接 * 等价性: p连接到p,每个对象都能连接到自己 * 对称性: p连接到q;等价于q连接到p * 传递性: 如果p连接到q,q连接到r,那么,p连接到r。快速查找数据结构这里用到的数据结构是数原创 2017-12-29 11:24:50 · 6660 阅读 · 5 评论 -
图论算法——加权无向图的数据结构
引言我们要在一幅加权连通无向图中找到它的最小生成树。首先要考虑的是如何表示这个无向图。加权边的表示package com.algorithms.graph;/** * 带权重的无向边的数据结构(不可变类) * * @author yjw * @date 2019/5/23/023 */public final class Edge implements Comparable&...原创 2019-05-24 10:59:22 · 5603 阅读 · 5 评论 -
栈和队列的Java实现
引言因为其他文章中用到了栈和队列,有时会进行改动。因此把实现贴在这里。暂且不分析实现原理。栈的实现package com.algorithms.stack;import java.util.ConcurrentModificationException;import java.util.Iterator;import java.util.NoSuchElementException...原创 2019-05-22 18:15:08 · 1089 阅读 · 0 评论 -
排序算法之——希尔排序分析
引言希尔排序的名称来源于它的发明者Donald Shell,是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。思路希尔排序使用一个序列,叫做增量序列。过程:将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序然后依次缩小增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序其中,初始增量为数组长度...原创 2019-04-30 18:20:23 · 590 阅读 · 0 评论 -
排序算法之——归并排序分析
引言接下来来分析第一个以KaTeX parse error: Expected 'EOF', got '\logN' at position 9: \Theta(N\̲l̲o̲g̲N̲)最坏情形时间允许的算法——归并排序,它使用的比较次数也几乎是最优的,是递归算法的一个好的实例。思路基本操作时合并两个已排序的序列,若将输出放到第3个序列中,则该算法可以通过对输入数据一趟排序来完成。序列一...原创 2019-05-06 11:01:33 · 513 阅读 · 0 评论 -
排序算法之——冒泡排序分析
引言好吧,据说是最简单的排序算法之一。思路排序过程中较小元素从后往前冒,因此成为冒泡排序;过程如下:通过从后向前依次的比较相邻两个数的大小重复地走访过要排序的序列,一次比较两个元素,如果它们的顺序错误则交换上图是我们随机生成的原始数组,接下来进行一趟排序:i=0,这趟排序完成后,如上图中右边数组所示,发送交换的情况是:2/5;2/7;2/4;2/3; 然后比较2与1,不需要...原创 2019-05-06 15:37:00 · 451 阅读 · 0 评论 -
排序算法之——选择排序分析
引言上篇文章中我们分析了冒泡排序,我们知道了冒泡排序可能需要N次交换和N次比较。N次比较在所难免,但N次交换是必须的么?今天我们介绍的选择排序方法只需要一次交换。思路思路也很简单:每趟从待排序的序列中选择最小的元素,放到已排序序列末尾;这里通过交换实现原地排序。我们对该序列进行排序:是不是和冒泡排序很相似,左边橙色部分是已排序序列,右边是待排序序列,且右边必不小于左边。并且,...原创 2019-05-06 17:28:50 · 296 阅读 · 0 评论 -
图解散列表
引言散列是一种用于以常数平均时间执行插入、删除和查找的技术。Java中Map就是基于它实现的。原理理想的散列表数据结构只是包含一些项(item)的具有固定大小的数组。而查找是对项的某个部分进行的,这部分就叫关键字(key)。注意,关键字未必是可比较的。散列表的大小记为TableSize,它也是散列数据结构的一部分。每个关键字(通过其hash值)都被映射到从0到TableSize - 1这...原创 2019-05-07 14:43:40 · 3298 阅读 · 0 评论 -
排序算法之——快速排序分析
引言本篇的主题是快速排序,它可能是应用最广泛的算法了。它的平均运行时间是O(NlogN)O(NlogN)O(NlogN),最坏情形性能为O(N2)O(N^2)O(N2),但只需做一点改进就可以使这种情形很难出现。public static void sort(List<Integer> items) { if (items.size() > 1) { ...原创 2019-05-09 20:30:23 · 1103 阅读 · 0 评论 -
排序算法之——三路快排分析
引言在快速排序分析中我们探讨了经典快排的实现,已经进行了一些小优化。但是若序列中包含大量重复的元素,这种情况下,快排的性能就不那么理想了。在下篇文章中我们会一起学习双基准快速排序,学习完了之后,我们再一起来看一下这三种快排算法的实际运行性能。下面开始学习三路快排的思想吧。思路将数组分为三部分,分别对应于小于、等于和大约哨兵元素v的子序列。切分方法为从左到右遍历(扫描)数组一次,维护一...原创 2019-05-10 17:49:49 · 2049 阅读 · 0 评论 -
数据结构——图的概述
基本术语图G=(V,E)G=(V,E)G=(V,E)由顶点(vertex)的集V和边(edge)的集E组成。边:每一条边就是一副点对(v,w),有时也称为弧有向图:边是有方向的图原创 2019-05-15 11:43:25 · 16974 阅读 · 6 评论 -
图论算法——环和有向无环图
环和有向无环图在有向图相关的实际应用中,有向环特别重要。一幅图可能含有大量的环,通常,我们一般只关注它们是否存在。调度问题给定一组任务并安排它们的执行顺序,限制条件为这些任务的执行方法、起始时间以及任务的消耗等。最重要的一种限制条件叫做优先级限制,它指定了哪些任务必须在哪些任务之前完成。不同类型的限制条件会产生不同难度的调度问题。以一个正在安排课程的大学生为例,有些课程是其他课程的先导课程...原创 2019-05-20 18:21:06 · 28170 阅读 · 4 评论 -
图论算法——无向图的邻接链表实现
引言比如有个这样的无向图(看起来很像二叉树吧,其实二叉树是一种特殊的图),通过邻接链表表示如下:我们通过索引表示顶点,索引指向的为一个链表(表示该顶点相邻的所有顶点,比如顶点2相邻的顶点为:0,1,3)。因为是无向图,若增加0-2边,会在0对应的链表中增加2,相应地也会在2对应的链表中增加0。通过代码实现时,我们进行一个优化,不使用链表这种数据结构,而是用集合(不会存在相同元素)。这种实...原创 2019-05-20 18:27:06 · 8721 阅读 · 0 评论 -
图论算法——有向图的邻接链表实现
引言给定有向图如下:注意0和2节点之间的双向箭头表示0→2和2→0的两条边。代码package com.algorithms.graph;import java.util.HashSet;import java.util.Set;/** * 有向图 * * @author yjw * @date 2019/5/15/015 */@SuppressWarnings("...原创 2019-05-20 18:30:32 · 4800 阅读 · 0 评论 -
图论算法——无向图的深度优先搜索和广度优先搜索
深度优先搜索类似树的深度优先遍历,所谓深度优先即递归的对相邻节点进行访问。从图来访问的越来越深。在访问某个顶点时:将它标记为已访问递归地访问它的所有没有标记过的临接顶点package com.algorithms.graph;/** * 图的深度优先搜索 * @author yjw * @date 2019/5/16/016 */public class DepthF...原创 2019-05-20 18:39:15 · 5506 阅读 · 0 评论 -
图论算法——有向图的可达性与寻路
有向图的可达性利用了有向图的深度优先算法,它解决了单点连通性的问题,可以判定其他顶点和给定的起点是否连通。package com.algorithms.graph;/** * @author yjw * @date 2019/5/20/020 */public class DirectedDFS { private boolean[] marked; publi...原创 2019-05-20 18:46:10 · 5014 阅读 · 2 评论 -
排序算法之——堆排序分析
前言上一篇文章中对堆进行了分析,接下来趁热打铁,一起来学习一下堆排序算法。思路回忆建立N个元素的二叉堆的基本策略,这个阶段花费O(N)时间,然后我们执行N次deleteMin操作,按照顺序,最小的元素先离开堆,离开之后,我们让堆缩小1,位于堆中最后的单元就可以用来存放刚刚删除的元素。这样可以得到逆序排序。为了得到正序排序,我们用大顶堆即可,每次把堆中最大的元素删除。有点类似选择排序的思...原创 2019-04-29 20:58:48 · 1266 阅读 · 0 评论 -
图论算法——无向图的连通分量
引言深度优先搜索的一个直接应用就是找出一幅图的所有连通分量。原创 2019-05-22 19:19:37 · 30461 阅读 · 9 评论 -
图论算法——有向图中的强连通性
引言本文我们着重分析下有向图的强连通性以及其应用。强连通在一幅无向图中,如果有一条路径连接顶点v和w,则它们就是连通的;然后,在一幅有向图中,如果从顶点v有一条有向路径达到w,则顶点w是从顶点v可达的,但如果从w到达v的路径可能不存在。这两个顶点不是强连通的。如果两个顶点互相可达,则它们是强连通的。如果一幅有向图中任意两个顶点都是强连通的,则这幅有向图也是强连通的。强连通分量有向图...原创 2019-05-23 16:24:10 · 19404 阅读 · 1 评论