Python算法中的时间复杂度与空间复杂度

news2024/9/25 19:15:04

大家好,当谈论算法性能时,经常提到两个关键的衡量标准:时间复杂度和空间复杂度。时间复杂度指的是随着输入规模的增长,执行一个算法需要的时间,而空间复杂度指的是一个算法在执行过程中所使用的内存量。本文将详细探讨这两个概念,使用Python示例来说明它们是如何影响算法性能的。

 时间复杂度

时间复杂度衡量的是随着输入规模的增加,执行一个算法所需要的时间。它通常用大写符号O来表示,它为算法的最坏情况下的运行时间提供了一个上限。

考虑一个简单的例子:使用线性搜索在一个未排序的列表中搜索某个元素。该算法依次检查列表中的每个元素,直到找到目标元素。线性搜索的时间复杂度是O(n),其中n是列表的大小。这意味着该算法的最坏情况下的运行时间与列表的大小成线性增长。

下面是一个线性搜索的Python代码片段的示例:

def linear_search(arr, x):
    for i in range(len(arr)):
        if arr[i] == x:
            return i
    return -1

现在来考虑一个更复杂的算法,比如“快速排序”。“快速排序”是一种分治算法,它根据一个枢轴元素将一个数组递归为更小的子数组。“快速排序”的时间复杂度平均为O(n log n),比线性搜索快。

下面是一个“快速排序”的Python代码片段的示例:

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]
        less = [x for x in arr[1:] if x <= pivot]
        greater = [x for x in arr[1:] if x > pivot]
        return quicksort(less) + [pivot] + quicksort(greater)

最后,考虑一下算法的最坏情况:粗暴的字符串匹配。强制字符串匹配检查字符串中的每个字符,看它是否与一个模式字符串相匹配。暴力字符串匹配的时间复杂度是O(mn),其中m是模式字符串的长度,n是输入字符串的长度。这意味着该算法的最坏情况下的运行时间随着输入的大小呈四次方增加。

下面是一个粗暴的字符串匹配的Python代码片段的示例:

def brute_force_string_match(input_str, pattern_str):
    for i in range(len(input_str) - len(pattern_str) + 1):
        if input_str[i:i+len(pattern_str)] == pattern_str:
            return i
    return -1

空间复杂度

空间复杂度衡量一个算法在执行过程中随着输入大小的增加所使用的内存量。它也可以用大写符号O来表示,它为算法的最坏情况下的内存使用提供了一个上限。

考虑一个简单的例子:用for循环计算一个列表中的元素之和。该算法使用的内存量是恒定的,所以空间复杂度是O(1)。

下面是一个计算列表之和的Python代码示例:

def sum_list(arr):
    total = 0
    for x in arr:
        total += x
    return total

现在考虑一种更复杂的算法,如矩阵乘法。矩阵乘法涉及将两个矩阵相乘以产生第三个矩阵。矩阵乘法的空间复杂性是O(n²),其中n是矩阵的大小。

下面是一个关于矩阵乘法的Python代码片段的示例:

import numpy as np

def matrix_mult(A, B):

选择正确的算法对于优化程序的性能至关重要。如下是一些关于何时使用哪种算法的指南:

  • 1.当需要在一个排序的列表或数组中搜索一个项目时,使用二进制搜索算法。二进制搜索的时间复杂度为O(log n),这使得它比大数据集的线性搜索快得多。

  • 2.当需要对一个大的列表或数组进行排序时,使用合并排序算法。合并排序的时间复杂度为O(n log n),这使得它对大数据集来说很有效。

  • 3.当需要通过将一个问题分解成较小的子问题来解决时,使用动态编程算法。动态编程可用于解决广泛的问题,从优化问题到图形问题。

  • 4.当需要找到图中两个节点之间的最短路径时,使用广度优先搜索(BFS)算法。BFS也可以用来寻找从一个给定节点可以到达的所有节点。

  • 5.当需要探索一个图中的所有节点时,使用深度优先搜索(DFS)算法。DFS也可以用来寻找图中两个节点之间的路径。

  • 6.当需要做出一系列选择,使某些目标最大化或最小化时,使用贪心算法。贪心算法通常用于优化问题,其目标是从一组可能的解决方案中找到最佳解决方案。

  • 7.当需要探索一个问题的所有可能的解决方案时,使用回溯算法。回溯算法可用于解决诸如n-queens问题或旅行推销员问题。

  • 8.当需要将一个问题分解成较小的子问题,并能独立解决时,可使用分而治之算法。分而治之的算法可以用来解决诸如排序和搜索等问题。

