数据结构与算法
文章平均质量分 93
主要讲解一些常用的数据结构以及算法
LessenPaul
Talk is cheap,show me the code
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java集合之List类型--LinkedList底层源码剖析
文章目录1、LinkedList简介2、LinkedList底层实现2.1、LinkedList初始化2.2、 添加元素2.3、查找给定元素3、总结1、LinkedList简介 LikedList是List接口的实现类,与ArrayList不同的是它的底层实现不是数组,而是一个双向链表。由此我们可以知道,LinkedList比起ArrayList更适合做插入删除等操作,因为ArrayList在指定位置插入需要做元素的搬移,但是对于天生就支持插入的链表结构来说,只需要更改指针指向即可。而其对于数据的访问原创 2021-12-15 14:56:11 · 1086 阅读 · 0 评论 -
Java集合之List类型--ArrayList底层源码剖析
List简介List结构在Java集合体系中,原创 2021-12-14 19:46:18 · 938 阅读 · 0 评论 -
堆的原理实现详解以及堆的应用
文章目录堆是什么堆的存储方式插入结点删除结点堆排序代码实现堆是什么 堆(heap)本质上就是一棵完全二叉树,只不过这棵完全二叉树有点特别,能够被称为堆的二叉树,除了它必须要是一棵完全二叉树外,它的每一个结点都必须大于或者小于其子节点。 解释一下就是对于树中的所有的结点都至少有一棵子树,对于这个结点的子树上所有的结点都必须要大于或者小于其父节点。因此,堆也是个递归的定义,通常,我们将结点都大于或者等于子树所有结点的堆称为最大堆 ;将结点都小于或者等于子树所有结点的堆称为最小堆 。如下图所示:原创 2020-06-15 18:41:46 · 1412 阅读 · 0 评论 -
图及其遍历方式--广度优先&深度优先
图的定义及其分类 图和之前说的二叉树一样也是一种非线性数据结构,图由两部分组成:其一是顶点;其二是顶点之间连接的边。顶点就是图中的元素结点,而边就是用来表示顶点之间的关系,如下图:每个顶点的边的条数就是顶点的度, 例如社交产品中,我们每一个人就是图中的顶点,而我们的好友就是该通过边直接连接的顶点,我们好友的个数就是顶点的度。 上图所示的是一种图,它并没有方向的概念,我们知道有些关系之间是有方向的概念的,例如,微博中的关注关系,你关注了某个人但是这个人不一定关注了你。因此,这种图称为有向图..原创 2020-06-12 13:54:23 · 954 阅读 · 0 评论 -
字符串匹配算法之BF算法 & RK算法 & BM算法原理及实现
BF算法 BF算法实际上就是暴力破解算法,它的优点就是简单但性能差。它的基本思想就是将模式串与主串中的子串依次比较。 假如我们需要在字符串A中匹配是否存在字符串B,这时我们就把A串叫做主串,把B串叫做模式串。而A串中字符数量等于B串字符数量的串称为子串。我们记A串的长度为n,B串的长度为m。 在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。我通过一个图来说明我们可以看到在第一次匹配时,从主串的第一个字符为0处开始匹配,每..原创 2020-06-11 11:00:53 · 1011 阅读 · 0 评论 -
二叉树查找树与平衡二叉树原理剖析与实现
文章目录1、什么是二叉树(Binary Tree)2、二叉树的存储方式3、二叉树的遍历4、二叉查找树(Binary Search Tree)4.1 查找操作4.2 插入操作4.3 删除操作5、平衡二叉树(AVL Tree)1、什么是二叉树(Binary Tree) 二叉树是一种特殊的树,之前我们所讲的数据结构都是线性结构,今天说的二叉树就是一种非线性结构的数据结构。它是具有如下特点的树:其一,每个结点最多只有两棵子树(也就是二叉树中不存在结点的度大于2的结点);其二,二叉树的子树具有左右之分,而且顺序原创 2020-06-09 15:38:00 · 706 阅读 · 0 评论 -
如何设计高度可用的Hash Table之深度剖析哈希表原理
文章目录1、为什么要说哈希表2、什么是哈希表3、哈希函数的构造4、哈希冲突的处理4.1 开放定址法4.2 链地址法5、如何设计一个健壮的哈希表5.1 Hash Table的扩容5.2 如何选择扩容的策略5.3 开放定址法 VS 链地址法6、如何让哈希表中的数据有序? 看这篇博客的时候,我认为你可以结合我的另一篇博客一起阅读,关于Python中的Dict对象的底层实现(如果你有C语言的基础的话),这篇博客中我深入剖析了Python3.6的版本中Dict对象的底层源码,但是我还是建议你先看这篇博客,然后再对原创 2020-06-07 18:38:50 · 456 阅读 · 0 评论 -
高效的查找结构之跳跃表(Skip List)
什么是跳跃表 说实话跳跃表是我非常喜欢的数据结构,虽然很多数据结构和算法的书中并没有讲它,为什么喜欢呢?因为我觉得它最好玩,为什么好玩呢?我也不知道,就是觉得好玩。好了,说了几句废话,现在言归正传。我们之前说过单链表的结构,对于单链表而言,它对于某个元素的查找的时间复杂度是O(n),无论单链表中的数据是有序还是无序都必须要遍历链表上的结点。OK,那我们知道折半查找的性能是非常高的(它实际上也是分而治之的算法思想,由于折半查找比较简单,生活中也随处可见它的案例,所以我没讲这部份内容,不知道的可以去..原创 2020-06-05 21:59:58 · 1448 阅读 · 0 评论 -
排序算法之线性排序--桶排序&计数排序&基数排序
之前我们讲了两类排序算法,它们的时间复杂度分别为O(n^2)和O(nlogn)。这两类排序算法都是基于元素之间比较的算法,接下里要说的几种排序算法都是不基于元素之间比较的算法,因此它们的时间复杂度能够做到O(n),所以这几种排序算法被称为线性排序。 那么既然这几种算法性能这么好,那它们有什么缺点吗?有,其一空间复杂度较之前的比较高,其二它们对数据本身要求很苛刻。现在我们就来看看。桶排序(Bucket Sort) 桶大家都不陌生,它用来装一个或者多个东西的,我们将n个待排序的数据分别放入k个原创 2020-06-03 16:05:16 · 357 阅读 · 0 评论 -
排序算法之归并排序&快速排序
之前我们说了冒泡排序和直接插入排序,这两种排序算法都是O(n^2)的时间复杂度,在数据规模小的时候可以使用这两种,但是对于数据规模比较大的情况复杂度就会比较大了,因此在这一节中我们来看看另外两种排序算法,归并排序和快速排序。归并排序(Merge Sort) 归并排序实际上利用了分而治之的思想,我们先将一个无序的数组分解成两个部分,分别对这两个数组递归进行归并排序,最后将结果合并就能得到一个有序的数组了。也就是说我们是将原本一个大的问题分解成多个小的子问题,这些子问题除了数据规模不一样,求解原创 2020-06-03 00:04:05 · 483 阅读 · 0 评论 -
排序算法之冒泡排序&插入排序
排序概述 排序在计算机程序收集中是一种非常重要的操作,它的功能是将一个数据元素的任意序列,重新排列成一个按照关键字有序的序列。排序算法有非常多,各种各样的排序,你很难去说哪一个最好哪一个更好,只能说 ”存在即合理“ ,每一种排序算法都有自己的特点和优势之处,因此在什么样的场景下选用什么样的排序算法就显得很重要了,这就需要我们能够较为全面地去分析一个排序算法,那么我们一般可以从这几个方面来分析一个排序算法:1、时间开销: 这个不用多说,是我们必须要关注的一个点,而且我们需要关注最坏情况的时间复杂..原创 2020-06-01 17:51:49 · 832 阅读 · 0 评论 -
线性表之队列(queue)结构
1、队列的定义 队列和栈一样同样是操作受限的一种数据结构,但是和栈不一样的是,队列是一种先进先出(first in first out FIFO)的线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作。在队列中,允许插入操作的一端被称之为队尾(rear),允许删除的一端称为队头(front)。 队列在程序设计中是很常见的一种数据结构,例如操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业在运行,这些作业被按照队列的方式进行排队。我们给出一个图示方便理解:2、队列的表原创 2020-05-31 18:07:56 · 1202 阅读 · 0 评论 -
线性表之栈(stack)结构与实现
栈的定义 栈是一种操作受限的数据结构,它只能在表尾进行插入和删除操作,因此对于栈来讲,表尾有特殊的含义,我们称为栈顶(top),表头端称为栈底(bottom), 不含元素的空表称为空栈。栈是一种后进先出(LIFO) 的的线性表。也就是说这种数据结构,对于先进入栈的元素,会比后进入栈的元素更后出来。举个简单的生活中的例子:当有很多人在等电梯的时候,你是第一个进去的,你站到了最里面也就是栈底,但是在如果大家都在同一楼层下的话,你是最后才能出去的。这就是一个典型的栈在生活中的例子。 可能你会问,既然栈是原创 2020-05-28 12:06:03 · 549 阅读 · 0 评论 -
线性表之链表原理与实现
1、链表的存储结构 之前我们讲过顺序表,顺序表的特点就是数据之间逻辑上的相邻关系在物理位置上也是相邻的,因此它可以通过寻址公式随机存取任意一个元素,但是这种特点也为元素的删除和插入带来了极大的不便。链表的特点就是:元素之间逻辑上的相邻关系在物理位置上并不一定相邻,元素的物理地址可以是任意一个合法的地址,这些元素通过指针联系在一起形成了一条链式结构,这样的结构在插入和删除操作时就不需要挪动元素位置,只是通过简单的修改指针的指向就可以了,因此理论上它的时间复杂度为O(1),同时,由于这种特性,因此每个元素的原创 2020-05-23 18:23:19 · 1176 阅读 · 0 评论 -
线性表之顺序表原理与操作
1、线性表的定义 所谓线性表就像是一条线一样连在一起的数据结构,它的严格的定义是:在有限非空的集合中,存在唯一的被称为 ”第一个“ 的数据元素;存在唯一的被称为 ”最后一个“ 的数据元素;除了第一个数据元素外,集合中所有元素有且仅有唯一的前驱元素;除了最后一个元素外,集合中有且仅有唯一的后继元素。2、线性表的顺序表示2.1 顺序表的存储结构 线性表的顺序表示我们简称为顺序表,它表示用一组地址连续的的内存单元一次存储元素,从这个定义我们可以知道这种存储方式实际上是用屋里地址上的连续性来表示原创 2020-05-22 10:36:09 · 684 阅读 · 0 评论 -
代码的执行效率与资源消耗
我们知道程序实际上就是解决的数据的存取以及数据计算的,因此怎么样在低的空间消耗下最快的完成计算任务就是衡量我们代码能力的一个重要标准。数据结构和算法就是解决这两个问题的,如果要设计出好的程序就必须知道如何去衡量一段代码的好坏,也就是做复杂度的分析。1、 时间复杂度 先来看看时间复杂度的定义: 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函原创 2020-05-21 01:33:50 · 706 阅读 · 0 评论
分享