【图解数据结构】深入剖析时间复杂度与空间复杂度的奥秘

news2024/10/7 4:36:04

在这里插入图片描述
🌈个人主页:聆风吟
🔥系列专栏:图解数据结构、算法模板
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 一. ⛳️算法的定义
  • 二. ⛳️算法的特性
    • 2.1 🔔输入输出
    • 2.2 🔔输入输出
    • 2.3 🔔有穷性
    • 2.4 🔔确定性
    • 2.5 🔔可行性
  • 三. ⛳️算法设计要求
    • 3.1 🔔正确性
    • 3.2 🔔可读性
    • 3.2 🔔健壮性
    • 3.3 🔔时间效率高和存储量低
  • 四. ⛳️算法效率的度量方法
    • 4.1 🔔事后统计方法
    • 4.2 🔔事前分析估算方法
  • 五. ⛳️算法的复杂度
    • 5.1 🔔算法的复杂度的简单介绍
    • 5.2 🔔算法复杂度在面试中考察
  • 六. ⛳️算法的时间复杂度(重点)
    • 6.1 🔔算法的时间复杂度定义
    • 6.2 🔔大O的渐进表示法
    • 6.3 🔔常见的时间复杂度
    • 6.4 🔔最好情况、最坏情况与平均情况
  • 七. ⛳️算法的空间复杂度
  • 📝全文总结

一. ⛳️算法的定义

    算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作



二. ⛳️算法的特性

    算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。

2.1 🔔输入输出

    算法具有零个或多个输入,尽管对于大多数算法来说,输入参数都是有必要的,但对于个别情况,如打印"hello world!"这样的代码,不需要任何输入参数,因此算法的输入可以是零个。

2.2 🔔输入输出

    算法至少有一个或多个输出,算法是一定需要输出的,不需要输出,你用这个算法干嘛呢?输出的形式可以打印输出,也可以是返回一个或多个值等。

2.3 🔔有穷性

    有穷性:是指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤都在可接受的时间内完成

2.4 🔔确定性

    确定性:算法的每一步骤都具有确定的含义,不会出现二义性。算法在一定条件下,只有一条执行的路径,相同的输入只能有唯一的输出结果。算法的每一步骤都被精确定义而无歧义。

2.5 🔔可行性

    可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成



三. ⛳️算法设计要求

    算法不是唯一的。也就是说,解决同一个问题,可以有多种解决问题的算法。通常为了设计一个 “好” 的算法应考虑达到一下目标:
在这里插入图片描述

3.1 🔔正确性

    正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性,能够得到问题的正确答案。但是算法的 “ 正确 ” 一词在用法上通常有很大差别,大体分为一下四个层次:

  1. 算法程序没有语法错误;
  2. 算法程序对于合法的输入数据能够产生满足要求的输入结果;
  3. 算法程序对于非法的输入数据能够得出满足规格说明的结果;
  4. 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

对于这四层含义,层次 1的要求最低,但仅仅没有语法错误实在谈不上是好算法。这就是如同仅仅解决温饱,不算是生活幸福一样。而层次 4是最难实现的,我们几乎不可能逐一验证所有的输入都得到正确的结果。所以一般情况下,我们通常把层次 3作为衡量一个算法算法是否合格的标准。

3.2 🔔可读性

    可读性:算法的另一个目的是为了便于阅读,来理解和交流。可读性高有助于人们理解算法,晦涩难懂的算法往往隐含错误,不易被发现,并且难以调试和修改。

3.2 🔔健壮性

    健壮性:当输入数据不合法时,算法也能做出相关处理而不是产生异常或莫名其妙的结果

3.3 🔔时间效率高和存储量低

    时间效率指的是算法的执行时间。对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率高,执行时间长的效率低。存储量需求指的是算法在执行过程中需要的最大空间,主要指算法程序运行时所占用的内存或外部硬盘存储空间。因此,设计算法时应尽量满足时间效率高和存储量低的需求。



