起初人们解决的主要是数值计算的问题,把现实中的问题抽象出来,得到数学模型,设计算法编写程序来解决。
但是,除了数值计算的问题,还有诸如对于图,表,树等数据结构的处理。
数据结构:研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作的学科。
程序设计 = 数据结构 + 算法
1.1 数据
数据:包含整型,实型等数值类型,字符,声音,图像,视频等非数值类型
1.2 数据元素
组成数据的一组有意义的基本单位,在计算机中通常作为整体处理,也被称为记录。
1.3 数据项
数据项:一个数据元素可以由若干个数据项组成,数据项是数据不可分割的最小单位。
1.4 数据对象
数据元素具有相同的数量和类型的数据项
1.5 数据结构
是相互存在的一种或多种特定关系的数据元素的集合
1.6 逻辑结构与物理结构
逻辑结构面向问题,物理结构面向计算机的存储。
逻辑结构: 是指数据的对象中元素之间的相互关系。
- 集合结构
- 线性结构
- 树形结构
- 图形结构
逻辑结构:是数据的逻辑结构在计算机中的存储形式
- 顺序存储结构:放在地址连续的存储单元里
- 链式存储结构:加上额外的指针来进行寻址
在C语言中,按照取值的不同,数据类型可以分两类:原子类型,结构类型
算法评估
事后分析,事前分析
这里主要讨论事前分析法:
- 算法所采取的策略,方法
- 编译产生的代码质量(软件)
- 问题的输入规模
- 机器执行指令的速度(硬件)
算法的时间复杂度
O(1):常数阶 O(n):线性阶 O(n^2):平方阶 O(logn):对数阶最坏时间复杂度与算法空间复杂度
最坏时间复杂度就是从最坏的角度和概率的视角评估时间复杂度的
原地工作算法:指辅助空间对于与输入的数据量是一个常数,譬如数组反转算法:
借助一个变量t,无论输入规模有多大,t相对于输入来讲在空间的利用上是常数级别的。//中间变量法
#include <iostream>
#include<array>
using namespace std;
int main()
{
int i,t;
array <int,7> a={1,2,3,4,5,6,7};
for(i=0;i<a.size()/2;i++)
{t=a[i];
a[i]=a[a.size()-1-i];
a[a.size()-1-i]=t;
}
for(i=0;i<a.size();i++)
cout << a[i]<<",";
}