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

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

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

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

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]删除
最新教程 更多>
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c 的函数时,接受成员函数指针的函数时,必须同时提供对象的指针,并提供指针和指针到函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此)和成员函数指针。这可以通过修改Menubutton :: SetButton()(如下所示:[&& && && &&华)...
    编程 发布于2025-05-16
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-05-16
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-05-16
  • 在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    Accessing Actual Rendered Font when Undefined in CSSWhen accessing the font properties of an element, the JavaScript object.style.fontFamily and objec...
    编程 发布于2025-05-16
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-05-16
  • 在Oracle SQL中如何提取下划线前的子字符串?
    在Oracle SQL中如何提取下划线前的子字符串?
    [ 在oracle sql 解决方案: Explanation:SUBSTR function extracts a substring starting from the specified position (0) and continuing for a specified length.IN...
    编程 发布于2025-05-16
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-05-16
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制,控制元素的滚动行为对于确保用户体验和可访问性是必不可少的。一种这样的方案涉及限制动态大小的父元素中元素的滚动范围。问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期...
    编程 发布于2025-05-16
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-05-16
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-16
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-05-16
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-05-16
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-05-16
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-05-16
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-05-16

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

Copyright© 2022 湘ICP备2022001581号-3