![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 64
数据结构
u013250861
这个作者很懒,什么都没留下…
展开
-
数据结构:概述
线性结构:数据结构中的元素存在一对一的相互关系,表中各个结点具有线性关系;非线性结构内存是以字节为基本存储单位的(1024b = 1kb) , 每个基本存储空间都有自己的地址。整形(int) : 占 4个字节字符(char): 占1个字节 . 单个字符“a”占1个字节, 字符串“abc”占3个字节...原创 2021-05-01 14:46:15 · 121 阅读 · 0 评论 -
数据结构-线性结构:动态数组(顺序表)【底层依托“静态数组”】【靠resize解决固定容量问题】
一、动态数组的基本原理实现一个基本的动态数组,需要实现一些基本的功能,增删改查应该是最基本的了,而在此基础之上还需要实现相应的动态扩容与泛型。对于动态扩容来说,我们需要在数组的使用过程中来进行判断,是否需要进行扩容,以及如何更有效的进行扩容,添加长度还是重新申请。而泛型的实现就需要数组能够接受任何类型的数据。二、动态扩容实现动态扩容的方式有很多,但是在数组的后面接上一段内存是明显不行的,我们需要做的就是重新申请一个更大容量的数组,这样才是可行的方法,但是问题又来了用什么方式来申请才能够最有效的扩容,我原创 2021-05-01 14:29:06 · 616 阅读 · 0 评论 -
数据结构-线性结构:链表(Linked List)【基于自定义Node节点】【真正的动态数据结构,不需要处理固定容量问题】【最简单的动态数据结构】【单向链表、单向循环链表、双向链表、双向循环链表】
数据结构1、定义在计算机科学中,数据结构是一种数据组织、管理和存储的格式,它可以帮助我们实现对数据高效的访问和修改。更准确地说,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,可以体现数据值之间的关系,以及可以对数据进行应用的函数或操作。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 , 数据结构往往同高效的算法有关通俗点来说,在针对一些非数值计算的问题,我们需要数组,链表,树,图等数据结构来帮助我们解决它们。它是一个集合,里面包含了互相之间存在各种关系的数据元素。原创 2020-10-25 23:12:02 · 387 阅读 · 0 评论 -
数据结构-线性结构:栈(Stack)【底层依托“动态数组”/“链表”】【“栈”的操作是“动态数组”操作的子集;“栈”只能同一端(称为“栈顶”)添加元素、取出元素;“后进先出”】
栈可以用顺序表(动态数组)(python中的list数据结构是一种顺序表(动态数组))实现,也可以用链表实现。基于“动态数组”的栈、基于“链表”的栈整体上时间复杂度基本一致;最多2~3倍的差异;绝不会出现几百倍的差异;java代码:MyStack.javaMyArray.javaMyArrayStack.javaMain.java输出结果:2、基于“链表”的栈MyStack.javaMyLinkedList.javaMyLinkedListStack.javaMain.java输出结果:原创 2021-05-01 14:52:17 · 617 阅读 · 2 评论 -
数据结构-线性结构:队列(Queue)【底层依托“动态数组”/“链表”】【“队列”的操作是“动态数组”操作的子集;队列只能一端(队尾)添加元素另一端(队首)取元素;“先进先出”】
java代码:MyQueue.javaMyArray.javaMyArrayQueue.javaMain.java输出结果:python代码:2、循环队列2.1 “循环队列”结构“循环队列”结构的目的就是弥补“数组队列”的dequeue()操作的复杂度O(n)的缺陷,使用“循环队列”结构后,dequeue()操作的复杂度为O(1)。java代码:MyQueue.javaMyArray.javaMyLoopQueue.javaMain.java输出结果:3、双端队列二、原创 2021-05-01 16:42:13 · 610 阅读 · 2 评论 -
数据结构-线性结构:哈希表
6、哈希表/散列表(Hash Table)哈希表,也叫散列表(Hash table),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过一个关于键值的函数(哈希函数)将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存放记录的数组称做哈希表。哈希表是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。把关键字映射到一个表中的位置来直接访问记录,以加快访问速度。通常,我们把这个关键字称为 Key,把对应的记录称为 Value,所以原创 2021-05-01 14:53:12 · 498 阅读 · 0 评论 -
数据结构-非线性结构:树形结构概述
树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树具有以下的特点:将数据结构存储在固定的数组中,然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。由于对节点的个数无法掌握,常见树的存储表示都转换成二叉树进行处理,子节点个数最多为2。...原创 2021-04-30 18:42:33 · 899 阅读 · 1 评论 -
数据结构-非线性结构-树形结构:有序树 ---->二叉树【动态数据结构】
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)排序二叉树(BST)的要求:顺序存储:将数据结构存储在固定的数组中,虽然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树存储方式.二叉树通常以链式存储。链式存储:由于对节点的个数无法掌握,常见树的存储表示都转换成二叉树进行处理,子节点个数最多为2。五、二叉树的遍历1、广度优先遍历2、深度优先遍历三种深度优先遍历方式:...原创 2021-05-03 20:30:52 · 1536 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ---->二叉树 ----> 深度优先遍历【模板】
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例 :给定二叉树返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。...原创 2021-05-20 20:31:02 · 66 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 -> 二叉搜索树(二分搜索树)【动态数据结构;不一定是满二叉树;不一定是平衡二叉树】【二分搜索树:中序遍历是递增序列;前序遍历是先降序,后升序】
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)二分搜索树(排序二叉树(英语:Binary Search Tree),也称二叉搜索树、二叉查找树、有序二叉树),排序二叉树包含空树。二分搜索树(BST)的要求:二分搜索树种存储的元素必须是可比较的,链表、数组不需要存储的元素必须是可比较的。最自然、最常用的遍历方式后续遍历的一个应用:为二分搜索树释放内存广度优先遍历的意义:更快地找到问题的解。常用于算法设计中-最短路原创 2021-05-03 19:30:41 · 247 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 -> 平衡二叉树(任何节点的左右子树的高度差不大于1)-> 完全二叉树(除最底层外的其他层都被填满,且最底层左到右填入) -> 堆(优先队列)
完全二叉树:即除了最底层,其他层的节点都被元素填满,且最底层左到右填入。完全二叉树属于平衡二叉树。堆是一种完全二叉树,且满足以下条件:我们对堆中的结点按层进行编号,可以将堆逻辑结构映射到数组中add、extractMax操作的时间复杂度都是 O(logn)O(logn)O(logn)由上图可知,二叉堆可以用动态数组来实现。MyArray.java1、最大堆MaxHeap.java2、最小堆MinHeap.java三、heapify:将任意数组整理成堆的形状Queue.javaPrio原创 2021-05-03 19:35:15 · 547 阅读 · 2 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 ->平衡二叉树(任何节点的左右子树的高度差不大于1)-> AVL树【O(logn)】【二分搜索树&平衡二叉树】【旋转类型:LL/RR/LR/RL】
平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;AVL树是二分搜索树的改进版,防止二分搜索树在一些情况下退化为链表。AVL树最大高度: lognlognlognFileOperation.javaMain.java...原创 2021-05-03 19:31:46 · 307 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 ->平衡二叉树(任何节点的左右子树的高度差不大于1)-> 红黑树(O(logn))【严格来说,不是平衡二叉树;平均来说红黑树比AVL树快一些】
2-3树【不是二叉树,是一颗绝对平衡的树(左右子树的高度一定相等)】【2-3树与红黑树等价】2-3树动画:红黑树是保持 “黑节点绝对平衡” 的二叉树;严格意义上,红黑树不是平衡二叉树;最大高度为 2logn2logn2logn时间复杂度:O(logn)O(logn)O(logn)如果创建后只查询,则AVL树的性能比红黑树高一些(AVL树高度为lognlognlogn,红黑树的高度为 2logn2logn2logn);如果创建后经常添加、删除元素,则红黑树的效率比AVL树高;...原创 2021-04-30 18:53:16 · 293 阅读 · 1 评论 -
数据结构-非线性结构-树形结构:有序树 -> 二叉树 -> 平衡二叉树 -> 线段树 (Segment Tree) / 区间树【不是完全二叉树;用于处理区间类数据】【基于静态数组/链表】【竞赛】
平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;SegmentTree.javaMerger.javaMain.java参考资料:线段树详解 (原理,实现与应用)原创 2021-05-03 19:53:27 · 113 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:有序树 ->二叉树 ->哈夫曼树 / 霍夫曼树(Huffman Tree)【根据所有叶子节点的权值构造出的 -> 带权值路径长度最短的二叉树,权值较大的结点离根较近】
哈夫曼树概念:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。二叉树:每个节点最多有2个子树的有序树,两个子树分别称为左子树、右子树。有序的意思是:树有左右之分,不能颠倒叶子节点:一棵树当中没有子结点的结点称为叶子结点,简称“叶子”路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定原创 2021-07-06 23:12:57 · 2327 阅读 · 2 评论 -
数据结构-非线性结构-树形结构:Trie/字典树/前缀树【专门用于处理字符串类数据】
数据结构-非线性结构-树形结构:Trie ----> 字典树、前缀树原创 2021-05-03 19:54:46 · 141 阅读 · 0 评论 -
数据结构-非线性结构-树形结构:并查集(Union Find)【用于判断“网络”中节点间的连接状态】
接口文件:UnionFind.java1、版本01UnionFind1.java2、版本02UnionFind2.java3、版本034、版本04UnionFind4.java5、版本05UnionFind5.java6、版本06UnionFind6.java测试代码Main.java原创 2021-05-03 19:55:46 · 124 阅读 · 0 评论 -
数据结构-非线性结构:图形结构【邻接矩阵(二维数组)、邻接表(链表数组 / 红黑树数组)】
数据结构-非线性结构:图形结构原创 2021-04-30 18:43:29 · 246 阅读 · 1 评论 -
数据结构-高层数据结构:集合(Set)【元素不重复】【基于二分搜索树(有序集合O(logn))、基于平衡二叉树(有序集合O(logn))、基于链表(无序集合O(n))、基于哈希表(无序集合O(n))】
Set.java一、基于二分搜索树实现的SetBinarySearchTree.javaBinarySearchTreeSet.java二、基于平衡二叉树(AVL)实现的SetAVLTree.javaAVLTreeSet.java三、基于链表实现的SetLinkedList.javaLinkedListSet.java原创 2021-05-04 12:28:26 · 221 阅读 · 2 评论 -
数据结构-高层数据结构:映射/字典(Map)【有序字典:基于二分搜索树、基于平衡二叉树、基于红黑树、基于链表】【无序字典:基于哈希表】
Map.java一、基于二分搜索树的MapBinarySearchTreeMap.java二、基于平衡二叉树的MapAVLTree.javaAVLTreeMap.java三、基于红黑树的MapRedBlackTree.javaRedBlackTreeMap.java四、基于链表的MapLinkedListMap.java原创 2021-05-04 15:04:14 · 146 阅读 · 0 评论 -
位运算(&、|、^、~、>>、<<)
一、位运算概述现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。举一个简单的例子来看下CPU是如何进行计算的,比如这行代码:int a = 35;int b = 47;int c = a + b;计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加:35: 0 0 1 0 0 0 1 147: 0 0 1 0 1 1原创 2021-06-29 18:38:49 · 299 阅读 · 0 评论