【数据结构】算法复杂度

今天开始复习DS的内容

1. 数据结构前言

1.1 数据结构

数据结构( Data Structure)是计算机**存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。**没有一种单一的数据结构对所有的用途都管用,所以我们要学习各式各样的数据结构,如:线性表、树、图、哈希等

1.2 算法

算法 (Algorithm):j就是定义良好的计算过程,取一个或一组的值作为输入,并产生一个或一组值作为输出。简单来讲算法就是一系列的计算步骤,用来将输入数据转化为输出结果。

算法的5个特性:有穷性,确定性,可行性,输入、输出

数据结构和算法不分家!!!

2. 算法效率

如何衡量一个算法的好坏呢?

看算法的执行时间,占用空间大小:也就是时间复杂度 和空间复杂度

对于我们的执行时间 :我们得不出具体时间(影响执行时间的因素很多,cpu,编译器等),但是可以能够知道执行时间的量级(n n^2 1...)

2.1 复杂度的概念

一般是从时间和空间两个维度来衡量,即为时间复杂度和空间复杂度

时间复杂度衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行时所需要的额外空间。

由于现在计算机容量已经 极大地发展了,因此我们现在不用特别关注空间复杂度了

摩尔定律:

3. 时间复杂度

计算机科学中,**算法的时间复杂度是一个函数式T(N),定量描述了该算法的运行时间。**时间复杂度是衡量程序的时间效率,而不去计算程序的运行时间:

这个T(N)表示了程序的执行次数,N是输入条件,会影响算法的时间复杂度,影响时间复杂度的条件有:每条语句的执行时间*每条语句的执行次数 由于每条语句的执行时间不确定,即使有差别,也微乎其微,可以忽略不计,因此认为每条语句的执行时间是相同的,时间复杂度受执行次数影响

时间复杂度只能表示输入条件对时间的影响趋势

大O渐进表示法来表示算法的复杂度

3.2 示例

示例1
示例2.
示例3:
示例4:
总结:
示例5:

冒泡排序的时间复杂度

一共n个数据 外层循环 排序n趟 第一趟 要比较n-1次,第二趟比较n-2次·····第n-1次比较1次,1累加到n-1 就是一个等差数列(Sn=n(a1+a2)/2),结果也就是n^2+n / 2 ,这样时间复杂度为n方

示例6:
cpp 复制代码
void func5(int n)
{
    int cnt=1;
    while(cnt<n)
    {
        cnt*=2;
    }
}

时间复杂度为O(log2n) ,底数为2,为一个常数,底数对结果的影响不大,所以可以写成logn

示例7:
cpp 复制代码
//   阶乘
long long Fac(size_t N)
{
    if(0==N)
        return 1;
    
    return Fac(N-1)*N;
}

这是一个函数递归,时间复杂度和空间复杂度都为O(N)

4.空间复杂度

注意:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间就已经确定好了,因此空间复杂度主要通过函数在运行时显示申请的额外空间来确定

示例1:

比如上面的冒泡排序 的空间复杂度,函数栈帧在编译期间已经确定好了,只需要关注函数运行时额外申请的空间,

示例2:

前面阶乘递归的

每次进入循环都要重新创建一次函数栈帧,需要额外申请N-1个空间,所以空间复杂度也为O(N)

5.常见复杂度对比

相关推荐
Rabitebla10 分钟前
【C++】string 类:原理、踩坑与对象语义
linux·c语言·数据结构·c++·算法·github·学习方法
Old Uncle Tom8 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆8 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
JasmineX-111 小时前
数据结构(笔记)——双向链表
c语言·数据结构·笔记·链表
嘻嘻哈哈樱桃13 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
电科一班林耿超14 小时前
第 16 课:动态规划专题(二)—— 子序列与子数组问题:面试最高频的 DP 题型
数据结构·算法·动态规划
hnjzsyjyj14 小时前
洛谷 B3622:枚举子集(递归实现指数型枚举)← DFS
数据结构·dfs
qiqsevenqiqiqiqi16 小时前
MT2048三连 暴力→数学推导→O (n) 优化
数据结构·c++·算法
码之气三段.16 小时前
十五届山东ccpc省赛补题(update)
数据结构·c++·算法
保持清醒54017 小时前
二叉链表实现
数据结构