四. ⛳️算法效率的度量方法

    刚才我们提到了设计算法要提高效率。这里的效率大都指算法的执行时间。算法的执行时间需要依据该算法编制的程序在计算机上运行时所消耗的时间来度量的。而度量一个程序的执行时间通常有有两种方法 —— 事后统计方法和事前分析估算方法。

4.1 🔔事后统计方法

    事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同的算法编制的程序的运行时间进行比较,从而确定算法效率的高低。但是这种方法明显是有很大的缺陷:

  • 必须要依据算法事先编制好程序,这通常要需要花费大量时间和精力。如果编制出来发现它根本就是一团很糟糕的算法,那不就是竹篮打水一场空了吗?
  • 时间的比较依赖计算机硬件和软件等环境因素的影响,有时会掩盖算法本身的优劣。
  • 算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。

基于事后统计方法有这样那样的缺陷,我们一般不予以采纳,而是采用另一种事前分析估算方法。

4.2 🔔事前分析估算方法

    事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。经过分析我们可以发现,一个用高级语言程序语言编写的程序在计算机上运行时所消耗的时间取决于一下因素:
在这里插入图片描述解析
    第(1)条是一个好算法的根本,第(2)条要有软件来支持,第(4)条要看硬件性能。因此,抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入量的多少。



五. ⛳️算法的复杂度

5.1 🔔算法的复杂度的简单介绍

    算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度

    时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。


5.2 🔔算法复杂度在面试中考察

在这里插入图片描述

由此可以看出算法复杂度的重要性,所以说同学们下面的内容一定要好好学哦。言归正传接下来让我们开始具体讲解时间复杂度和空间复杂度。



六. ⛳️算法的时间复杂度(重点)

6.1 🔔算法的时间复杂度定义

    在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度
即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

  • 示例:请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < N; ++j)
		{
			++count;//执行 N*N 次
		}
	}

	for (int k = 0; k < 2 * N; ++k)
	{
		++count;//执行 2*N 次
	}

	int M = 10;
	while (M--)
	{
		++count;//执行 10次
	}

	printf("%d\n", count);
}

在这里插入图片描述

     实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么我们就可以使用大O的渐进表示法。看到这估计有同学该问了大O的渐进表示法是什么,它又是如何推导的呢?且听我慢慢道来,让我们继续接着向下面学习。


6.2 🔔大O的渐进表示法

大O符号(big O notation):是用于于描述函数渐进行为的数学符号

推导大O阶方法:

(1)用常数1取代运行时间中的所有加法常数。
(2) 在修改后的运行次数函数中,只保留最高阶项。
(3)如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。得到的结果就是大O阶。

结合上面示例: 使用大O的渐进表示法以后,Func1的时间复杂度为:
在这里插入图片描述

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数


6.3 🔔常见的时间复杂度

  常见的时间复杂度如下表所示:
在这里插入图片描述注:对数在文本中不好表示,以 2 为底的对数通常简写为(logn)

  常用的时间复杂度所耗费的时间从小到大依次是:

O(1) < O(logn) < O(n) < O(nlogn) < O(2n) < O(n3) < O(2n) < O(n!)

在这里插入图片描述


6.4 🔔最好情况、最坏情况与平均情况

另外有些算法的时间复杂度存在最好、平均和最坏情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x
      最好情况:1次找到
      最坏情况:N次找到
      平均情况:N/2次找到
在实际中 一般在没有特殊说明的情况下,关注的都是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)。



七. ⛳️算法的空间复杂度

算法空间复杂度的定义:

  • 空间复杂度也是一个数学表达式,是对一个算法在运行过程中额外临时占用存储空间大小的量度
  • 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以 空间复杂度算的是变量的个数
  • 空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。

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



📝全文总结

