上次和大家聊了一下数据结构的总体概念,其实这个概念对以后我们理解数据结构的各项知识都是很重要的,让你对数据结构会有一个总体的把握。
下面按照考纲的要求,对数据结构的知识点进行梳理。
考试要求:要求熟练掌握常用的数据结构和常用的算法。
知识点:
1.5 常用的数据结构
- 数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、堆)、图等的定义、存储和操作;
- Hash(存储地址计算,冲突处理)。
1.6 常用的算法
- 排序算法、查找算法、数值计算方法、字符串处理方法、数据压缩算法、递归算法、图的相关算法;
- 算法与数据结构的关系、算法效率、算法设计、算法描述(流程图、伪代码、决策表)、算法的复杂性。
一个一个的来,呵呵。
1、数组
- 定义:数组的定义有些复杂,因为数组的多维性,使用语言来对它描述,显得有些繁琐。简单的说一下就是:n维数组是一种“同构”的数据结构,其每个数据元素类型相同,结构一致。数组是定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。(摘自软件设计师教程)。数组的定义有些递归的意思,呵呵。我在“软件工程师之路-软考(中级)1”中的数据结构分类图(见图一)中把数组归到线性表,其实并不准确,那样画图只是为了记忆的方便。 这里需要注意的几个关键字是:同构、多维、定长、有序,掌握这几个词,就会对数组有较深的理解。
- 数组的特点是:
- 数据元素数目固定。一旦定义了一个数组结构,就不再有元素的增减变化。无论静态数组,还是动态数组都是这样的,静态数组和动态数组的区别只是在于定义的时间不同,但是一旦定义,就不会有增加、删除的操作了。
- 数据元素具有相同的类型。这个即是“同构”,对于今后在编程的应用,该特点是需要重点考虑的。
- 数组元素的下标关系具有上下界的约束且下标有序。数组可以通过有序的下标(或称序号)直接访问数组中任一元素(这个特点是根据数组的存储结构得来的,下面会讲到),因为数组的元素数目是固定的,所以这个下标是有界的,即有最大值和最小值,在不同的语言中,数组默认的下界是不同的,C/C++,Java默认是0,且只能为0或正整数。而根据有界,有序的特点,我们在遍历数组时就可以使用For循环语句来操作。
- 数组的特点是:
- 存储:由于数组的数目是固定的,所以数组适合采用顺序存储结构。由于计算机的内存结构是一维线性的,所以存储多维数组时要做降维处理,即将数组元素排成一个线性序列。多维数组一定可以排成一个线性序列嘛?大家知道二维数据可以按照行优先或列优先的方式排列成一维线性序列,而多维数组都是由较低一维的数组定义的,由归纳法可知,任何维树的数组均可排成一个线性序列!而由顺序存储结构的特点可知,只要知道第一个结点的位置Loc(a1)和每个结点的大小La,就可以使用下面的公式直接得出任一结点的位置:
Loc(ai) = Loc(a1) + (i-1)*La (0<=i<=n-1)
- 操作:数组的操作比较简单,只有两种:
- 给定一组下标,存取相应的数据元素;
- 个定一组下标,修改相应的数据元素中某个数据项的值。
在实际的应用当中,主要是要注意数组操作时的越界问题。
在考试中,涉及到数组的不多,主要还是二维数组的行展开和列展开的问题。若是熟悉了以上数组的概念,相信这个问题不难解决。这里用一幅图就可以很清晰的说明这个问题,保证您迅速掌握。(见图二)
图二