综上,算法的选择取决于要解决的具体问题和所处理的数据的特点。重要的是要了解每种算法的时间复杂度和空间复杂度,并选择最能满足需求的算法。

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

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

相关文章

机器学习-sigmoid函数和relu函数-个人解读

机器学习-sigmoid函数和relu函数-个人解读 今天博主来解读一下sigmoid函数和relu函数&#xff0c;我觉得很多同学可能都知道这两个函数是什么&#xff0c;他们干什么的&#xff0c;他们有什么用&#xff0c;但是呢&#xff1f;我想这两个常用的激活函数内在的本质&#xff0c;…

Ai数字人——为写实而生

在当今数字化时代&#xff0c;人工智能技术正成为推动各行各业发展的重要驱动力。企业需要创新的解决方案&#xff0c;以提高效率、降低成本、增强客户体验并应对市场竞争。Ai数字人作为数字化转型的关键组成部分&#xff0c;具备强大的潜力和多样化的应用场景。 根据市场研究…

dbeaver配置SQL server连接

一、需要java jdk环境&#xff0c;我用的比较新 新的&#xff0c;那坑可就来了&#xff0c;先记着 cmd中 java --version出现版本号代表安装成功 二、dbeaver新建连接SQL server 点击测试连接会自动下载驱动&#xff0c;这个时候重点报错就开始出现了 错误一&#xff1a;DBea…

【已解决】matrix contains invalid numeric entries,记录bug修改

文章目录 摘要原因解决办法图像分类网络AlexNetVGGNetGooLeNet系列ResNetDenseNetSwin TransformerMAECoAtNetConvNeXtV1、V2MobileNet系列MPViTVITSWAEfficientNet系列MOBILEVITEdgeViTsMixConvRepLKNetTransFGConvMAEMicroNetRepVGGMaxViTMAFormerGhostNet系列DEiT系列MetaFo…

CMOS图像传感器——三星ISOCELL HP2技术解析

在之前有写文章介绍三星在2022年技术日活动分享的包括图像传感器在内的各种系统相关技术的最新改进和未来愿景,可以回顾下看看。 三星ISOCELL——2022 改进与展望_沧海一升的博客-CSDN博客三星ISOCELL最新改进和未来发展趋势https://blog.csdn.net/qq_21842097/article/detai…

Stable Diffusion AI 绘画入门指南

Stable Diffusion AI 绘画入门指南 市面上用的最多的AI绘画工具是 Stable-Diffusion&#xff08;SD&#xff09; 和 Midjourney&#xff08;Mid&#xff09;&#xff0c;SD是在本地运行的服务&#xff0c;开源&#xff0c;门槛高&#xff0c;但自控性极高。而Mid作为在线的服务…

Redis——基础篇(包含redis在云服务上的docker化安装和连接以及常用命令)

初识Redis Redis为键值型数据库&#xff0c;数据以键值形式存储。没有表&#xff0c;没有约束。 认识NoSQL mysql就是典型的关系型数据库(SQL)。 目的都是数据的增删改查&#xff0c;但数据存储方式不一样。 关系型和非关系型在结构上有差异 关系型的结构一般定好后就很少修…

基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频

系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;二&#xff09;&#xff1a;基础知识和解封装&#xff08;demux&#xff09;基于 FFmpeg 的跨平台视频…

