数据结构
程序员迪迦
【我是谁?】本人23届双非普本毕业,在互联网寒冬中通过秋招收到多家大厂的录用offer:快手、米哈游、京东、滴滴等,经历过几十次的大厂面试,实习和秋招面试经验充足。【目的是?】在我的成长过程中,许多前辈大佬帮助过我,我也真诚的希望能给大家带来一些帮助,关注我,进大厂不迷路!
展开
-
跳跃表的Java实现
对于跳跃表的概念,以及跳跃表增删改查的流程,参考大佬的这篇文章。Skip List–跳表(全网最详细的跳表文章没有之一)本文只给出跳跃表的Java实现以及详细注释,欢迎各位大佬指正代码,如果有同学有部分代码看不懂,可在评论区提问。/** * 跳表的一种实现方法。 * 跳表中存储的是正整数,并且存储的是不重复的。 * * Author:ZHENG */public class SkipList { private static final float SKIPLIST_P = 0.原创 2021-09-04 11:04:39 · 423 阅读 · 2 评论 -
最小生成树问题(Prim算法和Kruskal算法的异同总结)
什么是最小生成树?是一棵树*无回路*V个顶点一定有V-1条边是生成树*包含全部顶点边的权重值之和最小结论:只要图是连通的,则存在最小生成树,同理,只要有最小生成树,图就连通。核心算法思路:贪心贪心算法的约束条件:只能用图里有的边只能正好用电V-1条边不能有回路...原创 2020-09-22 17:39:48 · 2947 阅读 · 0 评论 -
最短路径问题(最全面的问题分类以及算法源码)
最短路径问题的抽象:在网络(带权的图)中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。问题分类:单源最短路径问题:从固定顶点出发,求其到所有其他顶点的最短路径。多源最短路径问题:求任意两顶点间的最短路径。无权图的单源最短路算法:...原创 2020-09-20 17:18:42 · 5632 阅读 · 0 评论 -
图的遍历(邻接表和邻接矩阵)
图的遍历是什么?从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。深度优先遍历(DFS):它从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v 有路径相通的顶点都被访问到。(类似树的先序遍历)/*邻接矩阵的dfs*/bool visited[Maxvex];memset(visited,false,sizeof(visited));//初始化void dfs(MGraph G,int i){ cout&原创 2020-08-23 15:23:08 · 667 阅读 · 0 评论 -
图--基本概念及源码表示
什么是图?表示多对多的关系怎么在程序中表示图?邻接矩阵邻接表邻接矩阵邻接矩阵G[N][N]——N个顶点从0到N-1编号 ,若v[i][j]==1,则(i,j)是一组边。优点:1 :方便检查任意一对顶点间是否存在边2: 方便找任一顶点的所有“邻接点”3: 方便计算任一顶点的“度”(从该点发出的边数为“出 度”,指向该点的边数为“入度”)邻接表G[N]为指针数组,对应矩阵每行一个链表, 只存非0元素,每条链表上都是根N相邻的元素。优点:1 :方便找任一顶点的所有“邻接点”2:原创 2020-08-20 15:34:13 · 205 阅读 · 0 评论 -
File Transfer(并查集的应用)
对于并查集的原理和应用,主要有三点重点需要理解记忆。集合的表示按秩归并(可以最小化堆的树高)路径压缩(再寻找父节点时无需进行循环,一步到位)集合的表示集合里的每一个个体都需要保存两种数据,一个是自身的数据,一个是它的父亲是谁,由于本题所给数据都为数字,故可以直接用一个数组来存储(类似与静态链表的感觉),数组的下标就代表了是第几个个体,而每个值则代表父亲是谁,初始值全设为-1,最后将根结点的值修改成 (-儿子个数),这样在按秩归并的时候用来判断集合的大小(即树高)按秩归并普通的归并:set原创 2020-08-18 17:43:07 · 529 阅读 · 0 评论 -
堆的原理及其完全二叉树代码实现
优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是 依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。如何用一种数据结构来组织堆:完全二叉树,树根就是此时数据优先度最高的,随着数据的插入删除,优先度最高的树根也在动态变化。完全二叉树的表示:一维数组,其中arr[0]为哨兵元素。typedef struct HeapStruct *MaxHeap; struct HeapStruct { ElementType *Elements; /* 存储堆元素的数组 */原创 2020-08-03 15:11:45 · 244 阅读 · 1 评论 -
判断不同的序列是否是同一棵搜索树?
题意理解 :给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。 例如,按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树, 都得到一样的结果。问题:对于输入的各种插入序列,你需要判断它们是否能 生成一样的二叉搜索树。输入样例:4 23 1 4 23 4 1 23 2 4 12 12 11 20输出样例:YesNoNo求解思路两个序列是否对应相同搜索树的判别 :1.分别建两棵搜索树的判别方法2原创 2020-07-27 10:41:05 · 222 阅读 · 0 评论 -
平衡二叉树的原理与实现
什么是平衡二叉树?搜索树结点不同插入次序,将导致不同的深度和平均查找长度ASL,而平衡二叉树就是一颗任意一个结点的左右子树高度的差的绝对值不超过1的搜索二叉树。附一个大佬写的图解:图解平衡二叉树平衡二叉树的四种基本情况和操作:左-左型:右旋右-右型:左旋左-右型:先左旋再右旋右-左型:先右旋再左旋struct AvlNode { int data; AvlNode lchild; AvlNode rchild; int height;//记录结点的高度}int Height原创 2020-07-18 14:41:03 · 161 阅读 · 0 评论 -
二叉搜索(查找)树的原理与实现
查找分为两种查找静态查找动态查找二叉查找树就是针对动态查找的一种数据组织的方式二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:非空左子树的所有键值小于其根结点的键值。非空右子树的所有键值大于其根结点的键值。左、右子树都是二叉搜索树。二叉搜索树操作的特别函数:Position Find( ElementType X, BinTree BST ):从二叉搜索树BST 中查找元素X,返回其所在结点的地址;Position FindMin( BinTree BST ):从二叉原创 2020-07-16 10:37:07 · 575 阅读 · 0 评论 -
树的同构(静态链表表示二叉树的应用)
例:给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子原创 2020-07-15 15:48:59 · 448 阅读 · 0 评论 -
由两种遍历序列确定二叉树(多种方法及其优化方法)
若已知任意两种遍历序列,是否可以唯一确定一颗二叉树?答:只要这两种序列包含一个中序序列就可以。为什么一个先序和一个后序序列无法确定?答:先序 根左右后序 左右根若一棵树,其中一个或多个结点的左子树或右子树为空,那么此时无法判断到底是左子树为空还是右子树为空,就会出现两种情况。例:先序和中序遍历序列来确定一棵二叉树解法: 根据先序遍历序列第一个结点确定根结点; 根据根结点在中序遍历序列中分割出左右两个子序列 对左子树和右子树分别递归使用相同的方法继续分解。注意:你可以假设树中没有原创 2020-07-15 10:56:17 · 6847 阅读 · 0 评论 -
一元多项式的乘法
eg:设计函数求两个一元多项式的乘积。输入样例 :4 3 4 -5 2 6 1 -2 03 5 20 -7 4 3 1(一共两行,每行第一个数字代表项数,后面每两个两个一组,前面是系数,后面是指数)输出样例:15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1求解思路:多项式表示(数组或链表)程序框架读多项式乘法实现多项式输出本题由于输入样例提供了项数,故用动态数组解决较好,下面展示链表的解决方法。链原创 2020-07-06 16:25:54 · 2046 阅读 · 0 评论