算法分析和大O简介

news2025/2/12 16:02:46

在本文中,我们将讨论如何分析算法以及为什么这样做很重要!

为什么要分析算法?

在我们开始之前,让我们澄清一下什么是算法。在本文中,算法只是解决问题的过程或公式。有些问题非常有名,以至于算法都有名字,而有些程序非常常见,以至于与之相关的算法也有名字。所以现在我们有一个很好的问题需要回答:

如何分析算法以及如何比较算法?

想象一下,如果你和一个朋友都想出了从0到N的求和函数。如何比较函数和函数中的算法?让我们假设你俩都有这两个独立的功能:

def sum1(n):
    '''
    Take an input of n and return the sum of the numbers from 0 to n
    '''
    final_sum = 0
    for x in range(n+1): 
        final_sum += x
    
    return final_sum
sum1(10)
# 55
def sum2(n):
    """
    Take an input of n and return the sum of the numbers from 0 to n
    """
    return (n*(n+1))/2
sum2(10)
# 55.0

你会注意到这两个函数有相同的结果,但算法完全不同。你会注意到,第一个函数迭代地添加数字,而第二个函数使用:
在这里插入图片描述
那么,我们如何客观地比较这些算法呢?我们可以比较它们在内存中占用的空间量,或者我们也可以比较每个函数运行所需的时间。我们可以使用jupyter中内置的%timeit魔术函数来比较函数的时间。Jupyter Notebooks中的%timeit魔术将重复循环迭代一定次数并获得最佳结果。

让我们继续比较运行函数所花费的时间:

%timeit sum1(100)
# 5.17 µs ± 94.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit sum2(100)
# 161 ns ± 9.09 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

我们可以看到,第二个函数的效率要高得多!以比第一个更快的速度运行。但是,我们不能用“运行时间”作为一个客观的衡量标准,因为这将取决于计算机本身的速度和硬件能力。因此,我们需要使用另一种方法,Big-O!

大O符号

在本节中,我们将讨论Big-O符号的语法是如何工作的,以及我们如何使用Big-O符号来描述算法!
我们之前讨论了以下功能:

def sum1(n):
    '''
    Take an input of n and return the sum of the numbers from 0 to n
    '''
    final_sum = 0
    for x in range(n+1): 
        final_sum += x
    
    return final_sum
def sum2(n):
    """
    Take an input of n and return the sum of the numbers from 0 to n
    """
    return (n*(n+1))/2

现在我们想开发一种符号来客观地比较这两种算法的效率。一个好的开始是比较每个算法所做的分配数量。
原始的sum 1函数将创建n+1次赋值,我们可以从基于范围的函数中看到这一点。这意味着它将对final_sum变量赋值n+1次。然后我们可以说,对于一个大小为n的问题(在这种情况下只是一个数字n),这个函数将需要1+n步。
这个n符号允许我们比较解决方案和算法相对于问题的大小,因为sum 1(10)和sum 1(100000)将需要非常不同的时间来运行,但使用相同的算法。我们还可以注意到,当n变得非常大时,+1不会有太大的影响。因此,让我们开始讨论如何为这种表示法构建语法。
现在我们将讨论如何形式化这个符号和概念。
Big-O符号描述了当输入变得任意大时,运行时相对于输入增长的速度。
让我们更仔细地检查其中的一些要点:

  • 请记住,我们想要比较运行时的增长速度,而不是比较确切的运行时,因为这些运行时可能会因硬件而异。
  • 由于我们希望比较各种输入大小,因此我们只关心相对于输入的运行时增长。这就是为什么我们用n来表示符号。
  • 当n变得任意大时,我们只需要考虑随着n变大而增长最快的项,在这一点上,大O分析也被称为渐近分析

对于语法sum 1(),可以说是O(n),因为它的运行时间随着输入大小线性增长。在下一节中,我们将讨论各种O()类型和示例的更具体的示例。在结束本节时,我们将展示Big-O函数运行时的巨大差异。

