![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
进击的代码家
这个作者很懒,什么都没留下…
展开
-
Java数据结构与算法解析(一)——表
本节我们讨论常见常用的数据结构——表。 如果要通俗简单的说什么是表,那我们可以这样说:按顺序排好的元素集合就是表。表的概述抽象数据类型是带有一组操作的一些对象的结合1、定义: 线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。2、特征/性原创 2017-08-27 13:27:07 · 22232 阅读 · 6 评论 -
Java数据结构与算法解析(十七)——斜堆
斜堆概述斜堆(Skew heap)也叫自适应堆(self-adjusting heap),它是左斜堆的一个变种。和左倾堆一样,它通常也用于实现优先队列;作为一种自适应的左斜堆,它的合并操作的时间复杂度也是O(lg n)。 它与左斜堆的差别是: (1) 斜堆的节点没有”零距离”这个属性,而左斜堆则有。 (2) 斜堆的合并操作和左倾堆的合并操作算法不同。 斜堆的合并操作(1) 如果一个空斜堆与一原创 2017-12-08 08:49:14 · 2656 阅读 · 0 评论 -
Java数据结构与算法解析(十五)——左式堆
左式堆概述左式堆(leftist tree 或 leftist heap),又被成为左偏树、左倾堆,最左堆等。 它和二叉堆一样,都是优先队列实现方式。当优先队列中涉及到”对两个优先队列进行合并”的问题时,二叉堆的效率就无法令人满意了,而本文介绍的左式堆,则可以很好地解决这类问题。上图是一颗左倾树,它的节点除了和二叉树的节点一样具有左右子树指针外,还有两个属性:键值和零距离。 (1) 键值的作用是原创 2017-11-15 09:15:49 · 2680 阅读 · 1 评论 -
Java数据结构与算法解析(十四)——二叉堆
二叉堆概述二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。 最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。二叉堆一般都通过”数组”来实现,下面是数组实现的最大堆和最小堆的示意图: 二叉堆的实现本实现以”最大堆”为例子来进行介绍。1. 添加假设在最大堆[90,80,70,60,40,30,20原创 2017-11-01 09:18:49 · 8376 阅读 · 0 评论 -
Java数据结构与算法解析(十三)——优先级队列
在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue) 。定义优先级队列和通常的栈和队列一样,只原创 2017-10-21 10:07:07 · 13038 阅读 · 1 评论 -
Java数据结构与算法解析(十一)——红黑树
前面一篇文章介绍了2-3查找树,2-3查找树能保证在插入元素之后能保持树的平衡状态,最坏情况下即所有的子节点都是2-node,树的高度为lgN,从而保证了最坏情况下的时间复杂度。但是2-3树实现起来比较复杂,本文介绍一种简单实现2-3树的数据结构,即红黑树(Red-Black Tree)红黑树的介绍红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。 红黑树是特殊原创 2017-10-11 09:46:24 · 16206 阅读 · 3 评论 -
Java数据结构与算法解析(十二)——散列表
散列表概述散列表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。散列表的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。散列的查找算法有两个步骤: 1.使用散列函数将被查找的键转原创 2017-10-13 21:16:19 · 11463 阅读 · 0 评论 -
Java数据结构与算法解析(十)——2-3树
二叉查找树对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。平衡查找树的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证树在插入完成之后始终保持平衡状态,这就是平衡查找树(Balanced Search Tree)。在一棵具有N 个节点的树中,我们希望该树的高度能够维持在lgN左右,这样我们就能保证只需要lgN次比较操作就可以查找到想原创 2017-10-01 08:16:12 · 10682 阅读 · 4 评论 -
Java数据结构与算法解析(六)——AVL树
之前我们说过普通二叉查找树的删除算法会使得左子树比右子树深,因为我们总是用右子树的一个来代替删除的节点。会造成二叉查找树,严重的不平衡。AVL树简介而AVL树就是解决普通二叉查找树弊端的方法,他是带有平衡条件的二叉查找树,这个平衡条件必须容易保持,而且它保证树的深度必须是O(logN).AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 上面的两张图片,左边的原创 2017-09-19 09:37:27 · 17457 阅读 · 10 评论 -
Java数据结构与算法解析(九)——B树
B树简介定义在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。特点阶为M的B树是一颗具有以下特点的树: 1.数据项存储在树叶上 2.非叶子节点直到M-1个关键字以指示搜索的方向:关键字i代表子树i+1中最小的关键字 3.树的根或者是一片树叶,或者其儿子在2和M之间 4.除根外,所有非树原创 2017-09-27 09:41:56 · 14904 阅读 · 7 评论 -
Java数据结构与算法解析(二)——栈
关联文章: Java数据结构与算法解析(一)——表栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。对栈的基本操作有push(进栈)和pop(出栈),对空栈进行push和pop,一般被认为栈ADT的一个错误。当push时空间用尽是一个实现限制,而不是ADT错误。栈有时又叫做LIFO(后进先出)表。基本概念允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),原创 2017-09-03 12:44:20 · 8468 阅读 · 3 评论 -
Java数据结构与算法解析(八)——伸展树
伸展树简介伸展树(Splay Tree)是特殊的二叉查找树。 它的特殊是指,它除了本身是棵二叉查找树之外,它还具备一个特点: 当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处是,下次要访问该节点时,能够迅速的访问到该节点。特性1.和普通的二叉查找树相比,具有任何情况下、任何操作的平摊O(log2n)的复杂度,时间性能上更好 2.和一般的平衡二叉树比如 红黑树、AVL树相比,维护原创 2017-09-22 23:48:24 · 13900 阅读 · 5 评论 -
Java数据结构与算法解析(五)——二叉查找树
二叉查找树简介二叉查找树(Binary Search Tree),又被称为二叉搜索树。 它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。那么,这棵树就是二叉查找树。如下图所示: 在二叉查找树中原创 2017-09-15 08:30:19 · 5575 阅读 · 3 评论 -
Java数据结构与算法解析(三)——队列与背包
关联文章: Java数据结构与算法解析(一)——表 Java数据结构与算法解析(二)——栈队列基本概念像栈一样,队列也是表。然而,使用队列时插入在一端进行,而删除则在另一端进行。插入的一端称为队尾,删除的一端称为队头 。其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out)。队列的数组实现队列的顺序储存缺点:出队复杂度高0(n),容易假溢出 Fr原创 2017-09-10 23:58:16 · 7276 阅读 · 1 评论 -
Java数据结构与算法解析(四)——树的概述
树的基本概念树具有以下的特点: (01) 每个节点有零个或多个子节点; (02) 没有父节点的节点称为根节点; (03) 每一个非根节点有且只有一个父节点; (04) 除了根节点外,每个子节点可以分为多个不相交的子树。树的基本术语1.结点的度 结点拥有的子树数称为结点的度。度为0的结点称为叶子结点或终端结点,度不为0的结点称为非终端结点或分支结点。除根结点以外,分支结点也称为内部结点。树的原创 2017-09-14 23:24:32 · 8392 阅读 · 4 评论 -
leetcode刷题(6)—— 另一个树的子树
采用递归的思路,先从根节点开始判断,如果有其中一个为null都应该返回false,如果根节点不一致,则递归左子节点和右子节点/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * ...原创 2019-09-15 22:51:37 · 152 阅读 · 0 评论