1、数据结构基本概念
定义:数据结构 (Data Structure) 是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带 ”结构" 的数据元素的集合, “结构” 就是指数据元素之间存在的关系。 数据结构包括逻辑结构和存储结构两个层次。
1.1、逻辑结构
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立千计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。可以分为以下逻辑结构:
- 集合结构
- 线性结构
- 树结构
- 图结构或网结构
1.2、存储结构
数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。把数据对象存储到 计算机时,通常要求既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系,数据元素在计算机内用一个结点来表示。数据元素在计算机中有两种基本的存储结构,分别是
- 顺序存储
- 链式存储
1.2.1、顺序存储
顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,元素存放在地址连续的存储单元里,通常借助程序设计语言的数组类型来描述。
1.2.2、链式存储
数据元素存放在任意的存储单元里,存储单元可以是连续的,也可以是不连续的。但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。所以链式存储结构通常借助于程序设计语言的指针类型来描述。
2、线性结构和非线性结构
数据结构可以分为线性结构和非线性结构。
2.1、线性结构
线性结构的特点是数据元素之间存在一对一的关系。
线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。
线性结构常见的有:数组、字符串、链表、队列和栈。
2.2、非线性结构
非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。
根据关系的不同,可分为层次结构和群结构。
常见的非线性结构包括:二维数组、多维数组、广义表、树结构,图结构。
3、算法基本概念
首先记住一点,程序=数据结构+算法
定义:算法 (Algorithm) 是为了解决某类问题而规定的一个有限长的操作序列,在计算机中表现为指令的有限序列。\
3.1、算法的五个特性
- 输入:一个算法有零个或多个输入。
- 输出:一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。
- 有穷性:一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
- 确定性:对千每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性。
- 可行性:算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
3.2、评价算法优劣的基本标准
一个算法的优劣应该从以下几方面来评价:
- 正确性。
- 可读性。
- 健壮性。
- 高效性。
3.3、算法的时间复杂度
3.3.1、分析影响因素
影响算法时间代价的最主要因素是问题规模和待处理数据的初态。问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。
一个算法的执行时间大致上等千其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数 和执行一次所需时间的乘积。
一条语句的重复执行次数称作语句频度(FrequencyCount)
由千语句的执行要由源程序经编译程序翻译成目标代码,目标代码经装配再执行, 因此语句执行一次实际所需的具体时间是与机器的软、硬件环境(如机器速度、 编译程序质量等)密切相关的。 所以,所谓的算法分析并非精确统计算法实际执行所需时间,而是针对算法中语句的执行次数做出估计,从中得到算法执行时间的信息。
设每条语句执行一次所需的时间均是单位时间,则一个算法的执行时间可用该算法中所有语句频度之和来度量。
3.3.2、时间复杂度
一般情况下,算法中基本语句重复执行的次数是问题规模n的某个函数f(n), 算法的时间量度记作
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐近时间复杂度, 简称时间复杂度(TimeComplexity)。
符号"O"用来描述增长率的上限,它表示当问题规模n>n0时,算法的执行时间不会超过f(n)。
定理:若f(n)=amnm+am-1nm-1+...+a1n+a0是一个m次多项式,则T(n)=O(nm).
3.3.3、空间复杂度
关于算法的存储空间需求,类似千算法的时间复杂度,我们采用渐近空间复杂度(Space Complexity) 作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数,记作
若算法执行时所需要的辅助空间相对于输入数据量而言是个常数, 则称这个算法为原地工作,辅助空间为O(1),有的算法需要占用临时的工作单元数与问题规模n有关。
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的,当追求一个较好的时间复杂度时,可能会导致占用较多的存储空间,即可能会使空间复杂度的性能变差,反之亦然。不过,通常情况下,鉴于运算空间较为充足,人们都以算法的时间复杂度作为算法优劣的衡量指标。