【数据结构】—— 1.数据结构和算法效率
一、数据结构的概念
数据结构(Data Structure):计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合
算法(Algorithm):计算的方法
数据结构和数据库的区别是什么:
数据结构在内存中管理数据
数据库在磁盘中管理数据
在后面我们会学习实现各种数据结构,在我们使用数据结构时建议不要直接访问数据,而是使用数据结构提供的接口访问,这样做的目的是为了解耦(解除耦合性,让数据的操作更独立,不至于牵一发而动全身)
二、算法效率
算法效率:衡量一个算法好坏的标准
衡量算法效率的标准有时间复杂度和空间复杂度,现实生活中人们更注重时间复杂度
1. 时间复杂度
时间复杂度:一个函数,描述算法中的基本操作的执行次数
大O的渐进表示法:用于描述函数渐进行为的数学符号
- 计算出算法最坏执行次数
- 保留最高阶指数(去掉系数,如果是常数则为1)
- 使用 O ( 函数 ) O(函数) O(函数)的格式表示
- 函数的未知数通常为N,有时多个数据影响算法执行效率还会出现多个未知数
一些函数的时间复杂度:
- 函数
Fun1
执行 n 2 + n + 10 n^2+n+10 n2+n+10次计算,时间复杂度为: O ( n 2 ) O(n^2) O(n2)
void Fun1(int n)
{
int count = 0;
for (int i=0; i<n; ++i) //执行n^2次
{
for (int j=0; j<n; ++j)
{
++count;
}
}
for (int k=0; k<2*n; ++k) //执行n次
{
++count;
}
int m = 10;
while (m--) //执行10次
{
++count;
}
printf("%d" count);
}
- 冒泡排序法时间复杂度为 O ( n 2 ) O(n^2) O(n2),执行 1 + 2 + . . . + ( n − 2 ) + ( n − 1 ) = n × ( n − 1 ) / 2 1+2+...+(n-2)+(n-1)=n\times(n-1)/2 1+2+...+(n−2)+(n−1)=n×(n−1)/2次
- 二分查找法时间复杂度为 O ( l o g 2 N ) O(log_2{N}) O(log2N),每次查找区间折半, N / 2 / 2 / 2 / 2... = 1 N/2/2/2/2...=1 N/2/2/2/2...=1,查找x次,则 2 x = N 2^x=N 2x=N,则 x = l o g 2 N x=log_2{N} x=log2N
- 斐波那契数递归实现时间复杂度为 O ( 2 n ) O(2^n) O(2n),执行约为 2 0 + 2 1 + . . . + 2 n − 1 = 2 n − 1 2^0+2^1+...+2^{n-1}=2^n-1 20+21+...+2n−1=2n−1
2. 空间复杂度
空间复杂度也是一个数学表达式,是运行时临时占用存储空间大小的量度
- 函数运行时所需要的栈空间,在编译期就确定好了,因此空间复杂度是以运行时显示申请的额外空间来确定
- 空间大小是不叠加的,时间是叠加的
一些函数的空间复杂度:
- 冒泡排序法空间复杂度为 O ( 1 ) O(1) O(1),没有根据数组的大小创建额外空间
- 阶乘求递归的空间复杂度为 O ( n ) O(n) O(n),每次递归创建函数栈帧一次,一共递归n次
- 递归求斐波那契数的空间复杂度为 O ( n ) O(n) O(n),树的深度为n,深度相同的节点使用的都是同样一层的函数栈帧
3. 复杂度对比
阶数 | 复杂度 | 栗子 | n为1000时的运算次数 |
---|---|---|---|
常数阶 | O ( 1 ) O(1) O(1) | 5645879 5645879 5645879 | 1 |
线性阶 | O ( n ) O(n) O(n) | 3 n + 2 3n+2 3n+2 | 1000 |
平方阶 | O ( n 2 ) O(n^2) O(n2) | n 2 + 2 n + 1 n^2+2n+1 n2+2n+1 | 1000000 |
对数阶 | O ( l o g 2 n ) O(log_2n) O(log2n) | 3 l o g 2 n + 4 3log_2n+4 3log2n+4 | 10 |
n l o g n 阶 nlogn阶 nlogn阶 | O ( n l o g 2 n ) O(nlog_2n) O(nlog2n) | 2 n + n l o g 2 n + 23 2n+nlog_2n+23 2n+nlog2n+23 | 10000 |
立方阶 | O ( n 3 ) O(n^3) O(n3) | n 3 + 2 n 2 + 4 n + 3 n^3+2n^2+4n+3 n3+2n2+4n+3 | 1000000000 |
指数阶 | O ( 2 n ) O(2^n) O(2n) | 2 n 2^n 2n | 大到离谱 |
![查看源图像](https://i1.wp.com/i.stack.imgur.com/WcBRI.png)