【数据结构】算法复杂度

今天开始复习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.常见复杂度对比

相关推荐
青山师17 小时前
二叉树与BST深度解析:遍历算法与平衡策略
数据结构·算法·面试·二叉树·算法与数据结构·java面试·数据结构与算法分析
无限进步_20 小时前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
sa1002721 小时前
京东评论 API 实战:JSON 数据结构、字段含义与解析技巧
前端·数据结构·json
这料鬼有毒21 小时前
二刷hot100-17.电话号码的字母组合
数据结构
执明wa21 小时前
从 T 到协变逆变
java·开发语言·数据结构
夏日听雨眠1 天前
排序(选择排序 ,冒泡排序,归并排序)
数据结构·算法·排序算法
tyung1 天前
Go 手写二叉堆优先队列:避开 container/heap 的性能陷阱
数据结构·后端·go
papership1 天前
【入门级-数据结构-1、线性结构:栈和队列】
数据结构
fu的博客1 天前
【数据结构14】并查集:QuickUnion、QuickFind、路径压缩
数据结构