【unity小技巧】委托(Delegate)的基础使用和介绍

文章目录 一、前言1. 什么是委托&#xff1f;2. 使用委托的优点 二、举例说明1. 例12. 例2 三、案例四、泛型委托Action和Func1. Action委托2. Func委托 五、参考六、完结 一、前言 1. 什么是委托&#xff1f; 在Unity中&#xff0c;委托&#xff08;Delegate&#xff09;是一…

2FRE-10B-35-G24电比例调速阀控制器

2FRE-06B-20-G24、2FRE-10B-35-G24、2FRE-10B-50-G24、2FRE-16B-80-G24、2FRE-16B-115-G24、2FRE-16B-160-G24电比例调速阀&#xff0c;通过给定电信号&#xff0c;控制阀出口流量大小&#xff0c;并且采用压力补偿原理&#xff0c;保证输出流量大小不受负载压力影响维持恒定;该…

低代码平台实用吗?有哪些大型企业在用低代码?

一、目前正在使用低代码平台的企业有哪些&#xff1f; &#xff08;例举一些各行业规模较大的企业&#xff09; 制造行业&#xff1a;施耐德电气、吉利汽车、科大能通、伟星集团、远东控股、一汽大众、老板电器、双菱电梯、君乐宝。 建筑行业&#xff1a;中国交建、筑福集团…

【C++STL】“vector“用法 入门必备 超详细

vector用法 什么是vector&#xff1f;vector的使用vector的定义(构造函数)vector iterator 的使用迭代器演示范围for vector 空间增长扩容机制 vector 的增删查改assignvector 迭代器失效问题。 &#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x…

关于将Leetcode上代码直接复制到自己环境中的问题

实例代码&#xff08;不考虑代码的优劣性&#xff09;&#xff1a; 注&#xff1a;我用的是一个在线平台的编译器 Problem1 NameError&#xff1a;name ‘List’ is not defined 解决方法&#xff1a;添加下面代码&#xff1a; from typing import ListProblem2 TypeError…

Android Glide预加载preload ,kotlin

Android Glide预加载preload ,kotlin val imageView findViewById<ImageView>(R.id.image_view)Glide.with(this).asBitmap().load(image_file.path).signature(ObjectKey(image_file.path)).addListener(object : RequestListener<Bitmap> {override fun onLoadF…

抓取唯美图库(BeautifulSoup)

使用BeautifulSoup 1、拿到主页面的源代码&#xff0c;然后提取到子页面的简介地址&#xff0c;href 2、通过href拿到子页面的内容。从子页面中找到导图片的下载地址 img -> src 3、下载图片 import requests from bs4 import BeautifulSoupurlhttps://www.umei.cc/bizhi…

qt 闹钟实现

实现一个闹钟 自定义时间 按下开始后 开始计时&#xff0c;结束计时会播报语音 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTimerEvent> #include <QDateTime> #include <QTime> #include …

【Leetcode】37.解数独(困难)

一、题目 1、题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字…

UVM中测试用例的启动

一、命令行指定 ./simv -l simv.log UVM_TESTNAMEmy_case0 其中 UVM_TESTNAMEmy_case0 中的my_case0就是测试用例的名字 二、文件结构 在test文件夹中my_case0.sv对应case的名字 三、文件说明 3.1 my_case0.sv 其中其他都是写死的&#xff0c;只有红框的部分根据具体的代码…

温度反转效应Temperature Inversion(载流子迁移率与过阈值电压 谁占主导)

In general, as temperature increases, the delay of standard cells increases because of mobility degradation at higher temperatures.    But in lower technology nodes the impact of temperature on the delay of the cell is inverse. In lower nodes, the delay …

上海亚商投顾:沪指维持震荡 光伏等新能源赛道走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日集体反弹&#xff0c;沪指高开后维持震荡走势&#xff0c;创业板指盘中涨超2%&#xff0c;午后涨幅有…