常见Big-O函数的运行时

以下是常见的Big-O函数表:
在这里插入图片描述
现在,让我们绘制运行时与Big-O的图,以比较运行时。我们将使用一个简单的matplotlib来绘制下面的图。

from math import log
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('bmh')

# Set up runtime comparisons
n = np.linspace(1,10,1000)
labels = ['Constant','Logarithmic','Linear','Log Linear','Quadratic','Cubic','Exponential']
big_o = [np.ones(n.shape),np.log(n),n,n*np.log(n),n**2,n**3,2**n]

# Plot setup
plt.figure(figsize=(12,10))
plt.ylim(0,50)

for i in range(len(big_o)):
    plt.plot(n,big_o[i],label = labels[i])


plt.legend(loc=0)
plt.ylabel('Relative Runtime')
plt.xlabel('n')

在这里插入图片描述
请注意,对于相同的n值,Big-O效率可以对预计的运行时产生多大的差异!显然,我们希望选择远离任何指数、二次或三次行为的算法!
在下一章中,我们将学习如何正确地表示Big-O,并查看各种问题的示例并计算其中的Big-O!

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

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

相关文章

JMeter参数化4种实现方式

目录 前言: 1 参数化释义 2 参数化实现 CSV实例 注意事项 前言: 在使用JMeter进行测试时,参数化允许您模拟不同的用户、不同的数据、不同的操作等,从而增加了测试的灵活性和复用性 1 参数化释义 什么是参数化?…

软件系统开发包括哪些步骤?

在传统的理解中,企业内数字化应用的开发和迭代应该是 IT 部门的工作,但事实并非如此。一方面,激烈的市场竞争和反复出现的疫情给数字化提出了新的要求;另一方面,五花八门的零代码、低代码工具正如雨后春笋一般出现&…

NB-lot和LoRa真正的差别在哪里?

就像要把大象装冰箱一样,物联网,万物互联也是要分步骤的。 一、感知层(信息获取层),即利用各种传感器等设备随时随地获取物体的信息; 二、网络层(信息传输层),通过各种电信网络与互联网的融合,将物体的信息实时准确地…

[AI语音克隆] 5秒内克隆您的声音并生成任意语音内容

前言 随着人工智能技术的不断发展,语音克隆技术也得到了越来越多的关注和研究。目前,AI语音克隆技术已经可以实现让机器模拟出一个人的声音,甚至可以让机器模拟出一个人的语言习惯和表情。 然而,AI语音克隆技术仍然面临着许多难…

BB84协议:量子秘钥分发

文章目录 为什么需要量子密钥分发通讯工具基本通讯 BB84协议为什么这样做能防止通讯被窃听?在传统信道上的窃听在量子信道上的窃听 内容来源: 为什么需要量子密钥分发 BB84协议是一种“密钥分发协议”,所以从功能上来讲,它要实现的目标与之…

618大促 | 解析平台、商家和消费者必须面对的三大风险

目录 618年中大促的三大风险 商家乐此不疲的“刷单炒信” 消费者无计可施的“薅羊毛” 平台恨之入骨的“恶意爬虫” 618三类欺诈风险的特点 618电商平台的业务安全防控之道 618大促再次开启,各平台及商家的促销大战如火如荼。 2023年618,京东推出…

