Hello算法2:复杂度分析

Hello算法2:复杂度分析

本文是基于k神的Hello 算法的读书笔记,请支持实体书。
https://www.hello-algo.com/chapter_paperbook/

算法效率

算法效率评估

设计算法时,我们追求以下两个目标:

  • 找出解法
  • 找出最优解

最优解通常包含两个指标:

  • 时间:算法运行的时间
  • 空间:算法占用的内存

评估的方法分为两种:

实际测试和理论评估

实际测试

找一台计算机实际运行代码,比较两个算法的效率。

这样虽然很直观,但是有以下缺陷

  • 难以排除测试环境的干扰:两台计算机配置不同,在上面运行某算法可能会得到不同的结果
  • 完整的测试很耗费资源:某些算法对于少量数据和巨量数据表现差别很大,这就需要设计测试时尽量覆盖所有情况

理论估算

也就是复杂度分析,它描述随着输入数据大小的增加,算法执行的时间和空间的增长趋势。

它客服了实际测试的缺点,体现如下:

  • 无需测试环境,结果适用于各平台
  • 可以体现不同数据量下的效率,特别是针对大数据

迭代和递归

在执行算法时,重复执行某个任务很常见。

迭代

常见的迭代有for循环和while循环

for循环

比如计算1+2+n的值,for循环的时间复杂度取决于n的值,它是线性相关的

while循环

初始化条件和条件更新的步骤独立于循环过程,所以while循环更自由

循环的嵌套

循环中可以嵌套循环,此时复杂度就变成了n的平方

递归

递归是指通过调用函数自身来解决问题,主要包含两个阶段

  1. 递:不断深入的调用自身,通常是不断传入更小的参数,直到达到终止条件
  2. 归:触发终止条件后,程序开始逐层返回
def recur(n: int) -> int:"""递归"""# 终止条件if n == 1:return 1# 递:递归调用res = recur(n - 1)# 归:返回结果return n + res

调用栈

每次调用自身,计算机都会开辟新的内存区域,存储局部变量、调用地址和其他变量,因此

  • 递归通常比迭代更耗费内存空间
  • 递归的时间效率通常更低

递归深度过多,可能会溢出

尾递归

在返回前的最后一步才进行递归调用中调用自身,这种方式某些语言可以被编译器或解释器优化,使其在空间效率上与迭代相当。但比如python就不支持。

def tail_recur(n, res):"""尾递归"""# 终止条件if n == 0:return res# 尾递归调用return tail_recur(n - 1, res + n)

递归树

以“斐波那契数列”为例,将会产生如下的递归树

给定一个斐波那契数列0,1,1,2,3,5,8,13,…,求该数列的第n个数字

def fib(n: int) -> int:"""斐波那契数列:递归"""# 终止条件 f(1) = 0, f(2) = 1if n == 1 or n == 2:return n - 1# 递归调用 f(n) = f(n-1) + f(n-2)res = fib(n - 1) + fib(n - 2)# 返回结果 f(n)return res

在这里插入图片描述

时间增长趋势

如下三个算法:

# 算法 A 的时间复杂度:常数阶
def algorithm_A(n: int):print(0)
# 算法 B 的时间复杂度:线性阶
def algorithm_B(n: int):for _ in range(n):print(0)
# 算法 C 的时间复杂度:常数阶
def algorithm_C(n: int):for _ in range(1000000):print(0)

时间增长趋势如下:

在这里插入图片描述

可以看出时间复杂度有如下特点:

  • 可以有效评估算法效率
  • 时间复杂度的推算更简便
  • 存在一定局限性

计算方式

第一步:统计操作数量,有以下技巧

  1. 忽略常数项
  2. 省略所有系数
  3. 循环嵌套时使用乘法
def algorithm(n: int):a = 1      # +0(技巧 1)a = a + n  # +0(技巧 1)# +n(技巧 2)for i in range(5 * n + 1):print(0)# +n*n(技巧 3)for i in range(2 * n):for j in range(n + 1):print(0)

应用上述方法后,可得操作数量是

在这里插入图片描述

第二步:逐渐判断上界

时间复杂度由 T(n) 中最高阶的项来决定。这是因为在 n 趋于无穷大时,最高阶的项将发挥主导作用,其他项的影响都可以忽略。

常见有如下复杂度:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 8中的Stream API及其用途详解

Java 8中的Stream API是Java函数式编程的一个核心组成部分,它允许你以声明性方式处理数据集合(如列表、集合等)。通过使用Stream API,你可以更方便地执行复杂的操作,如过滤、映射、排序和聚合,而无需编写大…

部署实施案例分析题

习题一 随着医院信息化程度的不断提高,各业务系统的全面上线,对IT基础架构的安全性、稳定性以及业务系统的连续性提出了较高的要求,运维工作也相同面临了前所未有的挑战。 为加强该医院的运维工作的规范化,并提高日常运维的工作…

实验7 内置对象response

编写代码&#xff0c;掌握request、response的用法。【参考课本4.6.2】 三、源代码以及执行结果截图&#xff1a; input.jsp <% page language"java" contentType"text/html; charsetutf-8" pageEncoding"utf-8"%> <!DOCTYPE html>…

LeetCode刷题笔记之动态规划(三)

一、子序列/子数组问题 子序列&#xff1a;按原数组的顺序排列&#xff0c;不一定是原数组中的相邻元素组成的。即子序列可以是不连续的。 子数组&#xff1a;原数组中连续的几个元素组成的数组。 1. 300【最长递增子序列】 题目&#xff1a; 给你一个整数数组 nums &#xff…

Redis面试题-缓存穿透,缓存击穿,缓存雪崩

