【数据结构】1.数据结构和算法效率(C语言)

【数据结构】—— 1.数据结构和算法效率

一、数据结构的概念

数据结构(Data Structure):计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合

算法(Algorithm):计算的方法

数据结构和数据库的区别是什么

数据结构在内存中管理数据

数据库在磁盘中管理数据

​ 在后面我们会学习实现各种数据结构,在我们使用数据结构时建议不要直接访问数据,而是使用数据结构提供的接口访问,这样做的目的是为了解耦(解除耦合性,让数据的操作更独立,不至于牵一发而动全身)

二、算法效率

算法效率:衡量一个算法好坏的标准

​ 衡量算法效率的标准有时间复杂度空间复杂度,现实生活中人们更注重时间复杂度

1. 时间复杂度

时间复杂度:一个函数,描述算法中的基本操作的执行次数

大O的渐进表示法:用于描述函数渐进行为的数学符号

  1. 计算出算法最坏执行次数
  2. 保留最高阶指数(去掉系数,如果是常数则为1)
  3. 使用 O ( 函数 ) O(函数) O(函数)的格式表示
  4. 函数的未知数通常为N,有时多个数据影响算法执行效率还会出现多个未知数

一些函数的时间复杂度:

  1. 函数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);
}
  1. 冒泡排序法时间复杂度为 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+...+(n2)+(n1)=n×(n1)/2
  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
  3. 斐波那契数递归实现时间复杂度为 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+...+2n1=2n1

斐波那契数递归实现图

2. 空间复杂度

​ 空间复杂度也是一个数学表达式,是运行时临时占用存储空间大小的量度

  1. 函数运行时所需要的栈空间,在编译期就确定好了,因此空间复杂度是以运行时显示申请的额外空间来确定
  2. 空间大小是不叠加的,时间是叠加的

一些函数的空间复杂度:

  1. 冒泡排序法空间复杂度为 O ( 1 ) O(1) O(1),没有根据数组的大小创建额外空间
  2. 阶乘求递归的空间复杂度为 O ( n ) O(n) O(n),每次递归创建函数栈帧一次,一共递归n次
  3. 递归求斐波那契数的空间复杂度为 O ( n ) O(n) O(n),树的深度为n,深度相同的节点使用的都是同样一层的函数栈帧

3. 复杂度对比

阶数复杂度栗子n为1000时的运算次数
常数阶 O ( 1 ) O(1) O(1) 5645879 5645879 56458791
线性阶 O ( n ) O(n) O(n) 3 n + 2 3n+2 3n+21000
平方阶 O ( n 2 ) O(n^2) O(n2) n 2 + 2 n + 1 n^2+2n+1 n2+2n+11000000
对数阶 O ( l o g 2 n ) O(log_2n) O(log2n) 3 l o g 2 n + 4 3log_2n+4 3log2n+410
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+2310000
立方阶 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+31000000000
指数阶 O ( 2 n ) O(2^n) O(2n) 2 n 2^n 2n大到离谱
查看源图像
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值