【状态估计】用于非标量系统估计的最优卡尔曼滤波(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

leetcode数据结构题解(Java实现,第一天和第二天)

文章目录 第一天217. 存在重复元素53.最大子数组和 第二天1. 两数之和88. 合并两个有序数组 第一天 217. 存在重复元素 题解思路:首先题目需要的是判断数组中是否存在相同的数字,存在返回true,不存在就返回false。 那么显然可以这样做,先进行…

内网IM即时通讯软件WorkPlus,快速连接工作的沟通利器

在当今信息高度发达的时代,企业内部沟通的重要性不言而喻。随着企业团队的扩大和分布式办公的兴起,即时通讯软件成为了一种必不可少的工具。通过即时通讯软件,团队成员可以实时交流和协作,快速解决问题,加快决策过程。…

Echarts的地图实现拖拽缩放同步功能(解决多层geo缩放、拖动卡顿问题)

项目场景: 大屏项目显示云南省3D的地图,可拖拽缩放、地图打点、点击图标弹框等等功能 问题描述 多图层拖拽时会上下层会分离,延迟卡顿 原因分析: 1、拖拽时不同图层的中心坐标没有保持一致, 2、卡顿是数据更新动画时…

玩业余无线电时,突然听到有人呼救,该怎么办?

不管是在玩业余无线电还是在其他活动当中,突然遇到有人求救,都是一件非常重要的事情,因为救援行动的效率快慢和是否及时,都有可能影响到别人的生命安全。 下面是河南宝蓝小编给出的一些思考和建议,希望对大家会有一些帮…

软件测试-测试用例

目录 测试用例的四个要素 测试用例设计方法 基于需求进行测试用例的设计 等价类 边界值 判定表 正交表 通过allpirs画正交表 场景设计法 错误猜测法 面试题 如何模拟弱网 接口如何测试 zip命令测试 测试用例万能公式 水杯测试用例 微信发朋友圈 测试用例的四个…

Java实现的五子棋游戏 ~java.awtjava.swing

文章目录 Java实现的五子棋游戏1.实现效果2.实现源码2.1运行主函数main.java2.2 棋盘布局Chessboard.java3.Algorithm算法 点击下载链接:Java实现的五子棋游戏源码下载 Java实现的五子棋游戏 作业要求: (1)课题代号: …

老Mac电脑安装macOS Ventura实战

前提说明:此实战适用于老旧Mac电脑(2015年之前的,无法在系统设置中升级macOS Ventura系统的电脑)安装macOS Ventura系统! 软件:OpenCore-Patcher-GUI.app.zip 工具:16G U盘、或者移动硬盘&a…

Spring MVC拦截器Interceptor使用(判断用户登录)

文章目录 一 概念二 3步使用三 HandlerInterceptor接口四 代码实现 一 概念 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验…

superset链接本地数据库

打开图中 选择database 先解释SQLlite的格式 如下 SQLALCHEMY_DATABASE_URI mysql://username:password127.0.0.1:3306/gmall_report’ 请将 username 和 password 替换为实际的 MySQL 数据库的用户名和密码。 mysql则为如下

我有过密接的9个博士

我有过密接的9个博士 是我人生中留下的印迹和谈资 其中一个是中科大少年班的学神 趣讲大白话:多点谈资 【趣讲信息科技196期】 **************************** 我密接过的哪些博士们: 1、科大少年班刘雪峰博士。1998年,创智公司(当…

Banana Pi BPI-R3 Mini:2.5GbE 嵌入式路由器板,MTK7986方案

香蕉派 BPI-R3 Mini Banana Pi BPI-R3 Mini 是一款功能强大的 SBC 路由器板,专为需要高速网络功能的个人和企业而设计。这款路由器是广受欢迎的 Banana Pi R3 路由器板的小兄弟,配备了先进的功能,旨在提供可靠的性能,是需要可靠网…

元宇宙游戏:新瓶换新酒

当你打游戏时,你在打什么? 抛出这个问题,便也抛出了游戏背后的组成——设计、技术、应用。 在元宇宙产业链中最有感知度的,是场景和内容,作为现实世界的模拟与延伸,游戏和社交领域是最先具备实现基础的元…

存储基础知识及相关术语

存储基础知识 前置:存储基本概念 我们现在处于信息时代,每天都在和电脑、手、平板机打交道。我们的工作和生活,已经完全离不开视频、音乐、图片、文本、表格这样的数据文件。 而所有这些数据文件,都需要通过电子设备进行保存&…