1.为什么要学习数据结构
为了提高程序的运行效率
2.什么是数据?
数据是指对事物的进行的记录并可以鉴别的符号,可以是文字,图片,字母,特殊字符,视频,音频…,对我们有用的信息都可以称为数据。
3.什么是结构?
结构体是指元素(数据)的相互关联和相互作用的关系,比如学生,图书,交通干线等等
4.根据数据元素之间的关系,分成4个基本结构
-
集合:结构中的数据是在同属空间内,没有其它关系,比如刚入学的学生
-
线性结构:数据为一一对应的关系,比如已分发学号的学生,图书馆的图书
-
树状结构(层次关系):数据为一对多的关系,家族的族谱,公司的架构
-
图状结构(网状结构):数据为多对多的关系,城市与城市之间的交通干线
5.什么是数据结构
数据结构体 = 数据+数据与数据之间的关系
6.数据结构的组成部分
- 逻辑结构
- 数据之间的内在关系,通常有集合,线性表(一一对应的关系),树(一对多关系),图(多对多的关系)
- 存储结构
- 顺序存储(数组),链式存储(链表),不同的存储方式对数据的处理效率有很大的影响
7.什么是算法
算法是为了实现计算的目的而制定一系列的计算步骤
8.数据结构与算法的关系
数据结构其实就是研究如何有效的组织数据,并提高数据的处理效率,通过研究各种数据之间的内部关系,使用某种特定的方式存储,在此基础上对数据实施各种操作,这种方式称为算法。
9.算法的分析
算法分析是指在正常程序工作下,对其优略分析,一个好的算法指:
1.算法对应程序的消耗时间少
2.算法对应程序的消耗空间少
3.算法结构性好,易读,易移植,易调试(少bug)
10.时间复杂度(应对笔试)
描述程序运行的时间复杂度BigO即大O表示法,计算的是程序运行的次数而不是程序运行的时间,时间复杂度 = 程序运行的次数
公式: T(n) = O(f(n))
T(n) : 表示算法的渐进时间复杂度
f(n) : 程序运行的次数
O : 表示正比关系
例子1:
for(int i = 1; i <= n; i++)
{
x++;
}
o(1+3n),如果n是无限大1和3被忽略
时间复杂度是 O(n)
例子2:
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
x++;
}
}
时间复杂度 O(N*N) = n^2
例子3:
for(int i = 1; i <= n; i++)
{
x++;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
x++;
}
}
O(N+n^2)--->n无限大,N是常量,所以时间复杂度为O(n^2)
常用的时间复杂度
1.常数阶O(1)
int a = 1;
int b = a;
2.对数阶O(logN)==》2^k = N ==> K = logN,k为程序运行的次数
int i = 1;
while(i < n)
i = 2*i;
3.线性阶O(N)
for(int i = 1; i <= n; i++)
x++
4.线性对数阶O(NlogN)
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <=n; j+=i)
{
x++;
}
}
5.平方阶(n^2)
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
x++;
}
总结:
程序 = 数据结构体 + 算法
11计算以下两个片段的时间复杂度
//片段1
for(int i = 1; i <= n; i=i*2)
{
printf("%d\t",i);
}
2^i = n --->i = logn
// 片段2
int i = 0;
int s = 0;
while(s < n)
{
++i;
s+=i;
}
s = 1+2+3+...+k ==>k(k+1)/2===>k(K+1)=2n===>2为常量==>k(k+1) = n, k = 根号n