做耳标网站,制作小诗集,wordpress支持多少字,下载京东商城摘自#xff1a;数据结构#xff1a;八大数据结构分类 作者#xff1a;鄙人薛某 发布时间#xff1a;2018-09-05 18:23:28 网址#xff1a;https://blog.csdn.net/yeyazhishang/article/details/82353846 本文目录#xff1a; 数据结构分类1、数组2、栈3、队列4、链表5、… 摘自数据结构八大数据结构分类 作者鄙人薛某 发布时间2018-09-05 18:23:28 网址https://blog.csdn.net/yeyazhishang/article/details/82353846 本文目录 数据结构分类1、数组2、栈3、队列4、链表5、树6、散列表7、堆8、图 数据结构分类 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常用的数据结构有数组栈链表队列树图堆散列表等如图所示 每一种数据结构都有着独特的数据存储方式下面为大家介绍它们的结构和优缺点。 1、数组 数组是可以再内存中连续存储多个元素的结构在内存中的分配也是连续的数组中的元素通过数组下标进行访问数组下标从0开始。例如下面这段代码就是将数组的第一个元素赋值为 1。 int[] data new int[100]data[0] 1;
12 优点 1、按照索引查询元素速度快 2、按照索引遍历数组方便 缺点 1、数组的大小固定后就无法扩容了 2、数组只能存储一种类型的数据 3、添加删除的操作慢因为要移动其他的元素。 适用场景 频繁查询对存储空间要求不大很少增加和删除的情况。 2、栈 栈是一种特殊的线性表仅能在线性表的一端操作栈顶允许操作栈底不允许操作。 栈的特点是先进后出或者说是后进先出从栈顶放入元素的操作叫入栈取出元素叫出栈。 栈的结构就像一个集装箱越先放进去的东西越晚才能拿出来所以栈常应用于实现递归功能方面的场景例如斐波那契数列。 3、队列 队列与栈一样也是一种线性表不同的是队列可以在一端添加元素在另一端取出元素也就是先进先出。从一端放入元素的操作称为入队取出元素为出队示例图如下 使用场景因为队列先进先出的特点在多线程阻塞队列管理中非常适用。 4、链表 链表是物理存储单元上非连续的、非顺序的存储结构数据元素的逻辑顺序是通过链表的指针地址实现每个元素包含两个结点一个是存储元素的数据域 (内存空间)另一个是指向下一个结点地址的指针域。根据指针的指向链表能形成不同的结构例如单链表双向链表循环链表等。 链表的优点 链表是很常用的一种数据结构不需要初始化容量可以任意加减元素 添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可所以添加删除很快 缺点 因为含有大量的指针域占用空间较大 查找元素需要遍历链表来查找非常耗时。 适用场景 数据量较小需要频繁增加删除操作的场景 5、树 树是一种数据结构它是由nn1个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树也就是说它是根朝上而叶朝下的。它具有以下的特点 每个节点有零个或多个子节点 没有父节点的节点称为根节点每一个非根节点有且只有一个父节点除了根节点外每个子节点可以分为多个不相交的子树 在日常的应用中我们讨论和用的更多的是树的其中一种结构就是二叉树。 二叉树是树的特殊一种具有如下特点 1、每个结点最多有两颗子树结点的度最大为2。 2、左子树和右子树是有顺序的次序不能颠倒。 3、即使某结点只有一个子树也要区分左右子树。 二叉树是一种比较有用的折中方案它添加删除元素都很快并且在查找方面也有很多的算法优化所以二叉树既有链表的好处也有数组的好处是两者的优化方案在处理大批量的动态数据方面非常有用。 扩展 二叉树有很多扩展的数据结构包括平衡二叉树、红黑树、B树等这些数据结构二叉树的基础上衍生了很多的功能在实际应用中广泛用到例如mysql的数据库索引结构用的就是B树还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大但算法上比较复杂想学习的话还是需要花时间去深入的。 6、散列表 散列表也叫哈希表是根据关键码和值 (key和value) 直接进行访问的数据结构通过key和value来映射到集合中的一个位置这样就可以很快找到集合中的对应元素。 记录的存储位置f(key) 这里的对应关系 f 成为散列函数又称为哈希 (hash函数)而散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字然后就将该数字对数组长度进行取余取余结果就当作数组的下标将value存储在以该数字为下标的数组空间里这种存储空间可以充分利用数组的查找优势来查找元素所以查找的速度很快。 哈希表在应用中也是比较常见的就如Java中有些集合类就是借鉴了哈希原理构造的例如HashMapHashTable等利用hash表的优势对于集合的查找元素时非常方便的然而因为哈希表是基于数组衍生的数据结构在添加删除元素方面是比较慢的所以很多时候需要用到一种数组链表来做也就是拉链法。拉链法是数组结合链表的一种结构较早前的hashMap底层的存储就是采用这种结构直到jdk1.8之后才换成了数组加红黑树的结构其示例图如下 从图中可以看出左边很明显是个数组数组的每个成员包括一个指针指向一个链表的头当然这个链表可能为空也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去也是根据这些特征找到正确的链表再从链表中找出这个元素。 哈希表的应用场景很多当然也有很多问题要考虑比如哈希冲突的问题如果处理的不好会浪费大量的时间导致应用崩溃。 7、堆 堆是一种比较特殊的数据结构可以被看做一棵树的数组对象具有以下的性质 堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 堆的定义如下n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时称之为堆。 (ki k2i,ki k2i1)或者(ki k2i,ki k2i1), (i 1,2,3,4…n/2)满足前者的表达式的成为小顶堆满足后者表达式的为大顶堆这两者的结构图可以用完全二叉树排列出来示例图如下 因为堆有序的特点一般用来做数组中的排序称为堆排序。 8、图 图是由结点的有穷集合V和边的集合E组成。其中为了与树形结构加以区别在图结构中常常将结点称为顶点边是顶点的有序偶对若两个顶点之间存在一条边就表示这两个顶点具有相邻关系。 按照顶点指向的方向可分为无向图和有向图 图是一种比较复杂的数据结构在存储数据上有着比较复杂和高效的算法分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构这里不做展开读者有兴趣可以自己学习深入。