”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 开发高效算法 - 使用大 O 表示法测量算法效率

开发高效算法 - 使用大 O 表示法测量算法效率

发布于2024-07-31
浏览:727

算法设计是开发解决问题的数学过程。算法分析是预测算法的性能。前面两章介绍了经典的数据结构(列表、堆栈、队列、优先级队列、集合和映射)并应用它们来解决问题。本章将使用各种示例来介绍用于开发高效算法的常用算法技术(动态规划、分而治之和回溯)。

Big O表示法获得了一个根据输入大小衡量算法时间复杂度的函数。您可以忽略函数中的乘法常数和非支配项。假设两种算法执行相同的任务,例如搜索(线性搜索与二分搜索)。哪一个更好?要回答这个问题,您可以实现这些算法并运行程序以获得执行时间。但这种方法有两个问题:

  • 首先,许多任务在计算机上同时运行。特定程序的执行时间取决于系统负载。
  • 其次,执行时间取决于具体的输入。例如,考虑线性搜索和二分搜索。如果要搜索的元素恰好是列表中的第一个元素,线性搜索将比二分搜索更快地找到该元素。

通过测量算法的执行时间来比较算法是非常困难的。为了克服这些问题,开发了一种理论方法来分析独立于计算机和特定输入的算法。这种方法近似改变输入大小的影响。通过这种方式,您可以看到算法的执行时间随着输入大小的增加而增加的速度,因此您可以通过检查两个算法的增长率

考虑线性搜索。线性搜索算法将键与数组中的元素顺序进行比较,直到找到键或数组耗尽。如果键不在数组中,则需要对大小为 n 的数组进行 n 比较。如果键在数组中,则平均需要 n/2 次比较。该算法的执行时间与数组的大小成正比。如果将数组大小加倍,则比较次数也会加倍。该算法以线性速率增长。增长率的数量级为n。计算机科学家使用大 O 符号来表示“数量级”。使用这种表示法,线性搜索算法的复杂度为 O(n),发音为“n阶”。我们将时间复杂度为 O(n) 的算法称为线性算法,并且它呈现出线性增长率。

对于相同的输入大小,算法的执行时间可能会有所不同,具体取决于输入。导致执行时间最短的输入称为最佳情况输入,导致执行时间最长的输入称为最坏情况输入。最佳案例分析和
最坏情况分析是分析算法的最佳情况输入和最坏情况输入。最好情况和最坏情况分析不具有代表性,但最坏情况分析非常有用。您可以放心,该算法永远不会比最坏情况慢。
平均情况分析尝试确定相同大小的所有可能输入之间的平均时间量。平均情况分析是理想的,但很难执行,因为对于许多问题来说,很难确定各种输入实例的相对概率和分布。最坏情况分析比较容易进行,所以一般都是针对最坏情况进行分析。

如果您几乎总是在查找列表中已知的内容,则线性搜索算法在最坏情况下需要 n 次比较,在平均情况下需要 n/2 次比较。使用 Big O 表示法,两种情况都需要 O(n) 时间。乘法常数 (1/2) 可以省略。算法分析的重点是增长率。乘法常数对增长率没有影响。 n/2 或 100_n_ 的增长率与 n 相同,如下表 增长率 所示。因此,O(n) = O(n/2) = O(100n).

Image description

考虑在 n 个元素的数组中查找最大数字的算法。如果n为2,则需要比较一次才能找到最大数;如果n为3,则进行两次比较。一般来说,需要 n - 1 次比较才能找到 n 个元素列表中的最大数量。算法分析适用于大输入量。如果输入量很小,那么估计算法的效率就没有意义。随着 n 变大,表达式 n - 1 中的 n 部分在复杂性上占主导地位。大 O 表示法允许您忽略非主导部分(例如,
中的 -1 表达式 n - 1)并突出显示重要部分(例如,表达式 n - 1 中的 n)。因此,该算法的复杂度为O(n)。

Big O 表示法根据输入大小估计算法的执行时间。如果时间与输入大小无关,则该算法被称为采用恒定时间,符号为O(1)。例如,检索数组中给定索引处的元素的方法
需要常数时间,因为时间不会随着数组大小的增加而增加。

以下数学求和在算法分析中通常很有用:

Image description

时间复杂度是使用 Big-O 表示法来衡量执行时间。同样,您还可以使用 Big-O 表示法来测量空间复杂度空间复杂度衡量算法使用的内存空间量。书中介绍的大多数算法的空间复杂度都是 O(n)。即,它们对输入大小表现出线性增长率。例如,线性搜索的空间复杂度为 O(n).

版本声明 本文转载于:https://dev.to/paulike/developing-efficient-algorithms-measuring-algorithm-efficiency-using-big-o-notation-1c1h?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-04-01
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-04-01
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-04-01
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-04-01
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 的 ...
    编程 发布于2025-04-01
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-04-01
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-04-01
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    将pandas dataframe列转换为dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定义格式:})指定的格式参数匹配给定的字符串格式。转换后,MyCol列现在将包含DateTime对象。 date date filtering > = p...
    编程 发布于2025-04-01
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-04-01
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-04-01
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-04-01
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_rename() runkit_function_redefine() //重新定义'this'以返回“新和改...
    编程 发布于2025-04-01
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-04-01
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-01
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-04-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3