本文主要讲解:

  1. 算法的定义:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
  2. 算法的特性:有穷性、确定性、可行性、输入、输出。
  3. 算法的设计要求:正确性、可读性、健壮性、高效率和低存储量需求。
  4. 算法的度量方法:事后统计方法、事前分析估算方法。
  5. 推导大O阶
  6. 时间复杂度
  7. 空间复杂度

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
在这里插入图片描述

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

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

相关文章

Multimodal Prototypical Networks for Few-shot Learning

tcGAN is provided with an embedding ϕ T \phi_T ϕT​() of the textual description 辅助信息 作者未提供代码

大模型中的显卡优化与分布式训练策略

目录 前言1 大模型训练优化的目标1.1 简单性1.2. 高效性1.3 廉价性 2 显存的组成与利用2.1 参数存储2.2 梯度计算与存储2.3 中间计算结果2.4 优化器信息 3 优化方法3.1 数据并行3.2 模型并行3.3 零冗余优化器&#xff08;Zero Redundancy Optimizer&#xff09;3.4 Pipeline并行…

前端数据魔法:解析数据透视功能实现

前言 在信息爆炸的时代&#xff0c;数据扮演着关键的角色。从庞大的数据中提取有用的信息并进行有效地分析&#xff0c;是一项充满挑战的任务。为了应对这个挑战&#xff0c;数据透视表这一工具应运而生。它通过重新排列和组合数据&#xff0c;使得原始数据更易于理解和分析。…

解决鸿蒙APP的内存泄漏

解决鸿蒙&#xff08;HarmonyOS&#xff09;应用的内存泄漏问题需要采用一系列的策略和技术。与解决Android内存泄漏类似&#xff0c;以下是一些建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

增强FAQ搜索引擎:发挥Elasticsearch中KNN的威力

英文原文地址&#xff1a;https://medium.com/nerd-for-tech/enhancing-faq-search-engines-harnessing-the-power-of-knn-in-elasticsearch-76076f670580 增强FAQ搜索引擎&#xff1a;发挥Elasticsearch中KNN的威力 2023 年 10 月 21 日 在一个快速准确的信息检索至关重要的…

收银系统源码,连锁店收银系统源码

智慧新零售系统是一套线下线上一体化的收银系统。致力于给零售门店提供『多样化线下收银』、『ERP进销存』、『o2o小程序商城』、『精细化会员管理』、『丰富营销插件』等一体化行业解决方案&#xff01; 一、多样化线下收银 1.聚合收款码 ①适用商户&#xff1a;小微门店&am…

在 .NET 中使用可以漫游的 Web 凭据

Windows 凭据管理器是一个内置在 Windows 操作系统中的功能&#xff0c;为用户提供一种安全的方式来存储和管理凭据。本文主要介绍如何在 .NET 中使用可以漫游的 Web 凭据&#xff0c;以及使用中的基本事项。 1. 引言 在前面的文章《试用 Windows Terminal 中的 Terminal Chat…

SwiftUI CoreData Picker

开发多账本功能 CoreData 与 Picker 的使用 上代码&#xff1a; // // TestZhangBenPicker.swift // pandabill // // Created by 朱洪苇 on 2024/1/14. //import SwiftUIstruct TestZhangBenPicker: View {FetchRequest(sortDescriptors: [SortDescriptor(\.cc_at)],anima…

人工智能与六西格玛设计:一场颠覆性的融合之旅

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和六西格玛设计&#xff08;Six Sigma&#xff09;已成为当今企业追求卓越的关键工具。当这两大领域相遇&#xff0c;它们将引发一场创新与变革的狂潮。本文将探讨AI与六西格玛设计结合的潜力&#xff0c;以及…

MySQL 查看表结构简单命令

一、简单描述表结构&#xff0c;字段类型 desc tabl_name; # 表名 显示表结构&#xff0c;字段类型&#xff0c;主键&#xff0c;是否为空等属性。 二、查询表中列的注释信息 select * from information_schema.columns where table_schema db #表所在数据库 and table_n…

