数据结构
声明:教材为《数据结构(C语言第二版)》,严蔚敏,李冬梅,吴伟民编著
前言:博客的写作出于个人意愿。本来是想来总结每周课程的,但为了方便和大家一起学习,我尽量偏向半总结半学习,用更通俗的语言来说明。有不懂的、建议、或是不对的地方请指出哟
Chapter_one 绪论
一、基本概念
- 数据:所有输入计算机并被处理的符号的总称
- 数据元素:数据的基本单位。如一名学生的记录,棋盘的一个格局等
- 数据项:组成数据元素的,不可分割的最小单位。如学生记录中的学号、姓名等
- 数据对象:性质相同的数据元素的集合,是数据的子集。如包含所有学生信息的基本信息表,整数数据集合等
二、数据结构
数据结构,分为逻辑结构(抽象)与存储结构(具体)
逻辑结构
- 集合结构:数据元素间没有关系
- 线性结构:一对一
- 树结构:一对多
- 图结构:多对多
存储结构
或称物理结构
- 顺序存储结构:数据元素的存储空间连续
- 链式存储结构:数据元素的存储空间可以不连续
同一逻辑结构可以用不同的存储结构表示
三、抽象数据类型ADT
- 数据对象(对象)
- 数据对象上关系的集合(关系)
- 数据对象的基本操作的集合(操作)
ADT的一种表示是的类的声明,ADT的一种实现是类的实现。
用类对ADT进行理解,对象为类名,关系为类的成员变量,操作为类的成员函数
在使用ADT时采用类C语言,不考虑语法。
- 定义
定义时写出数据对象,数据关系和基本操作
在基本操作中,直接写出函数名,不用考虑函数的具体代码。并写出初始条件(如果有)和操作结果 - 表示
表示类似类的声明 - 实现
实现类似写出函数的具体语句
四、算法分析
算法的五个特性:
- 有穷性
- 确定性
- 可行性
- 输入:零个或多个
- 输出:一个或多个
算法优劣的评价:
- 正确性
- 可读性
- 健壮性
- 高效性
高效性作为最重要的标准,分为时间复杂度和空间复杂度,于是我们就对其进行讨论
首先来了解一下问题规模,用n表示,它在两个复杂度中都将用到。
问题规模:算法求解问题输入量的多少,是问题大小的本质。
看起来挺玄乎,不过大多数情况下指的是输入数据的大小或多少,如排序问题中的待排数量、矩阵运算中的矩阵阶数等等。n越大,程序的运行时间和所占空间越大。
时间复杂度
对时间复杂度最好理解的一种方法是用所有语句执行的总时间来评价,即基于运算次数表示时间复杂度。但遗憾的是,由于计算机高强度的运算能力,以及不同计算机软硬件的差异,导致一次语句的执行时间难以度量。于是我们设一条语句的执行时间均为单位时间,用所有语句的频度,即所有语句的执行次数来判断。
显然,用这种方法能很好比较出不同算法在不同n的情况下的时间复杂度,但缺点显而易见,需要我们一条一条语句去数过来,这谁顶得住啊,程序一旦复杂起来,有很多循环,我看都不想看。而且一旦数错一句,整个时间复杂度就会出错。
于是,机智的人们相出了一种简单的替代方法,即渐进时间复杂度,用T(n)=O(f(n))表示。
f(n)表示运算次数的数量级,我们用最高次幂的那项表示(去掉前面的系数)。因为当n增长时,其最高次项决定了其增长趋势嘛
比如运算次数为f(n)=100n+10,其渐进时间复杂度为O(n);运算次数为f(n)=100,其渐进时间复杂度为O(1)
显然渐进时间复杂度更好表示,也更好从一个算法中看出来,所以将渐进时间复杂度简称时间复杂度,并普遍以此表示算法的时间复杂度。
空间复杂度
一个程序,从被编程出来到被运行,它肯定需要占用空间,我们将其分为三类
- 程序本身占用的空间
- 输入的数据所占用的空间
- 程序所申请的额外辅助空间
由于程序本身占用空间与软硬件有关,输入数据占用空间随具体问题而改变、与算法无关,所以我们用额外所需的空间度量空间复杂度
基本上就是算法所额外定义的变量啥的啦,用S(n)=O(f(n))表示