由于前段时间,遇到一个内存溢出的可怕问题,就是因为没有合理考虑算法执行效率和存储空间大小而导致的,因此,打算再好好学学严蔚敏老师的《数据结构(C语言版)》。我将在学习完每一章后都会写一篇博文,一方面是为了总结学习思路,另一方面是为了加深印象。先从第一章-绪论开始说起吧。
首先,在学数据结构之前,得明白什么是数据结构?为什么要学数据结构?怎么利用数据结构?然后,先从全局把握数据结构的框架,再从细节入手,这样就能做到心中有数,一切问题都能迎刃而解。下面开始进入正题:
1.什么是数据结构?
数据结构: 相互之间存在一种或多种特定关系的数据元素的集合。在我看来,数据结构无非就是(D,S,P),其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。即,通过某种结构将一些数据存储到计算机内,并在这些数据上定义了一些数据运算的方法。文中采用抽象数据类型(一个数学模型以及定义在该模型上的一组操作)来定义一个数据结构,即
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
- 数据对象指的是具有相同性质的数据元素的集合;
- 数据关系指的是数据元素之间的逻辑关系。逻辑关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。顺序映像指的是借助元素在存储器中的相对位置来表示数据元素之间的逻辑结构,即,元素在内存中的存储次序与它们的逻辑次序相同。链式存储结构指的是借助指示元素存储地址的指针表示数据元素之间的逻辑结构,即,使用若干地址分散的存储单元存储数据元素。
- 基本操作的定义格式为
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
2.为什么要学数据结构?
数据结构是软件开发中最重要最基本的理论基础。随着计算机的应用范围的不断扩大,计算机所需要处理的数据越来越复杂,并且规模越来越大。使用简单的逻辑显然无法解决这些复杂的问题,而设计一个高效的算法则可以有效地进行处理,算法设计的要求有:正确性、可读性、健壮性、效率与低存储量需求。算法效率的度量方式有时间复杂度(算法中基本操作重复执行的次数)和空间复杂度(算法在运行过程中临时占用存储空间大小),而不同的数据结构有各自的优势和缺陷,有的利于查询,有的利于删改,因此如何选择数据结构将对算法的执行效率起到至关重要的作用,可以说数据结构是一个算法的基础。
3.怎么利用数据结构?
很多人都会有一个问题存在,就是心里明白数据结构很重要,但是在实际开发过程中,仅仅只满足于实现功能,通常重点会放在一些流行的web框架如SSH,SSM等,使用API对数据做一些简单的增删改查操作,而往往不会考虑执行效率和速度。至于怎么利用好数据结构,我个人感觉,首先,得对数据结构的知识比较了解,对各种数据结构的基本功能和优缺点能了如指掌,这样才能做到灵活运用。其次,需要多动手,最好能动手去实现书本上的伪代码,只有这样,才会更加记忆深刻。
4.数据结构的框架
数据结构的框架从图中可以看出,主要分为线性结构和非线性结构。其中,线性结构包括线性表,栈,队列等,非线性结构包括树和图。每种数据结构也就是接下来每一章的学习重点。