数据结构
文章平均质量分 56
博客菜鸟飞飞飞
blog rookie
展开
-
BFS 和 DFS 的优缺点
BFS 和 DFS 的优缺点BFS(2^n):空间是指数级别的 大!!!空间是自己开的数组,存在堆里,不存在爆栈的风险。最短、最小DFS(n):空间和深度成正比 小!!!有爆栈的风险,比如树的深度最坏可能有100000层。不能搜最短、虽小...原创 2021-10-21 22:32:35 · 1249 阅读 · 0 评论 -
动态规划是个什么玩意?
背景分治法的使用必须满足 4 个条件:问题的解决难度与数据规模有关;原问题可被分解;子问题的解可以合并为原问题的解;所有的子问题相互独立。然而在实际工作中还存在这样一类问题,它们满足前 3 个条件,唯独不满足第 4 个条件。那么这类问题我们该怎么解决呢?求解这类问题我们可以使用动态规划算法,它是最常用的算法之一。什么是动态规划从数学的视角来看,动态规划是一种运筹学方法,是在多轮决策过程中的最优方法。那么,什么是多轮决策呢?其实多轮决策的每一轮都可以看作是一个子问题。从分治法的视角来看,原创 2020-10-01 15:52:47 · 419 阅读 · 1 评论 -
排序算法的原理解析和优劣对比
什么是排序排序,就是让一组无序数据变成有序的过程。 一般默认这里的有序都是从小到大的排列顺序。如何判断不同的排序算法的优劣呢?衡量一个排序算法的优劣,我们主要会从以下 3 个角度进行分析:时间复杂度,具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度。空间复杂度,如果空间复杂度为 1,也叫作原地排序。稳定性,排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。常见的排序算法及其思想接下来,我们就开始详细地介绍一些经典的排序算法。冒泡排序冒泡排序的原理原创 2020-09-29 09:21:15 · 870 阅读 · 0 评论 -
如何利用分治思想实现数据查找?
从定性的角度来看,分治法的核心思想就是“分而治之”。利用分而治之的思想,就可以把一个大规模、高难度的问题,分解为若干个小规模、低难度的小问题。随后,开发者将面对多个简单的问题,并很快地找到答案各个击破。在把这些简单问题解决好之后,我们通过把这些小问题的答案合并,就得到了原问题的答案。分治法应用很广泛,很多高效率的算法都是以分治法作为其基础思想,例如排序算法中的快速排序和归并排序。分治法是什么?计算机求解问题所需的计算时间,与其涉及的数据规模强相关。简而言之,问题所涉及的数据规模越小,它所需的计算时间也原创 2020-09-28 08:54:34 · 468 阅读 · 0 评论 -
递归是个什么玩意?
在数学与计算机科学中,递归 (Recursion))是指在函数的定义中使用函数自身的方法,直观上来看,就是某个函数自己调用自己。递归有两层含义:递归问题必须可以分解为若干个规模较小、与原问题形式相同的子问题。并且这些子问题可以用完全相同的解题思路来解决;递归问题的演化过程是一个对原问题从大到小进行拆解的过程,并且会有一个明确的终点(临界点)。一旦原问题到达了这个临界点,就不用再往更小的问题上拆解了。最后,从这个临界点开始,把小问题的答案按照原路返回,原问题便得以解决。简而言之,递归的基本思想就是原创 2020-09-23 09:11:39 · 3885 阅读 · 0 评论 -
哈希表——高效率的利器
关于数据的处理,不同的数据结构各有千秋。线性表中的栈和队列对增删有严格要求,它们会更关注数据的顺序。数组和字符串需要保持数据类型的统一,并且在基于索引的查找上会更有优势。树的优势则体现在数据的层次结构上。但它们普遍都存在这样的缺陷,那就是数据数值条件的查找,都需要对全部数据或者部分数据进行遍历。但是哈希表可以实现高效率的查找。什么是哈希表哈希表名字源于 Hash,也可以叫作散列表。哈希表的设计采用了函数映射的思想,将记录的存储位置与记录的关键字关联起来。这样的设计方式,能够快速定位到想要查找原创 2020-09-22 09:13:34 · 1682 阅读 · 0 评论 -
树和二叉树所在的分支关系与层次结构下的增删改查
树是什么树是由结点和边组成的,不存在环的一种数据结构树满足递归定义的特性。也就是说,如果一个数据结构是树结构,那么剔除掉根结点后,得到的若干个子结构也是树,通常称作子树。在一棵树中,根据结点之间层次关系的不同,对结点的称呼也有所不同。我们来看下面这棵树,如下图所示:A 结点是 B 结点和 C 结点的上级,则 A 就是 B 和 C 的父结点,B 和 C 是 A 的子结点。B 和 C 同时是 A 的“孩子”,则可以称 B 和 C 互为兄弟结点。A 没有父结点,则可以称 A 为根结点。G、H、I原创 2020-09-17 14:42:49 · 924 阅读 · 0 评论 -
字符串——什么是字符串匹配算法?
什么是字符串字符串(string) 是由 n 个字符组成的一个有序整体( n >= 0 )。例如,s = “BEIJING” ,s 代表这个串的串名,BEIJING 是串的值。这里的双引号不是串的值,作用只是为了将串和其他结构区分开。字符串的逻辑结构和线性表很相似,不同之处在于字符串针对的是字符集,也就是字符串中的元素都是字符,线性表则没有这些限制。在实际操作中,我们经常会用到一些特殊的字符串:空串,指含有零个字符的串。例如,s = “”,书面中也可以直接用 Ø 表示。空格串,只包含空格的串原创 2020-09-16 12:20:30 · 719 阅读 · 0 评论 -
数组——基于索引的查找
什么是数组数组是数据结构中的最基本结构,几乎所有的程序设计语言都把数组类型设定为固定的基础变量类型。我们可以把数组理解为一种容器,它可以用来存放若干个相同类型的数据元素。例如:存放的数据是整数型的数组,称作整型数组;存放的数据是字符型的数组,则称作字符数组;另外还有一类数组比较特殊,它是数组的数组,也可以叫作二维数组。如果用数学的方式来看,我们可以把普通的数组看成是一个向量,那么二维数组就是一个矩阵。不过,二维数组对数据的处理方式并没有太多特别之处。数组可以把这些具有相同类型的元素,以一种不规原创 2020-09-10 15:51:04 · 1541 阅读 · 0 评论 -
队列——先进先出的增删改查
什么是队列与栈相似,队列也是一种特殊的线性表,与线性表的不同之处也是体现在对数据的增和删的操作上。队列的特点是先进先出:先进,表示队列的数据新增操作只能在末端进行,不允许在队列的中间某个结点后新增数据;先出,队列的数据删除操作只能在始端进行,不允许在队列的中间某个结点后删除数据。也就是说队列的增和删的操作只能分别在这个队列的队尾和队头进行,如下图所示:与线性表、栈一样,队列也存在这两种存储方式,即顺序队列和链式队列:顺序队列,依赖数组来实现,其中的数据在内存中也是顺序存储。而链式队列,原创 2020-09-08 13:25:12 · 1969 阅读 · 0 评论 -
栈——后进先出的增删改查
线性表是使用非常广泛的一类数据结构,它对数据的顺序非常敏感,而且它对数据的增删操作非常灵活。在有序排列的数据中,可以灵活的执行增删操作,就好像是为排好队的数据增加了插队的入口。这既是灵活性也是缺陷,原因在于它的灵活性在某种程度上破坏了数据的原始顺序。在某些需要严格遵守数据处理顺序的场景下,我们就需要对线性表予以限制了。经过限制后的线性表,它们通常会被赋予一些新的名字,比如:栈。什么是栈栈是特殊的线性表,栈的数据结点必须后进先出。后进的意思是,栈的数据新增操作只能在末端进行,不允许在栈的中间某个结点后新增原创 2020-09-07 10:23:48 · 603 阅读 · 0 评论