数据结构
文章平均质量分 72
JarvanStack
保持简单
展开
-
[算法]剑指offer p9斐波那契数列 golang
[算法]剑指offer p9斐波那契数列 golang题目题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:思路循环的效率远远高于递归代码 golangpackage mainimport ( "testing" "github.com/stretchr/testify/assert")func TestP9(t *testing.T) { examples := []struct { n uint expec原创 2022-02-12 12:29:10 · 435 阅读 · 0 评论 -
[算法]剑指offer p7用2 栈实现一个队列 golang
[算法]剑指offer p7用2 栈实现一个队列 golang题目题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能思路栈是先进后出, 队列是先进先出(比如入队列 1 2 3 4, 我们出队列也要 1 2 3 4 )要点: push 的的时候退路左栈中, pop 的时候需要将左栈的元素全部搬空到右栈代码: golangpackage mainimport ( "fmt" "原创 2022-02-12 11:43:53 · 322 阅读 · 0 评论 -
golang set 集合类的实现
golang set 集合类的实现简介Set 是一种常见的集合类不允许储存同样的元素, 并提供交集, 并集, 差集的方法(常用作推荐系统)比如 redis 中的 set 和 zset , java 中的 HashSetGolang 中没有官方的集合类下面基于 golang 的map 实现基本的集合的, 可以配置是否需要线程安全接口方法type SetIn interface { //添加 Add(element interface{}) //批量添加 AddALL(elements [原创 2022-02-12 10:43:04 · 1829 阅读 · 0 评论 -
文章的评论及回复表的数据库设计方法
需求:可以评论文章,可以恢复评论,可以多级的互相回复1.思路一:做层级的关系做出来是效果就是只能一次层一层展示## 【文章】大家对大一开学有没有什么问题? A: 请问军训的枪是自己带还是学校里发?点击展开评论## 【文章】大家对大一开学有没有什么问题? A: 请问军训的枪是自己带还是学校里发? -B回复A:自己带 -C回复A:学校发点击展开评论## 【文章】大家对大一开学有没有什么问题? A: 请问军训的枪是自己带还是学校里发? -B回复A:自己带原创 2021-03-04 20:42:15 · 1781 阅读 · 6 评论 -
平衡二叉树详解 通俗易懂
平衡二叉树(AVL)阅读之前请先了解 二叉搜索树平衡二叉树定义:任意节点的子树的高度差都小于等于 11. 为什么使用「平衡二叉树」二叉树能提高查询的效率 O(logn),但是当你插入 {1,2,3,4,5,6} 这种数据的时候,你的二叉树就像一个「链表」一样,搜索效率变为 O(n)于是在 1962 年,一个姓 AV 的大佬(G. M. Adelson-Velsky) 和一个姓 L 的大佬( Evgenii Landis)提出「平衡二叉树」(AVL) 。于是插入 {1,2,3,4,5,6}原创 2021-01-23 10:33:35 · 1210 阅读 · 2 评论 -
平衡二叉树详解 通俗易懂
平衡二叉树(AVL)阅读之前请先了解 二叉搜索树平衡二叉树定义:任意节点的子树的高度差都小于等于 11. 为什么使用「平衡二叉树」二叉树能提高查询的效率 O(logn),但是当你插入 {1,2,3,4,5,6} 这种数据的时候,你的二叉树就像一个「链表」一样,搜索效率变为 O(n)于是在 1962 年,一个姓 AV 的大佬(G. M. Adelson-Velsky) 和一个姓 L 的大佬( Evgenii Landis)提出「平衡二叉树」(AVL) 。于是插入 {1,2,3,4,5,6}原创 2021-01-10 14:49:03 · 129643 阅读 · 57 评论 -
二分查找、插值查找、斐波那契查找详解 通俗易懂
二分查找详解基本二分查找有 3 种基本方式:折半查找插值查找斐波那契查找一、折半查找「折半查找」这是最基本的二分查找,类似一个小游戏:小明纸上写上一个 100 以内数给小红来猜,小明会告诉小红结果是偏大还是偏小,问小红几次可以猜出思路十分简单,代码如下:(1)递归式/** 二分查找递归 */public static int recursionBinarySearch(int[] lookupTable, int target, int low, int high){原创 2021-01-03 19:17:13 · 418 阅读 · 0 评论 -
数据结构 串 KMP 模式匹配详解 通俗易懂
KMP 模式匹配详解通俗易懂KMP 模式匹配是解决字符串匹配的问题一、原始的字符串暴力匹配要点:子串的第一个字符匹配成功主串的字符后就依次匹配子串后面的字符,直到子串匹配结束代码:public static int forceMatch(char[] mainString,char[] pattern){ int i = 0; int j = 0; //回溯的指针 int k = 0; while (i < mainString.length &&原创 2021-01-02 13:05:40 · 3175 阅读 · 2 评论 -
数据结构 图论09 关键路径(AOE)网 通俗易懂
关键路径关键路径是求「工程上时间最短的问题」的方法阅读本文前请先了解拓扑排序拓扑排序主要解决「工程是否能顺序进行」的问题,关键路径在拓扑排序的基础上解决「工程最短时间的问题」。一、工程最短时间工程时间最短的问题:按照工厂上图生产一辆汽车,外壳、发动机、轮子和其他部件可以同时建造。(1)求组装完成最短需要多少时间?(2)如何缩短最短时间?答案:(1)因为所有部件可以同时建造,所以只要最长时间的「发动机」不建造完毕集中部件就无法进行。所以:「工程最短时间」就是通向汇点的和 最长的原创 2020-12-31 15:28:37 · 4610 阅读 · 0 评论 -
数据结构 图论08 拓扑排序详解 通俗易懂
拓扑排序详解拓扑排序是对一个有向图构造拓扑序列。构造时有 2 种结果:此图全部顶点被输出:说明说明图中无「环」存在, 是 AOV 网没有输出全部顶点:说明图中有「环」存在,不是 AOV 网AOV(Activity On Vertex Network) :一种 有向 无回路 的图1. 应用排序类似 流程图一样 任务例如早上起床的任务:例如:这里你只有穿了衬衣才能穿外套,而不是穿了外套再穿衬衣2. 要点每次删除一个入度边个数为 0 的点,并刷新其他点的出度边个数。原创 2020-12-26 14:00:12 · 656 阅读 · 0 评论 -
数据结构 图论07 Floyd算法详解 通俗易懂
Floyd 算法详解Floyd 算法是 所有点到所有点 的最短路径的算法,阅读前请想了解图的数据结构「邻接矩阵」邻接矩阵Floyd 算法是一个基于「贪心」、「动态规划」求一个图中 所有点到所有点 最短路径的算法,时间复杂度 O(n3)1. 要点以每个点为「中转站」,刷新所有「入度」和「出度」的距离。Dijkstra 算法:每次从「未求出最短路径」的点中 取出 最短路径的点,并通过这个点为「中转站」刷新剩下「未求出最短路径」的距离。Dijkstra 的算法在图中的效果像是:以起点原创 2020-12-25 17:22:49 · 5806 阅读 · 2 评论 -
数据结构 图论06 Dijkstra算法详解 通俗易懂
Dijkstra 算法详解Dijkstra 算法是求一个图中一个点到其他所有点的最短路径的算法,阅读前请想了解图的数据结构「邻接矩阵」邻接矩阵Dijkstra 算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,时间复杂度 O(n2)1. 要点每次从 「未求出最短路径的点」中 取出 距离距离起点 最小路径的点,以这个点为桥梁 刷新「未求出最短路径的点」的距离(看不懂没关系,请结合案例理解)2.图解案例分析案例:以 A 点为顶点,原创 2020-12-21 18:11:24 · 1097 阅读 · 0 评论 -
数据结构 图论05 最小生成树 Prime、Kruskal 算法
图论 最小生成树最小生成树:连通加权无向图 权值总合最小 的生成树(例如下图红色连接)1.应用例如你要在城市 A、B、C、D之间修建公路连通每个城市( A-B 之间连通,B-C之间连通,那么 A-C之间也自然连通)最小生成树是连通所有城市需要建造总长度最短的方案(比如上图的红色连接)常见求最小生成树的算法有普利姆(Prime)算法克鲁斯卡尔(Kruskal)算法2.普利姆(Prime)算法核心:挑选与已有点相连的最小的边时间复杂度:O(n2)教程:htt原创 2020-12-16 21:22:13 · 228 阅读 · 1 评论 -
数据结构 图论04 最小生成树Kruskal克鲁斯卡尔算法
克鲁斯卡尔(Kruskal)算法1.要点找出已连接顶点为基础的下一个权值最小的边(且不指向已经连接的顶点)2.图解(1)以A点为起始点,找出已连接顶点{'A'}为基础的下一个权值最小的边(且不指向已经连接的顶点) A -> B = 3 ,B 点,将 B 点添加至已连接的顶点 connetedVertices{'A','B'} 。(2)找出已连接顶点 {'A','B'} 为基础的下一个权值最小的边(且不指向已经连接的顶点) B -> C = 2 ,将 C 点添加到已连接的顶原创 2020-12-16 21:20:12 · 626 阅读 · 0 评论 -
数据结构 图论05 并查集
并查集1.基本定义并查集(Union Find):一种用于管理分组的数据结构 (一般使用树形结构来表示)(1)Find:查询 a 元素和 b 元素是否为同一组(2)Union:合并元素 a 和 b 为同一组我们将同一个组的元素例如用一颗树表示(比如 {'A','B','C'} 为同一组,{'D','E'} 为同一组)(1)find()判断为同一组:只需要判断他们的 root 根节点是否为同一个即可比如这里的 B 、C 节点的 root 根节点都为 A ,所以 B C 为同一组原创 2020-12-15 21:09:11 · 211 阅读 · 0 评论 -
数据结构 图论03 最小生成树Prime算法
普利姆「Prime」算法1.要点找出已连接顶点为基础的下一个权值最小的边2.图解(1)以A点为起始点,找出已连接顶点{'A'}为基础的下一个权值最小的边(且不指向已经连接的顶点) A -> B = 3 ,B 点,将 B 点添加至已连接的顶点 connetedVertices{'A','B'} 。(2)找出已连接顶点 {'A','B'} 为基础的下一个权值最小的边(且不指向已经连接的顶点) B -> C = 2 ,将 C 点添加到已连接的顶点 connetedVertice原创 2020-12-15 11:57:18 · 595 阅读 · 0 评论 -
数据结构 图论5 DFS和BFS深度优先搜索和广度优先搜索详解 java
图的搜索算法BFS和DFSDFS深度优先搜索DFS(Deep First Search),递归最深度访问其所有的临近节点(类似二叉树先序遍历);比如A节点的临近节点就是C,D;C的临近节点就是A,B;访问临近节点的优先级是A --> B --> C --> D --> E --> F,比如说A有C,D2个临近节点就会先访问C节点;访问过的节点不再访问(通过visited标记)例如:下面以A节点为起始点访问A节点,然后按照优先级访问C节点C节点的邻近节点A已经原创 2020-11-27 13:23:38 · 299 阅读 · 0 评论 -
数据结构 图论02 十字链表详解 代码
数据结构 图论 十字链表详解 代码阅读之前请了解先了解邻接表邻接表基础数据结构上面的数组+链表可以节约一些空间和方便增删,但是我们要计算一个顶点的度还是比较麻烦,十字链表就是解决计算顶点入度(就是有多少条边通向这个节点)的问题顶点Vertex的结构data :顶点具体数据信息firstIn:通向这个顶点的(竖向)边链表的读一个节点firstOut:通向其他顶点的(横向)边的链表的第一个节点边edge的结构fromVertex:箭头出发的顶点(比如A顶点)toVertex:箭原创 2020-11-25 20:29:01 · 1442 阅读 · 0 评论 -
数据结构 图论集合01 邻接矩阵、邻接表 代码 java
【数据结构】图(邻接矩阵、邻接表)的JAVA代码实现组成常用术语图的分类数据结构(重点)代码组成顶点 + 边(边可以没有但是至少有一个顶点)图Graph是顶点vertex集合和边(也称之为弧 edge)集合组成。G=(V,E) 这里V是vertex顶点集合,E是edge边集合E=(Vi,Vj) 表示顶点i和顶点j之间的连线(边,弧)常用术语无向边:2边都能通行,用圆括号表示(类似双链表)有向边:反之,用尖括号表示,(也称之为弧)权:可以表示一个距离,(带权重的图Graph叫做原创 2020-11-21 19:06:00 · 7731 阅读 · 0 评论 -
HashMap 零基础入门详解
什么是HashMap?首先要理解Hash和MapHash举个例子问题:从下面的数组中找到值为C的元素1.传统数组的使用遍历每个下标,直到找到值为C的元素(时间复杂度O(n))2.使用Hash的做法首先每个元素都有可以计算出一个hash值,然后我们再通过这个hash值计算它的下标位置,我们直接访问该位置元素(比如说 array[2]),时间复杂度是O(1)首先计算要寻找的元素C的hash值,举例C的hash值为16018然后通过计算(源码中使用位与就算效果等同于取模运算 (16原创 2020-11-20 10:12:01 · 307 阅读 · 0 评论 -
数据结构 二叉树的增删改查 图解 详解 代码
二叉树的增删改查增-二叉树的建立1.解释图解我们要建立一个 左子树 < 本节点 < 右子树的二叉树(例如下图)建立二叉树就是插入二叉树的过程,本次插入的位置都是叶子节点,将比较小的放到叶子节点的左边,比较大的放到叶子节点的右边。例如我们要将 6 添加到上面的二叉树的中,比较 6 > 4 因此,接右子树比较 6 < 8 ,接左子树比较 6 < 7 接 ,左子树比较 6 > 5 ,且 5的右子树为空,将6 作为 5 的右子树(结束)2.代码 (原创 2020-11-16 11:31:35 · 11886 阅读 · 5 评论 -
数据结构 二叉树的 前序遍历,中序遍历,后续遍历的递归实现和非递归实现 TreeIterator 图解 代码
二叉树这里需要了解的知识点遍历(本节)增删改查二叉树的 前序遍历,中序遍历,后续遍历的递归实现和非递归实现 TreeIterator 图解本次示例的代码由java实现.先序遍历(递归)1.代码void preOrder(TreeNode root){ if(root == null){ return; } //输出节点的值. System.out.println(root.element); //遍历左子树 preOrder(原创 2020-11-16 09:18:34 · 1275 阅读 · 1 评论 -
数据结构-02 图解中缀表达式转后缀表达式并计算值
目录:数据结构-01-图解后缀表达式值计算方式数据结构-02 图解中缀表达式转后缀表达式并计算值1.图解中缀表达式转后缀表达式通过 数据结构-01-图解后缀表达式值计算方式 我们了解到后缀表达式(例如:9 3 1 - 3 * + 10 2 /+)对计算机运算的方便,但是它却让我们这些人类十分的难受,因此我们需要在设计一个,中缀表达式转后缀表达式的程序来一劳永逸.规则:依次遍历表达式,1.如果是数字就添加到后缀表达式上(相反于数据结构-01-图解后缀表达式值计算方式 )2.如果是符号就原创 2020-10-21 19:33:57 · 3010 阅读 · 4 评论 -
数据结构-01-图解后缀表达式值计算方式
1.简介问题:我们平常使用的数学表达式大多数是“中缀表达式”例如:9+(3-1)×3+10÷2,对人比较友好,但是这个对计算机计算并不友好,因为计算机无法智能判断运算顺序的问题(比如说乘法加法等优先级和括号等)解决方案:20世纪50年代,波兰逻辑学家Jan·ukasiewicz,想到了不需要判断顺序的数学表达式,这就是后缀表达式(也称之为逆波兰表达式)2.图解后缀表达式计算方式规则:遍历后缀表达式的每个元素,1.遇到数字就进栈,2.遇到符号就将栈顶的2个元素出栈,然后将计算结果进栈原创 2020-10-21 18:30:03 · 10154 阅读 · 0 评论