- 博客(15)
- 收藏
- 关注
转载 14、动态规划
什么是动态规划从数学的视角来看,动态规划是一种运筹学方法,是在多轮决策过程中的最优方法。那么,什么是多轮决策呢?其实多轮决策的每一轮都可以看作是一个子问题。从分治法的视角来看,每个子问题必须相互独立。但在多轮决策中,这个假设显然不成立。这也是动态规划方法产生的原因之一。最短路径问题接下来。我们来看一个非常典型的例子,最短路径问题。如下图所示:每个结点是一个位置,每条边是两个位置之间的距离。现在需要求解出一条由 A 到 G 的最短距离是多少。不难发现,我们需要求解的路线是由 A
2021-12-12 23:36:26
192
转载 13、排序
什么是排序问题排序,就是让一组无序数据变成有序的过程。 一般默认这里的有序都是从小到大的排列顺序。下面我们先来讲讲,如何判断不同的排序算法的优劣。衡量一个排序算法的优劣,我们主要会从以下 3 个角度进行分析:1.时间复杂度,具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度。2.空间复杂度,如果空间复杂度为 1,也叫作原地排序。3.稳定性,排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。常见的排序算法及其思想冒泡排序1.冒泡排序的原理从第一个数据开
2021-12-12 23:34:42
289
1
转载 12、分治法
分治法是什么计算机求解问题所需的计算时间,与其涉及的数据规模强相关。简而言之,问题所涉及的数据规模越小,它所需的计算时间也越少;反之亦然。我们来看一个例子:在一个包含 n 个元素的无序数组中,要求按照从小到大的顺序打印其 n 个元素。假设我们采用 n 个元素之间的两两比较的计算方法,去得到从小到大的序列。分析如下: 当数据量 n = 1 时,不需任何计算,直接打印即可; 当数据量 n = 2 时 ,那需要做 1 次比较即可达成目标; 当数据量 n = 3 时,要对这 3
2021-12-12 23:33:24
548
转载 11、递归
什么是递归在数学与计算机科学中,递归 (Recursion))是指在函数的定义中使用函数自身的方法,直观上来看,就是某个函数自己调用自己。递归有两层含义: 递归问题必须可以分解为若干个规模较小、与原问题形式相同的子问题。并且这些子问题可以用完全相同的解题思路来解决; 递归问题的演化过程是一个对原问题从大到小进行拆解的过程,并且会有一个明确的终点(临界点)。一旦原问题到达了这个临界点,就不用再往更小的问题上拆解了。最后,从这个临界点开始,把小问题的答案按照原路返回,原问题便得以解决。
2021-12-12 21:34:26
275
转载 10、哈希表
什么是哈希表哈希表名字源于 Hash,也可以叫作散列表。哈希表是一种特殊的数据结构,它与数组、链表以及树等我们之前学过的数据结构相比,有很明显的区别。哈希表的核心思想在我们之前学过的数据结构里,数据的存储位置和数据的具体数值之间不存在任何关系。因此,在面对查找问题时,这些数据结构必须采取逐一比较的方法去实现。而哈希表的设计采用了函数映射的思想,将记录的存储位置与记录的关键字关联起来。这样的设计方式,能够快速定位到想要查找的记录,而且不需要与表中存在的记录的关键字比较后再来进行查找。我们回
2021-12-12 21:33:03
521
转载 9、树和二叉树
树是什么树是由结点和边组成的,不存在环的一种数据结构。通过下图,我们就可以更直观的认识树的结构。树满足递归定义的特性。也就是说,如果一个数据结构是树结构,那么剔除掉根结点后,得到的若干个子结构也是树,通常称作子树。在一棵树中,根据结点之间层次关系的不同,对结点的称呼也有所不同。我们来看下面这棵树,如下图所示: A 结点是 B 结点和 C 结点的上级,则 A 就是 B 和 C 的父结点,B 和 C 是 A 的子结点。 B 和 C 同时是 A 的“孩子”,则可以称 B 和 C 互
2021-12-12 21:28:12
632
转载 8、字符串
字符串是什么字符串(string) 是由 n 个字符组成的一个有序整体( n >= 0 )。例如,s = "BEIJING" ,s 代表这个串的串名,BEIJING 是串的值。这里的双引号不是串的值,作用只是为了将串和其他结构区分开。字符串的逻辑结构和线性表很相似,不同之处在于字符串针对的是字符集,也就是字符串中的元素都是字符,线性表则没有这些限制。在实际操作中,我们经常会用到一些特殊的字符串: 空串,指含有零个字符的串。例如,s = "",书面中也可以直接用 Ø 表示。 空格
2021-12-12 21:26:02
384
转载 7、数组 - 基于索引的查找
数组是什么数组是数据结构中的最基本结构,几乎所有的程序设计语言都把数组类型设定为固定的基础变量类型。我们可以把数组理解为一种容器,它可以用来存放若干个相同类型的数据元素。例如: 存放的数据是整数型的数组,称作整型数组; 存放的数据是字符型的数组,则称作字符数组; 另外还有一类数组比较特殊,它是数组的数组,也可以叫作二维数组。 如果用数学的方式来看,我们可以把普通的数组看成是一个向量,那么二维数组就是一个矩阵。不过,二维数组对数据的处理方式并没有太多特别之处。数组可以
2021-12-12 01:02:06
243
转载 6、增删改 - 队列 - 先进先出的线性表
队列是什么与栈相似,队列也是一种特殊的线性表,与线性表的不同之处也是体现在对数据的增和删的操作上。队列的特点是先进先出: 先进,表示队列的数据新增操作只能在末端进行,不允许在队列的中间某个结点后新增数据; 先出,队列的数据删除操作只能在始端进行,不允许在队列的中间某个结点后删除数据。也就是说队列的增和删的操作只能分别在这个队列的队尾和队头进行,如下图所示: 与线性表、栈一样,队列也存在这两种存储方式,即顺序队列和链式队列: 顺序队列,依赖数组来实现,其中的数据在内存中也
2021-12-12 01:00:27
133
转载 5、增删改 - 栈 - 后进先出的线性表
栈是什么栈是一种特殊的线性表。栈与线性表的不同,体现在增和删的操作。具体而言,栈的数据结点必须后进先出。后进的意思是,栈的数据新增操作只能在末端进行,不允许在栈的中间某个结点后新增数据。先出的意思是,栈的数据删除操作也只能在末端进行,不允许在栈的中间某个结点后删除数据。也就是说,栈的数据新增和删除操作只能在这个线性表的表尾进行,即在线性表的基础上加了限制。如下图所示:因此,栈是一种后进先出的线性表。栈对于数据的处理,就像用砖头盖房子的过程。对于盖房子而言,新的砖头只能放在前一个砖头上面;而对
2021-12-12 00:58:25
212
转载 4、增删改 - 线性表
什么是数据结构首先,我们简单探讨一下什么是数据结构。数据结构,从名字上来看是数据的结构,也就是数据的组织方式。在数据结构适用的场合中,需要有一定量的数据。如果数据都没有,也就不用讨论数据如何组织了。当我们有了一定数量的数据时,就需要考虑以什么样的方式去对这些数据进行组织了。接下来,我将通过一个实际案例来帮助你更好地理解数据结构。假设你是一所幼儿园的园长,现在你们正在组织一场运动会,所有的小朋友需要在操场上接受检阅。那么,如何组织小朋友有序站队并完成检阅呢?几个可能的方式是,让所有的小朋友站成一横
2021-12-12 00:49:44
400
转载 3、增删改 - 基本操作
代码对数据的处理我们重温一下上一课时的例子。在一个数组中找出出现次数最多的那个元素的数值。例如,输入数组 a = [1,2,3,4,5,5,6] 中,只有 5 出现了两次,其余都是 1 次。显然 5 出现的次数最多,则输出 5。为了降低时间复杂度,我们引入了 k-v 的字典的数据结构。那么问题来了,究竟是什么原因,促使我们想到了使用字典的数据结构呢?如果不使用字典,改为使用数组行不行呢?为了回答这些问题,我们先看一下究竟此处代码需要对数据进行哪些操作。我们提到过,这段代码处理数据的核心思路是:
2021-12-11 15:00:28
483
转载 2、时间转空间
时间昂贵、空间廉价一段代码会消耗计算时间、资源空间,从而产生时间复杂度和空间复杂度,那么你是否尝试过将时间复杂度和空间复杂进行下对比呢?其实对比过后,你就会发现一个重要的现象。假设一段代码经过优化后,虽然降低了时间复杂度,但依然需要消耗非常高的空间复杂度。 例如,对于固定数据量的输入,这段代码需要消耗几十 G 的内存空间,很显然普通计算机根本无法完成这样的计算。如果一定要解决的话,一个最简单粗暴的办法就是,购买大量的高性能计算机,来弥补空间性能的不足。反过来,假设一段代码经过优化后,依然需要消耗
2021-12-11 14:58:41
1174
转载 1、时间复杂度
当你在大数据环境中开发代码时,你一定遇到过程序执行好几个小时、甚至好几天的情况,或者是执行过程中电脑几乎死机的情况: 如果这个效率低下的系统是离线的,那么它会让我们的开发周期、测试周期变得很长。 如果这个效率低下的系统是在线的,那么它随时具有时间爆炸或者内存爆炸的可能性。 因此,衡量代码的运行效率对于一个工程师而言,是一项非常重要的基本功。本课时我们就来学习程序运行效率相关的度量方法。复杂度是什么复杂度是衡量代码运行效率的重要的度量因素。在介绍复杂度之前,有必要先看一下复杂度..
2021-12-11 14:54:44
1268
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人