利用Python浅尝算法分析

简介: 学习编程的人或许都听说过,程序 = 数据结构 + 算法 .数据是程序的中心,算法是解决问题的步骤,数据结构和算法两个概念间的逻辑关系贯穿了整个程序世界,首先二者表现为不可分割的关系.没有数据间的有机关系,程序根本无法设计。数据结构是底层,算法是上层。数据结构为算法提供服务,算法围绕数据结构进行操作这些概念较为抽象,我们浅尝辄止,本文只介绍一些简单的理论,我们平时练习的程序可能运算规模和数据规模都很小每次运行都能很快得出结果,可以说是秒出.因为现在计算机技术的快速发展,就算是个人计算机一样有这非常可观的算力.但是这并不能改变运行程序时消耗资源的事实.在实际的开发中,无论是设计还是应用一种算法

引言


学习编程的人或许都听说过,程序 = 数据结构 + 算法 .数据是程序的中心,算法是解决问题的步骤,数据结构和算法两个概念间的逻辑关系贯穿了整个程序世界,首先二者表现为不可分割的关系.没有数据间的有机关系,程序根本无法设计。数据结构是底层,算法是上层。数据结构为算法提供服务,算法围绕数据结构进行操作

这些概念较为抽象,我们浅尝辄止,本文只介绍一些简单的理论,我们平时练习的程序可能运算规模和数据规模都很小每次运行都能很快得出结果,可以说是秒出.因为现在计算机技术的快速发展,就算是个人计算机一样有这非常可观的算力.但是这并不能改变运行程序时消耗资源的事实.


在实际的开发中,无论是设计还是应用一种算法,我们都要了解这种算法的性能如何,通常我们在衡量一个算法的性能时关心的是对CPU和内存的使用率,但是CPU是计算机中最为珍贵的资源,我们还是以CPU的使用率为主,它体现在算法上就是算法的运算速度,用一个专业的描述就是算法的时间复杂度.相应,如果要计算的是程序运行需要的空间需要考虑的就是空间复杂度.作为上层的使用者我们更关心是时间复杂度,时间越快越好,但是资源开销的成本来看,我们会平衡时间和空间进行取舍.


什么是时间复杂度


不同机器运算速度不一样,我们如何统一衡量一个算法的执行时间呢?计算机科学家们想到,可以用计算步骤来称量。我们所说的算法时间复杂度一般就是指解决问题所执行的语句频数.即算法从开始执行到执行完毕所需要的步骤数量。说通俗点,就是计算程序运行步骤次数的最高阶.由于并不是每个算法都能上机测试,而且现实中也没有太大的必要,我们一般需要分析得出大致计算所需要的资源,才会上机,而不是盲目上机测试.说白了.我们使用算法中语句的执行次数对算法进行估算,哪个算法中语句执行次数多,它花费的时间就多,同时我们通常将算法中的语句执行次数称为时间频度,记为T(n),n表示的是语句的规模


什么是大O表示法


有了T(n)之后,还有一个问题就是我们不知道随着处理数据的的增长他的变化会呈现出什么规律,因此引入辅助函数f(n)的概念,他和T(n)是同一个量级的,使用符号O(f(n))来替代T(n).O(f(n))这种形式也称为大O表示法.这样我们可以使用函数分析的手段较为准确地分析时间频度T(n),并以此来计算时间复杂度


大O表示法的规则


有些运行处理对于当前的算法来说影响很小,几乎可以忽略不计.

大O表示法的简单规则如下:

  1. 常数项使用O(1)表示
  2. 高阶因子和低阶因子并存,只保留高阶因子
  3. 如果高阶因子项存在并且不是常数项,则去除系数

对与上面的描述你可能还有一点一知半解,那我们就通过例子来唠一唠


算法分析的简单小实例:


常数阶:比如我们平时一些简单的赋值.简单的四则运行

a=2b=5c=0.5*a*bprint(c)


上面的例子所有语句最高阶是1,是常数级的.所以他们整体就是常数级的,所以他的时间复杂度就是常数阶用O(1)表示;不管这样的语句有多少条,时间复杂度也不会变,在算法中常数阶也是运行速度最快的


线性阶:简单理解就是可能涉及到单层循环


foriinrange(n):
print('hello!')


因为循环体中的时间复杂度为O(1)常数阶的代码执行了n次,这段代码的规模就是由n的大小决定的.所以它的时间复杂度为O(n)


平方阶:简单理解是在线性阶的基础上由多加了一层循环


foriinrange(n):
forjinrange(m):
print('你好')

在这段代码中最里层代码依然是常数阶,常数阶外面为两层循环,内层循环的频数是由外层决定的,所以,它的时间复杂度不能简单地设为n^2.但是我们可以对其进行推导,代码中输出语句执行的次数为:n+(n-1)+(n-2)+······+1这是一个等差数列,由等差数列公式可得该式为n^2+n/2.根据上文中大O表示法的第2和3条规则可得出最高阶为n^2,所以上面代码的时间复杂度为O(n^2)


常见时间复杂度的比较


下面分别从简单的例子列举中了解常用的算法复杂度:

O(1):从一个数据集中获取第一个元素


l= [1,2,3,4]
first=l[0]
print(first)

O(log n):将数据集分为两堆,然后将分好的部分再分半,以此类推(二分法)

defbinary_search(list, item):
low=0high=len(list)-1n=0whilelow<=high:
mid=int((low+high)/2)              
guess=list[mid]
n+=1iflist[mid]==item:
print(n)
returnmidiflist[mid]<item:                    
low=mid+1else:
high= (mid-1)
returnNonel=[1,2,3,4,8,9,11,12,14,18,19,20,28]
print(binary_search(l,12))


O(n):遍历一个数据集

l= [1,2,3,4]
foriinl:
print(i)


O(n log n):给数据生成所有的排列组合同时遍历分出来的每一半数据

O(n^2)平方级:遍历一个数据集中的每个元素的同时遍历另一个同数量级的数据集

O(2^n)指数级:为一个数据集生成其可能的所有子集

O(n!)阶乘级:给数据集生成所有的排列组合

唠一唠:你那些常用的算法都分别对应着上面的哪种时间复杂度呢?

目录
相关文章
|
29天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品消费模式分析的深度学习模型
使用Python实现智能食品消费模式分析的深度学习模型
122 70
|
19天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
207 55
|
7天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
102 66
|
28天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
154 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
27天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费市场分析的深度学习模型
使用Python实现智能食品消费市场分析的深度学习模型
110 36
|
1天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
4天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
9天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
41 5
|
10天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
25 6