1、穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 解释&#xff1a;请求的数据既不在Redis中也不在数据库中&#xff0c;这时我们创建一个黑名单来存储该数据&#xff0c;下次再有类似的请求进来…

Q-Day提前?IBM警告:「量子+AI」将触发巨大风险!

Q-Day&#xff0c;即量子计算机强大到足以破解当前加密方案的时刻&#xff0c;原本被视为一个从近期到长期可能面临的挑战&#xff0c;而非刻不容缓的现实问题。然而&#xff0c;最新的研究发现似乎加速了这一天的到来。 IBM的研究团队在一篇论文中提出&#xff0c;混合量子经典…

测试学习1

学习目标 熟悉测试流程和规范&#xff0c;熟练掌握软件测试方法至少熟悉功能测试.性能测试.安全测试中的一种;熟练使用常用的测试工具&#xff0c;熟悉缺陷管理跟踪软件(禅道.Jira.QC等)&#xff0c;熟悉持续集成工具Jenkin;熟悉Linux操作系统&#xff0c;熟悉TCP/HTTPS等网络…

Redis入门到实战-第二十二弹

Redis实战热身Sentinel篇 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理和流处理引擎的内存…

利用出海、Socks5代理与代理IP

在当今数字化时代&#xff0c;跨界电商已成为企业扩展业务、拓展市场的重要策略。然而&#xff0c;这种扩展并非没有风险。网络安全问题一直是跨界电商必须面对的挑战之一。为了确保数据安全、保护用户隐私&#xff0c;以及有效应对地区限制&#xff0c;出海、Socks5代理与代理…

谷歌DeepMind推出SIMA智能体,可以跟人一起玩游戏

谷歌 DeepMind 推出了 SIMA&#xff0c;这是一种通过训练学习游戏技能的人工智能代理&#xff0c;因此它玩起来更像人类&#xff0c;而不是一个只做自己事情的强大人工智能。 从早期与 Atari 游戏合作&#xff0c;到以人类大师级别玩《星际争霸 II》的 AlphaStar 系统&#xf…

【STM32CubeMX(2)】点亮第一个LED灯

通过本节可以学习到&#xff1a; 如何通过STM32CubeMX建立一个单片机工程如果是仿真下载需要注意些什么怎么通过HAL库使用外设功能 软件环境&#xff1a; STM32CubeMX version6.10.0 Keil_v5&#xff08;MDK-ARM&#xff09; version 5.32 硬件环境&#xff1a; STM32F103…

vue 列表渲染

v-for​ 我们可以使用 v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff1a; const items ref([{ message: Foo }, { message: Bar }]) <l…

Mysql数据库:主从复制与读写分离

目录 前言 一、Mysql主从复制概述 1、Mysql主从复制概念 2、Mysql主从复制功能和使用场景 2.1 功能&#xff08;为何使用主从复制&#xff09; 2.2 适用场景&#xff08;何时使用主从复制&#xff09; 3、Mysql复制的类型 3.1 基于SQL语句的复制&#xff08;Statement默…

态势感知平台简单介绍

什么是态势感知平台&#xff1f; 安全态势感知平台是一种综合型网络安全解决方案&#xff0c;其核心目标在于帮助企业提升对安全态势的感知能力&#xff0c;从而更有效地应对不断变化的网络威胁环境。 该平台具备多种核心功能。首先&#xff0c;它能够实现数据收集与整合&…

数字化对制造业生产效率的影响与优化策略

导 读 ( 文/ 1419 ) 在当今竞争激烈的市场环境下&#xff0c;制造业企业面临着日益增长的压力&#xff0c;需要不断提高生产效率以保持竞争力。数字化技术作为一种重要的生产力工具&#xff0c;已经在制造业中得到广泛应用。本文将探讨数字化对制造业生产效率的影响&#xff0c…

SpringBoot与Prometheus监控整合

参考&#xff1a; springboot实战之prometheus监控整合-腾讯云开发者社区-腾讯云 https://www.cnblogs.com/skevin/p/15874139.html https://www.jianshu.com/p/e5dc2b45c7a4

python可视化:tqdm进度条控制台输出模块

前言 在处理大量数据或执行耗时操作时&#xff0c;了解代码执行的进度是至关重要的。在Python中&#xff0c;通过使用进度条可以有效地实现对代码执行进度的可视化展示。 tqdm 是一个快速、可扩展的Python进度条库&#xff0c;能够实时显示代码执行的进度。并且它提供了简洁的A…

用Python机器学习模型预测世界杯结果靠谱吗?

看到kaggle、medium上有不少人用球队的历史数据来进行建模预测&#xff0c;比如用到泊松分布、决策树、逻辑回归等算法&#xff0c;很大程度上能反映强者恒强的现象&#xff0c;比如巴西、英格兰等大概率能进8强&#xff0c;就像高考模拟考试成绩越好&#xff0c;大概率高考也会…

数据仓库的建设步骤

1.需求&#xff0c;要和业务部门深入讨论&#xff0c;了解他们的现状&#xff0c;诉求&#xff0c;以及期望&#xff0c;包括我要分析什么内容&#xff0c;需要到什么样的颗粒度&#xff0c;数据从哪里来的&#xff0c;是手工还是系统&#xff0c;数据质量怎么样&#xff0c;期…

Spring高级面试题-2024

Spring 框架中都用到了哪些设计模式&#xff1f; 1. 简单工厂&#xff1a; ○ BeanFactory&#xff1a;Spring的BeanFactory充当工厂&#xff0c;负责根据配置信息创建Bean实例。它是一种工厂模式的应用&#xff0c;根据指定的类名或ID创建Bean对象。2. 工厂方法&#xff…