算法与数据结构
文章平均质量分 84
算法与数据结构
文丑颜不良啊
平平无奇的Java开发小白
展开
-
数据结构之散列表
数据结构之散列表、哈希表、Hash冲突原创 2022-05-11 16:15:04 · 1799 阅读 · 1 评论 -
数据结构之队列
什么是队列队列(queue)是一种线性数据结构。与同为线性数据结构的栈不同的是队列中的元素遵循的是先进先出(First In First Out)的规则,和在现实中排队一样,讲究的是先来后到的原则。队列出口端叫做队头(front),队列的入口端叫做队尾(rear)。与栈类似,队列这种线性数据结构既可以用数组来实现,也可以用链表来实现。用数组来实现时,我们可以自行规定队尾的位置,比如说规定最后一个元素的下一个位置为队尾,或者规定最后一个元素所在的位置为队尾,这两种都行,毕竟是自己实现的。本文规定最后一原创 2022-02-05 18:11:37 · 3710 阅读 · 1 评论 -
数据结构之栈
什么是栈栈是一种常用的数据结构,其数据存储使用的是逻辑结构。逻辑结构是一个比较抽象的概念,它依赖于物理结构而存在。逻辑结构又分为线性结构和非线性结构。比如顺序表表、栈和队列等就是典型的线性结构,而树和图等就是非线性结构。栈(Stack)是一种线性数据结构,它就像一个单通道的容器,其中的元素只能先进后出(First In Last Out,简称 FILO)。由于其是单通道的,所以决定了最早进入容器的元素只能最晚出。最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。像栈这种线性结构既可原创 2022-01-30 16:06:44 · 2997 阅读 · 0 评论 -
数据结构之链表
什么是链表如果说数组是数据结构界的行列整齐、纪律严明的“正规军”的话,那么链表就是数据结构界的秘密的、但却灵活多变的“地下党”。因为链表的结构很像“地下党”的这种单线联系的关系。单向链表的结构如下:链表(Linked List)是一种在物理上非连续、非顺序的顺序结构,由若干节点(Node)组成。单向链表的每一个节点又包含两个部分,一部分是存放数据的变量 data,一部分是存储指向下一个节点的指针 next。public class Node{ // 数据域 int da原创 2021-11-21 22:04:53 · 1088 阅读 · 0 评论 -
数据结构之数组
数组是有限个相同类型的变量所组成的有序集合,数组中的每一个变量被称为元素。数组是最简单、最常用的数据结构。以整型数组为例,数组的存储形式为:数组中每一个元素都有自己的下标,这个下标从 0 开始,一直到数组长度 - 1 结束。数组的另外一个特点就是在内存中顺序存储,所以可以很好地实现逻辑上的顺序表。那顺序存储是个什么样子呢?我们知道,内存是由一个个连续的内存单元组成的,每一个内存单元都有自己的地址。在这些内存单元中,有些被其他数据占用了,有些是空闲的。数组中的每一个元素都存储在小小的单元中,并且元素之原创 2021-11-07 19:31:15 · 737 阅读 · 0 评论 -
动态规划与 0-1 背包
动态规划思想常常用来解决斐波那契数列相关的题型,比如 LeetCode 和牛客上的“爬楼梯”的题目。有一座高度是 10 级台阶的楼梯,从下往上走,每跨一步只能向上 1 级或者 2 级台阶。要求用程序来求出一共有多少种走法。分析问题:因为每一步只允许走 1 级台阶或 2 级台阶,所以如果只差最后一步就到第 10 级台阶的话,就会有两种方式,要么是从第 9 级走 1 级到第 10 级,要么是从第 8 级走 2 级都到 10 级。所以我们暂时先不用管从 0 到 8 或者从 0 到 9 的过程,反正要想走到第原创 2021-11-03 10:57:43 · 202 阅读 · 0 评论 -
部分背包问题与贪心算法
题目描述:有一个背包,容量为 c,同时有若干物品,价值各不相同,重量也各不相同。我们需要选择一部分物品装入背包,要保证在不超过背包容量的前提下是的装入背包中的物品的总价值最大。与 0-1 背包不同的是,允许选择装入物品的一部分。比如选择 0.5 份的物品 A,或者选择 0.8 份的物品 B。这种背包问题最经典的解法就是使用贪心算法来解决。具体操作过程和思想如下:以上述问题为例,假如背包容量为 10,有 5 个物品可供选择,各个物品的重量和价值为:那么,对于以上物品,我们应该首先选择将哪个物品原创 2021-10-26 15:02:43 · 3204 阅读 · 0 评论 -
算法的空间复杂度
我们知道衡量算法好坏的两个因素分别是时间复杂度和空间复杂度。上一节我们说了时间复杂度,现在我们来看看空间复杂度。那么,什么是空间复杂度呢?我们知道,时间复杂度是执行算法的时间成本,那么,笼统来讲,空间复杂度就是算法执行的空间成本。在运行一段程序时,我们不仅要执行各种运算指令,同时也会根据需要,存储一些临时的中间数据,以便后续指令可以更方便地继续执行。那么存储这些中间数据所需要地成本也属于算法的空间复杂度。那么什么时候需要存储一些中间数据呢?举例来说:有一个需求,需要从给定的一列数中找出重复的数字。那么针原创 2021-10-24 21:49:01 · 919 阅读 · 0 评论 -
算法的时间复杂度
算法一词,其实最早来源于数学领域。在数学领域中,我们最熟知的算法莫过于“高斯算法”了,即等差数列求和公式。那么在计算机领域中,也有众多的算法,排序、查找等都算。算法其实是有好坏之分的。衡量算法的好坏有很多的指标,其中最重要的就是算法的时间复杂度和空间复杂度 。这一节主要说算法的时间复杂度。时间复杂度可直观理解为代码执行时间的长短。实际上,由于受运行环境和输入规模的影响,代码的绝对执行时间是无法预估的,因此我们往往通过计算代码的基本操作执行次数来预估代码的执行时间。以下面几种场景来说明时间复杂度的原创 2021-10-24 18:09:17 · 466 阅读 · 0 评论 -
单链表的应用
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。本文只针对单链表进行说明。一个单链表的节点包含两个值:当前节点的值和指向下一个节点的链接。基本结构就如上图所示,其中数值 1 所在的节点为链表的头节点,头节点的 value 域存储当前节点的值,next 域存储指向下一个节点的链接。Java 中 LinkedList 与 ArrayList 类似,是一种常用的数据容器。提供原创 2021-09-09 11:16:02 · 415 阅读 · 0 评论 -
二叉排序树、红黑树和平衡二叉树
二叉排序树二叉排序树又称为二叉查找树。它要么是一棵空树,要么是具有下列性质的二叉树:(1)若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值。(2)若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值。(3)它的左右子树也分别为二叉排序树。二叉排序树的查找:通常使用递归的方法来查找,即先查找根结点,若关键字与根结点的值相等,则找到,若关键字小于该根结点的值...原创 2019-10-27 19:52:47 · 581 阅读 · 0 评论 -
栈和堆的区别
区别:(1)堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。(2)堆中的内存需要程序员手动申请和释放,栈中内存是由操作系统自动申请和自动释放的,存放着参数、局部变量等内容。(3)堆中频繁调用malloc和free会产生内存碎片,降低程序效率,而栈由于其先进后出的特性,不会产生内存碎片。(4)堆的分配效率较低,栈的分配效率较高。(5)程序的局部变量使用的是栈空间,new/ma...原创 2019-10-22 19:04:23 · 281 阅读 · 0 评论 -
最小栈
所谓最小栈,即是在栈中实现一个min()函数,来保证每次弹栈的时候得到的都是当前栈中的最小值。思考分析后可知,要解决此题,实现一个最小栈,就需要一个辅助栈来辅助主栈完成任务。假设我们要压栈的数据为3、4、2、1、0,其中在1压栈之后,进行两次弹栈操作。思路是这样的:首先我们需要两个栈,一个数据栈s1,一个辅助栈s2。先往空的数据栈s1中压入元素3,显然现在的3是最小值,所以我们也把它压入到...原创 2019-10-19 10:29:48 · 312 阅读 · 0 评论 -
栈中元素排序
题目描述:设计一个算法,将栈中的元素按升序排列。可另外借用一个栈来实现。思路:从主栈中依次弹出栈顶元素压入辅助栈,每当将要压入的元素使得辅助栈中的元素不是升序排列,就将辅助栈里的元素重新压入原始栈,直到辅助栈里的元素都小于当前要压入的元素,然后再压入当前元素。图解:假设当前主栈里的元素是{0,5,6,4,2,3,1}。过程图解如下:(1)最开始时,将元素依次压入主栈中,此时辅助栈为空。...原创 2019-10-07 19:27:16 · 5561 阅读 · 1 评论 -
用两个队列实现栈
首先,明白了栈和队列的特点之后,就发现用队列来实现栈和用栈来实现队列的思想差不多是一样的。队列的特点是先进先出,栈的特点是先进先出,用队列来实现栈,即使用队列来完成先进后出的操作。和用栈实现队列一样,我们假设需要操作的数据为A、B、C、D、E。有两个队列queue1和queue2,和用栈实现队列不同的是,此两个队列没有严格的插入和删除之分,栈实现队列时,我们使用主栈来压栈,辅助栈来弹栈。首先我...原创 2019-10-04 20:04:05 · 2129 阅读 · 0 评论 -
数据结构之线性表的链式存储——链表
为了弥补顺序表插入和删除操作需要移动大量元素的缺点,一般采用链表存储。通俗理解的话就是让所有元素不必考虑存放位置,任意位置存放即可,哪里有空位就存到哪,只是需要每个元素知道其下一个元素的位置在哪里就好。这样我们就可以通过第一个元素找到第二个元素,从而通过遍历找到所有元素。为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储本身的信息之外,还需要存储一个指...原创 2019-01-22 15:45:12 · 538 阅读 · 0 评论 -
数据结构之栈的应用之四则运算
对于四则运算,我们大家都很熟悉,不过就是“先乘除,后加减”的运算规则而已,如果遇上括号,则就先算括号里面的,仍然遵循“先乘除,后加减”的原则。比如,有个式子6*(5-4)+10/5,即为典型的四则运算,那么此式子我们平时怎么运算呢?当然是先算括号里面的5-4啊,于是此式子就变成了6*1+10/5。然后再根据运算规则加以变换就成了6+2,最后当然直接算了啊,结果为8。看起来很容易计算...原创 2019-02-25 22:16:21 · 4535 阅读 · 5 评论 -
数据结构之图的相关概念
图是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中的边的集合。顶点为图中的数据元素。图中任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,而边集可以为空,即两顶点之间无逻辑关系。如下图所示,即为一个标准的图: 无向边:若顶点A到顶点B之间的边没有方向,则称这条边为无向边,用...原创 2019-01-29 18:51:52 · 1922 阅读 · 0 评论 -
数据结构之二叉树
一、二叉树的定义二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。 如上图所示,左图为二叉树。右图不是二叉树,因为其D结点有三个子树,不满足二叉树的定义,所以其不是二叉树。二、二叉树的特点1.二叉...原创 2019-01-28 18:56:42 · 693 阅读 · 0 评论 -
数据结构之树
树是n(n≥0)个结点的有限集。n=0时称为空树。在任意一棵非空树中,有且仅有一个特定的称为根(root)的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、Tm,其中每一个集合本身又是一棵树,并且称为根的子树。如下图所示,子树T1和子树T2就是根结点A的子树。同样,如果再细分下去,D、G、H、I组成的数就是根结点为B的树的子树,E...原创 2019-01-25 17:16:17 · 1069 阅读 · 0 评论 -
数据结构之线性表的顺序存储——顺序表
线性表线性表即零个或多个数据元素的有限序列。首先它是一个序列,其次它的元素之间是有顺序的,若存在多个元素,则首个元素无前驱,末尾元素无后继,除此之外,每个元素都有一个前驱和一个后继。用n来表示线性表元素的个数,当n=0时,即表明线性表中无元素,称为空表。线性表又可分为动态线性表和静态线性表。静态线性表的容量大小是固定的,而动态线性表的容量可根据表中元素实现自动扩容。线性表的顺序存储结构——顺...原创 2019-01-20 15:54:12 · 779 阅读 · 0 评论 -
数据结构之栈
栈是限定仅在表尾进行插入和删除操作的线性表。栈又可以称为后进先出(Last In First Out)的线性表,简称LIFO结构。我们把允许插入和删除的一端称为栈顶,另一端称为栈底。由栈的定义可知,首先,它是一个线性表,也就是说,栈的元素具有线性关系,即前驱后继的关系。只不过它是一种特殊的线性表而已。定义中所谓的在线性表的表尾进行插入和删除操作,此表尾指的是栈顶,而不是栈底。说栈是一种特殊的线...原创 2019-01-22 23:38:31 · 218 阅读 · 0 评论 -
数据结构之队列
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In Fitst Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为对头。队列的先进先出的结构正好符合日常生活中人们的生活习惯,即排在第一位的优先出栈,最后来的人自然排在队列最后了。 由于队列是特殊的线性表,所以也可以采用数组来顺序存储。假设一个...原创 2019-01-23 15:39:14 · 1506 阅读 · 0 评论 -
初识数据结构
数据是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输出给别的计算机处理的符号的集合。包括整型、实型等数值类型,还有声音、图像、视频等非数值类型。数据对象是具有相同特征的数据元素的集合,是数据的一个子集。数据元素是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。数据项是组成数据的不可分割的最小单位。关系:数据对象就相当于一个班的学生,而每个学生又是班级这个...原创 2019-01-18 08:59:00 · 167 阅读 · 0 评论 -
数据结构之七大排序
假设含有n个记录的序列为,其相应的关键字分别为,需确定1,2,......,n的一种排列,使其相应的关键字满足(非递减或非递增)关系,即使得序列成为一个按关键字有序的序列,这样的操作就称为排序。 假设,且在排序前的序列中领先于(即i<j)。如果排序后仍然领先于,则称所用的排序方法是稳定的;反之,若排序后的领先于,则称所用的排序方法是不稳定的。...原创 2019-09-01 22:39:06 · 630 阅读 · 0 评论 -
数据结构之二叉树的存储与遍历
一般情况下,二叉树可以采用顺序存储结构和链式存储结构来存储。二叉树顺序存储结构 二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置即数组的下标要能体现出结点之间的逻辑关系,比如双亲与孩子的关系,左右孩子的兄弟关系等。如果有一棵二叉树如下图所示 将相应的下标存入到数组中对应的位置之后,其存储的情况为:...原创 2019-09-03 12:35:07 · 1313 阅读 · 0 评论 -
用两个栈实现队列
我们知道,栈的特点是先进后出,而队列的特点是先进先出,那么如何用先进后出的栈来完成队列的先进先出的操作呢?很明显,用一个栈是不能实现的,因此我们需要一个辅助栈来配合主栈完成。假设我们先把元素A、B、C、D压栈压到主栈stack1中,那么此时主栈中的元素就为{A,B,C,D},其中A为栈底元素,D为栈顶元素。如果此时我们需要删除元素,按照队列先进先出的原则,我们应该删除元素A,但此时元素A位于主...原创 2019-10-04 14:51:29 · 142 阅读 · 0 评论 -
数据结构之字符串匹配
串是由零个或多个字符组成的有限序列,又名字符串。一般记为s="a1a2......an"(n≥0),其中,s是串的名称,用双引号括起来的字符序列是串的值。串中的字符数目n称为串的长度。零个字符的串称为空串,其长度为0。所谓的序列,说明串的相邻字符之间具有前驱和后继的关系。字符串匹配即查找待匹配字符串(模式串)p在主串s中的位置。一般处理这种问题往往采用简单粗暴的方法——暴力匹配法。所谓暴力匹配...原创 2019-01-22 13:58:12 · 721 阅读 · 0 评论
分享