易基因:表观遗传学和表观转录组修饰在植物金属和准金属暴露中的作用 | 抗逆综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 非必需金属&#xff08;non-essential metal&#xff09;和准金属&#xff08;metalloid&#xff0c;也称类金属&#xff09;对土壤的污染是全球许多地区面临的严重问题。这些非必需金属…

java发送邮件(注:本章以163邮箱为例)

目录 前言 一邮件服务器与传输协议 二.发送邮件思路 2.1注册163邮箱: 2.2、打开邮箱服务获取授权码 三.代码实现邮件发送 3.1第三方jar包 3.2创建邮件工具类 3.3编写测试类 前言 电子邮件的应用非常广泛&#xff0c;例如在某网站注册了一个账户&#xff0c;自动发送一…

Vue报错 Cannot find module ‘../../modules/es6.symbol‘解决办法

在进行webpack打包的时候&#xff0c;会出现Cannot find module XXX’的错误&#xff0c;找不到某个模块的错误&#xff0c;今天给出解决方法&#xff1a; 直接进行npm install重新打包&#xff1b;如果npm install重新打包之后&#xff0c;仍然出现这个问题&#xff0c;可以进…

Springboot 整合阿里云安装的redis

今天购买了一台阿里云实例于是在上面装了一个redis,开始时一直连不上&#xff0c;一直报DENIED Redis is running in protected mode because protected mode is enabled 或者是无法连接的错误&#xff0c;于是检查配置redis.conf中&#xff1a;bind 屏蔽或者0.0.0.0 设置&…

Vue2-Vuex中State、Mutation及mapState辅助函数、mapMutations的基本用法

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 个人笔记&#xff0c;仅供参考。 state&#xff1a;全局共享的响应式数据 mutation:声明修改全局响应式数据…

FPGA 原理图细节--画引脚

BGA引脚表示 1.1 FPGA此引脚要正确和清晰&#xff0c;会在“Package Pin”中用到次物理接口 1.2, MCU 只用管对应的GPIO逻辑接口就可以了 标识Bank电平 标识出对应Bank的电平&#xff0c;在电路设计中可以清晰的知道对应的脚位输出电平。在"IO std"也方便的选择 Ea…

PPT插件-大珩助手-保留原素材的位置和大小一键替换

保留原素材的位置和大小一键替换 若勾选了一键替换&#xff0c;对于从素材库插入的图形&#xff0c;可以使得它的位置、大小与幻灯片中选中的形状一致 软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;支持W…

Python 以相对/绝对路径的方式压缩文件

文章目录 1. tarfile 简单介绍2. tarfile 支持的模式3. 绝对路径压缩4. 相对路径压缩5. 参考 1. tarfile 简单介绍 Python 的 tarfile 模块提供了对 .tar 格式归档文件的全面支持&#xff0c;允许用户创建、读取、修改和写入 tar 归档文件。在实际应用中&#xff0c;tar 文件通…

vue-vben-admin 与.net core 结合实例 【自学与教学 小白教程】---第4节---部门管理

ue-vben-admin 与.net core 结合实例 这里计划使用.net core 作为后端 。目标&#xff1a;打造好看 易用 开箱即用 的netcore一体化框架。Vue Vben Admin For NetCore 取命 hcrain-vvadmin 我不是前端人员 但有时开发还是要写一些界面。 之前使用layui是时候 狠心升级下了。 …

TongLINKQ(2):TongLINKQ服务端安装

1 安装前的准备 明确应用&#xff08;JDK&#xff09;和TongLINK/Q的版本、位数&#xff08;要么都是32位&#xff0c;要么都是64位&#xff09;TLQ安装程序使用InstallAnywhere打包而成&#xff0c;因此需要JDK1.5及以上版本。 2 安装步骤 3 选择安装安装包 目前TongLINKQ的…