图解数据结构与算法pdf电子书提取码

简介: 图解+步骤学数据结构,适合非编程读者。

目      录

在计算机科学中,数组是我们最熟悉也是最基础的一种数据结构。通常地,数组由有限个相同数据类型的元素按顺序排列组合而成。数组的数据是连续的,并且会设定上界和下界,其中的每个元素都有属于它们自己的索引值(也称下标),通过这些下标就能定位到元素。对于绝大多数编程语言来说,数组的索引都是从0开始,但不排除有的编程语言从1开始。

几乎所有程序都会使用数组结构,而且很多其他的数据结构也可以由数组来实现,比如栈、队列、列表等。

根据维度的不同,数组可以分为一维数组、二维数组、三维数组等,以此类推。

在各种维度的数组中,一维数组是最简单的数组结构,通常它也被称为线性数组。

① 创建一个长度为10的数组。

② 将11、22、33、44四个数字放到数组中。

③ 再将“the”“monster”“is”“coming”四个字符串放到数组中,覆盖原来的前四个元素。

④ 获取数组下标为0和3所对应元素的字符串。

⑤ 数组大小为10,则下标范围为0~9,如果超出范围即越界,将会导致错误。

由于数学领域中的矩阵可以通过二维数组来表示,因此二维数组也被称为矩阵。此外,因为它是二维的结构,所以需要两个下标才能确定一个元素,即行下标和列下标。

① 创建一个3行10列的二维数组(矩阵),它一共可存放30个元素。

② 将“the”“monster”“is”“coming”四个字符串分别放到数组的(0,1)、(2,2)、(2,6)、(1,4)四个坐标上。

③ 获取二维数组(2,6)、(1,4)坐标中所保存的字符串。

数组的维度数可以看成是获取一个元素所需的索引数,比如一维数组需要一个索引,二维数组则需要两个索引。三维数组即由三个维度组成的数组,它是最常见的多维数组,由三个下标去描述数组中的元素,也就是说获取数组中的一个元素需要三个索引。

按照正常思维,我们常常会用现实世界中的三维空间来对应三维数组以进行理解,比如一维数组对应列表,二维数组对应方形表格,而三维数组对应的是立体空间表格。对于三维及三维以下的数组,这样理解没什么问题,但对于更高维度的数组,我们就很难用现实世界中相关的概念来对应四维、五维或更高维数组,所以这样的思维方式不利于我们理解更高维度的数组。

通常地,我们可以以索引的形式来理解数组,每个维度都可以看成是一层索引,三维的情况则可以看成如下的形式。

如果将“the”放到(0,1,2)坐标中,则如下图所示。

更高维度的数组则可以继续往上抽取一维,形成一种类似于树的结构。

链表是一种线性的数据集合。在链表中,每个节点都指向后继或前驱节点,也就是说每个节点都会包含数据和指针。链表中的节点在逻辑上是相连的,但在物理内存中却是不相连的,这种特性让链表拥有了高效的插入和删除操作。

总的来说,虽然链表实现的存储结构与传统数组的结构类似,但它也有一定的优势。其优势主要体现在两方面:其一,链表能够实现更高效的插入和删除操作;其二,较于数组,它能避免重新分配内存的情况,因为数组是有固定大小的,当数组内存不够使用时,则需要重新分配更大的内存。以上优势得益于链表的存储可以是非连续的内存空间,这样就允许在链表的任意位置进行插入和删除操作,并且能在常数的时间复杂度内完成。

当然,链表也有自己的缺点,具体如下。

比起数组,链表会占用更多内存空间,因为链表需要保存额外的指针。

链表不支持随机访问,只能按顺序从头开始查找,访问时间是线性的,而数组则可以实现随机访问。

链表存储的内存是非连续的,在计算机中,这种情况有可能导致访问的效率降低,因为CPU存在缓存机制,而CPU缓存一般是将整块连续内存缓存起

版权:人民邮电出版社