day1(上)
1.绪论
学习对象:研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科
学习方法:画图---》理解---》做题
1.1 基本概念
1.1.1 数据
数据:描述客观事物的符号。
示例:
网页:全部数据的搜索
特征:
(1)可以输入到计算机中
(2)能被计算机处理
1.1.2 数据元素
数据元素(结点):是组成数据的、有一定意义的基本单位。在计算机中通常作为整体处理。
示例:
1.1.3 数据项
数据项:一个数据元素可以由若干个数据项组成
示例:
1.1.4 数据对象
数据对象:是性质相同的数据元素的集合,是数据的子集。
1.1.5 结构
结构是指各个组成部分相互搭配和排列的方式
示例:分子结构
1.1.6 数据结构
数据结构:带“结构”的数据元素的集合。
1.2 逻辑结构
逻辑结构:数据对象中数据元素之间的相互关系
(1)集合
数据元素除了同属于一个集合外,它们之间没有其他关系。(各个元素 “平等”)
路人甲,路人乙
夜空中的星星
(2)线性结构
数据元素之间是一对一的关系
项链,火车车厢、桶装薯片,肉串
(3)树形结构
树形结构中的数据元素 之间存在一对多的层次关系
族谱
(4)图形结构
数据元素是多对多的关系
地图:条条大路通罗马
1.3 存储结构
数据的逻辑结构在计算机中的存储形式
(1)顺序存储结构
示例:数组
数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系一致
(2)链式存储结构
示例:客户在家,线上预约核酸检测
是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
理解:数据元素的存储关系并不能反应其逻辑关系,需要借助指针存放数据元素的地址。通过地址找到相关数据元素的位置。
(3)散列存储(hash)
班级名称
班级编号 | 关键字 |
---|---|
20011 | 1 |
20021 | 2 |
20031 | 3 |
20041 | 4 |
20051 | 5 |
在元素的存储位置和其关键字之间建立某种直接的联系。
关键字:key
散列地址:p(即数组下标)
散列函数:H(key)对元素的关键字进行某种运算,直接求出元素的地址。
散列表:又称哈希表(hash table),一个连续的地址空间,用以存储按散列函数计算得到的相应散列地址的数据记录
(4)索引存储
除了建立存储结点信息外,还建立附加的索引表来标识结点的地址
示例1:手机通讯录查找某人:如张三,首字母是z,滑到通讯录最后,不会从头开始向下查找
示例2:字典查找某单词的含义
2. 算法
2.1 概念
算法是解决特定问题而规定的一个有限长的操作序列。
2.2 基本特性
有穷性、确定性、可行性、输入、输出
例题:
计算1-100 0000累加
算法一:
int i;
unsigned long int sum=0;
for(i=0;i<100 0000;i++)
sum+=i;
printf("%u\n",sum);
算法2
int sum=(1+100 0000)*100 0000/2;
printf("%u\n",sum);
使用高斯公式(1+100 0000)*100 0000/2
3 评价算法
评价算法优劣的的基本标准
(1)正确性:得到正确结果
(2)可读性:便于人类理解和相互交流,其次是机器的可执行性
(3)健壮性:输入非法数据时
(4)高效性:时间和空间
时间:执行效率高(不考虑硬件配置,只考虑算法执行次数)
空间:占用存储容量合理
衡量算法的主要指标:时间复杂度和空间复杂度
3.1 时间复杂度---大O阶方法
非递归算法
示例:
规则:
当,算法运行时间主要取决于
忽略所有低次数幂和最高次幂的系数
时间复杂度
递归算法
涉及递归方程求解
3.2 O(1):常数阶
算法执行时间是与问题规模n无关的常数
示例
高斯算法:(1+n)*n/2
int n=100,sum=0;
sum=(1+n)*n/2;
printf("%d",sum);
算法运行次数:f(n)=3;
时间复杂度为O(1);
3.3 O(n):线性阶
int i,sum=0;
for(i=1;i<=n;i++);
sum+=sum+i;
算法运行次数:
f(n)=n+1;
时间复杂度:f(n)=O(n);
3.4 对数阶
int count=1;
while(count<n)
count=count*2;
//1*2*2*2*2
算法复杂度:
3.5 O(n^2):平方阶
示例:打印的二维数组
嵌套循环打印
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
内层循环n次, 外层循环:为内层循环重复n遍
时间复杂度为
3.6 常见的时间复杂度
所耗费的时间(从小到大)
3.7最好、最坏、平均时间复杂度
最好:可能达到的最少次数min
最坏:可能达到的最多次数max
平均:
示例:O(n)
最好:1次
最坏:n次
平均:
4 算法空间复杂度
4.1算法占用的存储空间
(1)输入输出的数据所占空间
(2)算法本身所占空间
(3)额外需要的辅助空间
4.1.1非递归算法
示例:数组逆序
算法一:
int tmp;
for(i=0;i<n/2;i++)
{
tmp=a[i];
a[i]=a[n-i-1];
a[n-i-1]=tmp;
}
算法二:
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i];
算法一需要借助一个变量tmp,与问题规模无关,其空间复杂度为O(1),时间复杂度O(n)
算法2:需要借助一个大小为n的辅助数组b[n],其空间复杂度为O(n)。时间复杂度O(n)
4.1.2 递归算法
在递归算法中,每一次递推需要一个栈空间来保存调用记录。