第一讲 基本概念
什么是数据结构
数据结构和算法
例子1.书架摆书
图书的摆放要使得2个相关操作方便实现:
1.新书怎么插入(随便放,按拼音放,按类别放+拼音排序)
2.怎么找到某本指定的书(累死,二分查找)
总结:当问一个数据怎么组织的时候,其实跟这个数据的规模有关系
不一样规模的问题,处理起来的难度不一样,解决方法的效率,跟数据的组织方式有。关
例子2.写一个函数,输入正整数N,顺序打印1-N的全部正整数。
第一种方法for循环
第二种递归
总结:虽然递归简洁,但是递归对空间的占用很恐怖,当N为100000时,递归写法把能用的空间都占了,还不够,然后就爆掉了,导致非正常的终止。解决问题方法的效率也跟空间的利用效率有关。
例子3.写一计算给定多项式在给定点x的值
第一种方法直接翻译多项式(简单粗暴直接)
第二种利用规律简化多项式再翻译
如何测试程序的运行时间
clock()函数:捕捉程序从开始运行到clock()被调用时所花费的时间,时间单位为colock tick,即时间打点
常数CLK_TCK:机器时钟每秒所走的时钟打点数
#include<stdio.h>
#include<time.h>//调用clock函数需要的头文件
clock_t start,stop;//clock_t是clock函数返回的变量类型
double duration;
int mian()
{
start=clock();//开始计时
myfuncation();//把被测函数加在这里
stop=clock();//停止计时
duration=((douboe)(stop-star))/CLK_TCK;
//得出运行时间
}
当运行时间太短小于1单位时,我们采取多次重复,最后除以多次,得出单词的运行时间
总结:第一种方法的运行时间比第二种慢了一个数量级解决问题方法的效率,跟算法的巧妙程度有关。
到底什么是数据结构?
- 数据对象在计算机中的组织方式
- 逻辑结构(一对一:线性结构 一对多:树 多对多:图)
- 物理存储结构(链表,数组等)
- 数据对象必定与一系列加在其上的操作相关联
- 完成这些操作所用的方法是算法
- 抽象 数据类型
- 数据类型
- 数据对象集
- 数据集合相关联的操作集
- 抽象:描述数据类型的方法不依赖具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程均无关
只描述数据对象集和相关操作集是什么并不涉及如何做到的问题
总结:抽象就是,比较清晰明了的知道你这个数据类型是干什么的,有什么用处,不用纠结是用什么语言实现的,也不用纠结数据类型,能让你更加清晰的了解这个数据结构,比如函数max(),你使用它的时候你知道它是找出两个数的最大值,你没有纠结它的数据类型,也没有纠结用哪种语言实现,最简单的说法也是最重要的理由:接口和实现分离!复用性更强!
什么是算法
- 算法
- 一个有限指令集
- 接受一些输入(有些情况不需要输入)
- 产生输出
- 一定在有限步骤之后终止
- 每一条指令必须
- 有充分明确的目标。不可以有歧义
- 计算机能处理的范围之内
- 描述应不依赖任何一种计算机语言以及具体的实现手段
什么是好算法
- 空间复杂度S(n)
- 时间复杂度T(n)
例:递归PRINT N
当n足够大时,空间会被沾满
for循环的空间占用始终是一个常量
- 在分析一般算法的效率时,我们经常关注两种复杂度
- 最坏情况复杂度
- 平均复杂度
复杂度的渐进表示法
不对算法做非常精细的分析
粗略估计增长趋势
复杂度分析小窍门
- 复杂度取最大
- for循环时间的复杂度等于循环次数*循环体代码的复杂度
- if else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中最大
应用示例:最大子列和问题
在线处理 ,灵活巧妙,简化问题+找规律
#include<bits/stdc++.h>//最大数据10的5次方时21ms
using namespace std;
int num[100000];
int maxn=0;
int main()
{
int n=0,sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
maxn=maxn+num[i];
if(maxn<0)
{
maxn=0;
}
if(maxn>sum)
{
sum=maxn;
}
//printf("%d",sum);
}
if(sum<0)
{
printf("0");
} else
printf("%d",sum);
return 0;
}
#include<bits/stdc++.h>//最大数据10的5次方时3700ms 爆力法
using namespace std;
int num[100000];
int maxn=0;
int main()
{
int n=0,sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
for(int i=0;i<n;i++)
{
maxn=0;
for(int j=i;j<n;j++)
{
maxn=maxn+num[j];
if(maxn>sum)
{
sum=maxn;
}
}
}
if(sum<0)
{
printf("0");
} else
printf("%d",sum);
return 0;
}
#include<bits/stdc++.h>//最大数据10的5次方时3700ms .分而治之
略