当前位置: 首页 > article >正文

算法复杂度

1、数据结构的概念

1.1何为数据结构?

将大量杂乱无章的数据通过某种结构进行管理。(增加、删除、查找、修改)数据。

1.2何为算法?

简单来说就是通过一系列的计算步骤,将输入的数据转化成预期中的结果。好的算法能够高效的管理数据。因此数据结构与算法不分家。

1.3如何学好数据结构与算法?

在这里插入图片描述
在这里插入图片描述

2、算法效率

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

一般是从时间和空间这两个维度来衡量。即时间复杂度与空间复杂度。一个算法运行时所需的时间越短,额外申请的空间越小,那么该算法就越好。
在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注算法的空间复杂度,更关注时间复杂度。(但在笔试与面试中两者都有所考察)

3、时间复杂度

3.1时间复杂度的定义

在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它是用来衡量程序运行的快慢。那为什么不直接去计算程序的运行时间呢?

  1. 因为程序运行时间与编译环境(Debug版本下会加载调试信息,运行的较慢;Release版本下不会加载调试信息,运行的较快。)和运⾏机器的配置都有关系。比如同⼀个算法程序,用一个旧编译器进行编译和新编译器编译,在同样机器下运⾏时间不同。
  2. 同⼀个算法程序,⽤⼀个低配置机器和⾼配置机器,运⾏时间也不同。
  3. 并且程序的运行时间无法在程序写好之前确定
#include<stdio.h>
#include<time.h>
int main()
{
	int count = 0;
	int begin = clock();//clock函数是用来求程序运行到这行代码时花费的时间。(单位是毫秒)需要包含的头文件是<time.h>
	for (int i = 0; i < 1000000000; i++)
	{
		count++;
	}
	int end = clock();
	printf("该算法的运行时间为%d\n", end - begin);
	return 0;
}

在这里插入图片描述

3.2探讨时间复杂度的函数式T(N)

在这里插入图片描述

3.3案例

在这里插入图片描述
实际中,我们计算的也不是程序的精确执行次数,计算这个比较复杂,(不同的一句代码经过编译后,生成的二进制指令条数也不一样),也没有必要计算。对于T(N)而言,当N不断变大时,低阶项对高阶项的影响越来越小,因此我们只需要计算程序的大致执行次数。

3.4大O的渐进表示方法

大O符号(Big O notation):是用于描述函数渐进⾏为的数学符号。
在这里插入图片描述

a.示例一

在这里插入图片描述

b.示例二

在这里插入图片描述

c.示例三

在这里插入图片描述

d.示例四

在这里插入图片描述

在这里插入图片描述

e.示例五

在这里插入图片描述

f.示例六

在这里插入图片描述

补充

在这里插入图片描述

g.示例七

在这里插入图片描述

4、空间复杂度

4.1空间复杂度的介绍

空间复杂度也是一个数学表达式,它是用来计算程序运行时额外申请的空间个数。空间复杂度不是计算程序占用了多少字节的空间,因为常规情况下,每个对象大小差异不会很⼤。

空间复杂度计算规则基本跟时间复杂度类似,也使⽤大O渐进表示法。

函数运行时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要由函数在运行时额外申请的空间个数来确定。

4.2空间复杂度的计算示例

a.示例1

在这里插入图片描述

b.示例2

在这里插入图片描述

c.示例3

在这里插入图片描述

4.3常见复杂度的对比

在这里插入图片描述

六、复杂度算法题

在这里插入图片描述

第一种算法

在这里插入图片描述

第二种算法

在这里插入图片描述
相较于第一种算法而言,这种算法相当于用空间换时间。


http://www.kler.cn/a/388516.html

相关文章:

  • 读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录
  • Kubernetes在容器编排中的应用
  • 操作系统离散存储练习题
  • 深入剖析【C++继承】:单一继承与多重继承的策略与实践,解锁代码复用和多态的编程精髓,迈向高级C++编程之旅
  • 软考:去中心化的部署有什么特点
  • 万字长文解读深度学习——卷积神经网络CNN
  • 【SpringMVC】记录一次Bug——mvc:resources设置静态资源不过滤导致WEB-INF下的资源无法访问
  • W3C HTML 活动
  • springboot使用aop防御用户重复请求
  • Centos Linux 7 搭建邮件服务器(postfix + dovecot)
  • cv2.threshold利用OSTU方法分割图像的前景和背景
  • 从文本到图像:AIGC 如何改变内容生产的未来
  • 羲和数据集收集器1.0
  • Leetcode 3347. Maximum Frequency of an Element After Performing Operations II
  • 【k8s】ClusterIP能http访问,但是不能ping 的原因
  • 「C/C++」C/C++STL篇 之 数组赋值给std::vector多种方法
  • Ubuntu 的 ROS 2 操作系统安装与测试
  • 基于Diodes全新的140瓦PD3.1超高功率密度GaN充电器解决方案
  • 海量日志收集ELK实战(docker部署ELK)从日志中挖取宝贵数据
  • 云防护单节点2T抗攻击能力意味着什么?
  • 《深入浅出HTTPS​​​​​​​》读书笔记(7):安全的密码学Hash算法
  • 全局注册和局部注册
  • JSON-RPC-CXX深度解析:C++中的远程调用利器
  • 华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD
  • [安洵杯 2019]easy_web 详细题解
  • LeetCode【0004】寻找两个正序数组的中位数