1 数据结构的定义
数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
2 基本概念和术语
2.1 数据
能输入到计算机中并被计算机程序处理的符号的总称。
- 例如:数字、字符、声音、图形、图像等信息
2.2 数据元素
是数据的基本单位,也称结点(node)或记录(record)
2.3 数据项
是数据不可分割的最小单位,也称域(field)。
2.4 数据对象
性质相同的数据元素的集合,是数据的一个子集
- 如:整数数据对象 N = { 0, ±1, ±2, … }
综上: 数据>数据对象>数据元素>数据项
3 数据结构的两层结构
3.1 逻辑结构
与数据的存储无关,独立于计算机
- 如:集合、线性结构、树形结构、图状结构
3.2 物理结构(存储结构)
- 数据元素及其关系在计算机存储器中的存储方式
- 数据结构在计算机中的表示
- 可分为4大类:顺序、链式、索引、散列
其中顺序存储结构借助元素在存储器中的相对位置来表示数据元素间的逻辑关系;链式存储结构借助指示元素存储地址的指针表示数据元素间的逻辑关系。
3.2.1 顺序存储结构
用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
- Loc(元素i)=L0+(i-1)*m
3.2.2 链式存储结构
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示 ,其中连续的两个存储单元中,第一个存储数据,第二个存储下个数据所在的位置。
4 数据结构内容总结
5 关于引用
例如:
int a=4; /*a为普通的整型变量*/
int &b=a; /*b是a的引用变量*/
/*b变量是变量a的引用,b也等于4,这两个变量同步改变*/
另一个例子:
/*
当执行语句swap(a,b)时:a和b的值没有发生交换
值传递
*/
void swap(int x, int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
/*当执行语句swap(&a,&b)时:a和b的值发生了交换
*表示定义指针指向地址,下面代码为把x所在地址单元的值传给temp;y所在单元的值给x所在单元;temp的值传给y所在单元
地址传递
*/
void swap1(int *x, int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
/*当执行语句swap(a,b)时:a和b的值发生了交换
引用传递是直接把值和地址都传了,比地址传递更方便,用符号 &
引用传递
*/
void swap(int &x, int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
6 算法的特性
- 输入:一个算法有零个或多个输入
- 输出:一个算法有一个或多个输出
- 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成
- 确定性:算法中的每一条指令必须有确切的含义,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出(无二义性)
- 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现
7 时间复杂度
即所有语句的执行频率总和。
例1:
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
x=x+1;
时间复杂度为O(n²)
例2:
i=1; //(1)
while(i<=n)
i=i*2; //(2)
语句(1)的频度是1。设语句(2)的频度是f(n),则有:2f(n)≤n,即f(n)≤log2n,取最大值f(n)=log2n 。所以该程序段的时间复杂度 T(n) = 1+f(n)= O(log2n)