(自用,侵删)
主要研究问题:合理组织数据,高效处理数据
研究内容涉及:数据如何组织,如何存储,运算如何实现
一、基本概念和术语
数据:客观事物的符号表示,是所有能输入到计算机并被计算机程序处理的符号的总称。
数据元素:数据的基本单位
用于完整地描述一个对象
数据项:组成数据元素的、具有独立含义的、不可分割的最小单位
数据对象:是性质相同的数据元素的集合,是数据的一个子集
只要集合内元素的性质相同,都可称之为一个对象
二、数据结构
是相互之间存在一种或多种特定关系的数据元素的集合(带结构)
数据结构由数据的逻辑结构、物理结构和算法三部分组成(2004)
包括逻辑结构和存储结构两个层次
逻辑结构
数据的逻辑结构是指数据的组织形式,即数据元素之间逻辑关系总体,而逻辑结构是指数据元素之间的关联方式或称“邻接关系”
与数据存储无关,独立于计算机
包括两个要素:数据元素、关系
集合结构(属于同种集合)、线性结构(一对一)、树结构(一对多)、图结构或网状结构(多对多)
数据的逻辑结构
线性结构 非线性结构
线性表 树结构 图结构 集合结构
一般线性表 特殊线性表 线性表的推广 树 二叉树 有向图 无向图 线性表 栈与队列 字符串 数组 广义表
广义表不是线性表:它的数据元素是一个线性表,但不同构(可能是单元素,也可能是线性表)
有序表是指表中元素有序,是逻辑结构而非存储结构。
存储结构(物理结构)
数据对象在计算机中的存储表示(又称映像)
实现数据结构的基本操作的重要准则是实现应用程序与存储结构的独立(2002华南理工)
两种基本存储结构:顺序存储结构 和 链式存储结构
散列存储、索引存储
三、数据类型和抽象数据结构类型
数据结构是一个值的集合和定义在这个值集上一组操作的总称
规定了数据的取值范围、存储方式以及允许进行的运算
抽象数据类型一般是指由用户定义、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
包括三部分:数据对象、数据对象上关系的集合、对数据对象的基本操作的集合
ADT 抽象数据类型名{
数据对象:< >
数据关系:< >
基本操作:< >
}ADT 抽象数据类型名
四、算法和算法分析
算法是为了解决某类问题而规定的一个有限长的操作序列。
算法是问题求解步骤的描述(1998中山大学)
1.算法特性
有穷性:一个算法必须在执行有穷步后结束,且在有穷的时间内完成。
确定性:没有二义性。
可行性:所有操作都可以通过已经实现的基本操作执行有限次来实现。
输入:零个或多个输入
输出:一个或多个输出
2.评判算法优劣的标准
正确性:在有限的运行时间内得出正确的结果。
可读性:便于理解和沟通。
健壮性:对输入的非法数据适当地做出正确的反应或进行相应处理。
高效性:包括时间和空间的两个方面。
时间复杂度和空间复杂度是衡量算法的两个主要指标。
时间复杂度
衡量算法效率的方法:事前分析估计法、事后统计法
影响算法时间代价的最主要因素是问题规模(算法求解问题输入量的多少)
时间复杂度是指在最坏情况下,估算算法执行时间的一个上界
空间复杂度
习题
非编程
1.1执行下列算法f(1000),输出结果是1024
void f(int n)
{
int i=1;
while (i<=n) i*=2;
printf("%d",i);
}
//...
1.2某算法的时间复杂度为,表明该算法执行时间与成正比
1.3数据结构和数据类型的形式定义分别为:
Data-Structure = (D,R)
Data-Type = (D,R,P)
D,R,P的确切含义分别为:数据对象,关系,基本操作
1.4汉诺塔递归中,碟子个数为n,则时间复杂度为
2.1抽象数据类型的定义仅取决于它的一组逻辑特性,而与在计算机内部如何表示和实现无关,即不论内部结构如何变化只要它的数学特性不变,都不影响其外部使用。(西安电子科技大学1998)
2.2计算机执行下面的语句时,语句s的执行次数为
for(i=1;i<n-1;i++)
for(j=n;j>=i;j--) s;
2.3设m、n均为自然数,m可表示为一些不超过n的自然数之和,f(m,n)为这种表示方式的数目。例如f(5,3) = 5有5种表示方式:3+2,3+1+1,2+2+1,2+1+1+1,1+1+1+1+1.
填充完成该程序
int f(m,n)
int m,n;
{if(m==1)
return____;
if(n==1){
return____;}
if(m<n)
{return f(m,n);}
if(m==n)
{return 1+____;}
return f(m,n-1)+f(m-n,___);
}
编程
解决“百钱百鸡”问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
#include <stdio.h>
#define M 100
int main()
{
int m, n, i, j, k;
for (i = 0; i <= M / 5; i++) {
m = M - 5 * i;
for (j = 0; j <= m / 3; j++) {
n = m - 3 * j;
k = 3*n;
if (i + j + k == 100)
printf("翁为%d,母为%d,雏为%d\n", i, j, k);
}
}
return 0;
}
for(i=0;i<15;i++)
for(j=0;j<33-i:j++)
if(5*i+3*j+1/3*(100-i-j)==100)
cout<<"翁="<<i<<"母="<<j<<"雏="<<(100-i-j)<<endl;