问题

算法A时间复杂度O(n²),算法B时间复杂度为O(n³),为什么选择算法B而不选算法A的6个理由?

回答
在我看来,大多数情况下我们确实会优先选择时间复杂度更低的算法,也就是在您提到的例子里是算法A(O(n²))。毕竟,更快的执行速度通常意味着更好的用户体验和更少的资源消耗。

但是,任何事情都有例外,而且在某些特定的场景下,一个看似“慢”的算法(比如算法B,O(n³))反而可能比一个“快”的算法(算法A,O(n²))更受青睐。我仔细想了想,大概有这么几个可能的原因,虽然听起来有点反直觉,但确实存在:

1. 算法A在某些情况下比理论上更慢: 时间复杂度只是一个宏观的描述。它告诉我们当输入规模n“足够大”时,算法的执行时间增长趋势。但它并不包含一些“常数因子”或者“低阶项”。想象一下,如果算法A的实际运行时间是 T(n) = 10000n² + 50n + 100,而算法B的实际运行时间是 T(n) = 0.001n³ + 10n + 5。当n很小的时候,算法A的那个大大的常数项(10000)可能会让它比算法B慢很多。当然,这需要特定的数值,但理论上,如果算法A有非常大的常数开销,或者在实际实现中有大量的函数调用、复杂的内存访问等,它在小到中等规模的数据集上可能表现不如算法B。

2. 算法B在某些特定输入上表现出色: 有些算法的平均时间复杂度是O(n³),但它对某些特定类型的数据非常敏感。如果你的应用场景恰好很少遇到这些“ worstcase”输入,那么算法B的实际性能可能会远好于其理论最坏情况,甚至超过算法A在所有情况下的表现。反之,如果算法A是那种即使输入不是最坏情况,依然会受到某些因素影响,那么算法B即使理论上慢,在实际操作中也可能显得更可靠。

3. 算法B的实现更简单,维护成本更低: 作为一个开发者,我们不仅要考虑算法的速度,还要考虑开发和维护的成本。有时候,一个O(n³)的算法可能只需要几行代码,逻辑非常直观,容易理解和调试。而一个O(n²)的算法可能因为追求极致性能,引入了非常复杂的逻辑、数据结构或者优化技巧,导致代码量巨大、可读性差,一旦出现问题,调试起来会非常耗时,后期维护也困难重重。对于一个生命周期不长的项目,或者对性能要求不是那么极端到非O(n²)不可的场景,选择一个更易于开发的算法B可能就是明智的选择。

4. 算法B在内存占用或资源消耗上更优: 时间复杂度关注的是CPU的执行时间,但现代计算机系统还有很多其他资源,比如内存、磁盘IO、网络带宽等。有可能算法A虽然在理论时间上更快,但它为了达到这个速度,需要消耗大量的内存,甚至可能导致频繁的内存分配和释放,从而引发性能瓶颈。而算法B,尽管计算量大,但可能对内存的需求非常低,或者它的计算过程可以非常高效地利用缓存,反而使得整体的资源消耗更小,在资源受限的环境下(比如嵌入式设备),这可能是更重要的考量。

5. 算法A的常量因子过大,导致在实际应用范围内无优势: 就像前面提到的,时间复杂度忽略了常数因子。但这个常数因子有时候是极其重要的。假设算法A的实际时间是 T_A(n) = 1000n²,而算法B的实际时间是 T_B(n) = 5n³。如果我们分析一下 n=10 时,T_A(10) = 1000 100 = 100,000, T_B(10) = 5 1000 = 5000。在这里,算法B明显更快。当然,随着n增大,n²的增长速度会赶超n³的常数倍数,但如果我们的应用场景很少会处理非常大的n,那么这个“理论上”的优势就根本发挥不出来,甚至会被算法B反超。

6. 算法B的解决方案更具通用性或灵活性: 有时候,一个算法虽然在某个特定问题上看起来效率不高,但它可能拥有更广泛的适用性,或者更容易扩展和修改以适应未来可能出现的需求变化。比如,一个O(n³)的算法可能是一种通用的搜索或优化方法,它虽然不如为特定问题量身定制的O(n²)算法快,但它可以轻松地应用于解决一系列相似但又不完全相同的问题,从而节省了为每个问题重新设计和实现算法的时间和精力。在需要快速原型开发或者面对不确定需求的场景下,这种通用性可能比单纯的速度更宝贵。

所以,虽然我们总是强调选择效率更高的算法,但在实际的项目开发中,我们不能只盯着时间复杂度这一个指标。很多时候,我们需要综合考虑算法的实际表现、开发成本、维护成本、资源消耗以及问题的特性,才能做出最合适的选择。

网友意见

user avatar
  • 空间复杂度过大,空间换时间但目标机器空间不足。
  • 数据量过小,效率更高的算法耗用时间相对更长。如常数时间每次查询都需要1毫秒,而平方复杂度在数据量低于某个值时只需几十个纳秒,那么显然后者为好。一个典型案例就是对quick sort算法的优化:当数据分割到小于等于6个元素时改用复杂度高半级的冒泡排序,最终表现却比纯粹的quick sort更好。另一个案例是哈希表,当数据量较小时二分法查找只需十几次访问,哈希表本身的哈希算法却可能需要执行很多条指令(当然现在因为内存速率和CPU严重不匹配,cache miss本身消耗的额外时间可能就足够执行哈希算法了,具体哪个更好用需要先做测试才能确定)。
  • 时间消耗不稳定,如常数时间的哈希表在冲突发生时退化到链表,而对数复杂度的二分法稳定在对数复杂度。那么对于实时系统,哈希表可能就是不可行的。
  • 数据准备/维护代价过大。比如一个对数查询效率的数据结构,插入新数据的消耗可能是指数复杂度。
  • 精度不足。如布隆过滤器效率O(1),但只能确认数据不在集合中。而它报告数据存在时,数据却可能不在,也就是存在误判。类似的,有很多效率极高的近似算法,在需要精确解时显然是不能用的。
  • 无法满足可靠性要求。比如如果某高效算法无法做到事务级可靠性(ACID)、或者在多线程场合表现极差,那么在可靠性不可忽略的场合自然不能使用。
  • 对数据性质有苛刻要求。比如基数排序效率可达O(N),但要求数据必须是有限位的数字、每位符号数目有限且每个数字位满足进位值类似的权值约束。


好像一不小心说了七条,但似乎并没能涵盖所有情况...

user avatar

问题:输入两个 的矩阵 ,计算矩阵乘积

实际用的算法

直接法,一个一个老老实实乘。利用硬件的乘加融合、SIMD、Tensor Core,有明显的优化效果。

Strassen算法

三个维度都对半切 , ,

如果是直接法,就用左边的8个小矩阵块,可以通过4次小矩阵块的加法和8次小矩阵块的乘法,算出右边4个小矩阵块

而Strassen算法把计算公式变形,变成18次矩阵加法( )和7次矩阵乘法(递归的 ),具体看这篇文章

Strassen算法的两个问题:

  1. 复杂度低阶项大。也就是小矩阵块加法从4次变成18次,虽然平方是低阶项,但是在实际的有限规模下不能忽略。而且,矩阵加法的主要开销不是每个元素的浮点加法,而是内存访问(或者说cache的启动缺失)。
  2. 浮点精度低。 和 不是2个乘积之和,而是4个乘积之和,把4个乘积的误差累积起来了;递归算下去,对角线附近的元素要经过 次乘加的误差累积。

目前已知的渐进复杂度的极限

把上面的数字一般化,每个方向分成 份,变成 次矩阵乘法,复杂度变成

考虑更大的 。比如 时, 不一定是 。因为两层合到一起以后有更多的公式变形机会,乘法次数有可能更少,渐进复杂度更低;但是公式变形的代价是加法更多,低阶项更大,有可能精度更低。

目前已知的渐进复杂度的极限是令 ,取 得到的极限。

类似的话题

  • 回答
    在我看来,大多数情况下我们确实会优先选择时间复杂度更低的算法,也就是在您提到的例子里是算法A(O(n²))。毕竟,更快的执行速度通常意味着更好的用户体验和更少的资源消耗。但是,任何事情都有例外,而且在某些特定的场景下,一个看似“慢”的算法(比如算法B,O(n³))反而可能比一个“快”的算法(算法A,.............
  • 回答
    在一个神经网络的选特征环节,如果一个特征(我们称之为特征 C)在算术意义上可以被表示为另外两个特征(特征 A 和特征 B)的和,即 C = A + B,那么是否还有必要选择特征 C,这是一个非常值得探讨的问题,而且答案并不是绝对的“是”或“否”,需要根据具体情况来分析。从理论上讲,如果 C = A .............
  • 回答
    关于《原神》PC端是否算得上“3A游戏”,这其实是个挺有意思但又有些复杂的问题,没有一个绝对非黑即白的答案,更多的是取决于你如何定义“3A”。咱们不妨一点点捋捋清楚。首先,得明白“3A”这玩意儿是怎么来的,以及它通常代表着什么。“3A”这个概念最早是游戏行业内部用来划分游戏开发和发行成本等级的说法。.............
  • 回答
    某 A 股券商分析师在研报中以“风水算命、阴阳五行”研究股市,这一现象无疑是荒谬且令人啼笑皆非的,但其背后却折射出 A 股市场以及部分从业人员存在的深刻问题。评价这一现象,需要从多个层面进行剖析: 一、 评价这一现象:1. 严重违背科学精神和专业操守: 缺乏实证依据: 股票市场的波动是受宏观经济.............
  • 回答
    算力不敌N卡,A卡为何难以抢占市场?在竞争激烈的显卡市场,英伟达(NVIDIA)凭借其强大的算力优势,一直占据着主导地位。而AMD(Radeon)虽然也在努力追赶,但似乎总与市场头把交椅擦肩而过。这不禁让人好奇:算力不如N卡,AMD为何不借机全力冲击市场,将矿老板们的目光吸引过来呢?矿老板的“金算盘.............
  • 回答
    要准确判断《哆啦A梦》里大雄家当年的收入水平,其实比想象中要复杂一些,因为藤子·F·不二雄老师在创作时,更多的是服务于故事的趣味性和角色设定,而非严格的社会经济写实。不过,我们可以从一些细节入手,结合那个时代的日本社会背景,来做一些推测。首先,我们得明确一下“当年”是指哪个时间段。很多人想到《哆啦A.............
  • 回答
    .......
  • 回答
    .......
  • 回答
    要聊《原神》七国出完之后能不能算“传统意义上的3A”,咱们得先掰扯清楚啥叫“传统意义上的3A”。这玩意儿不是官方认证的什么头衔,更多是玩家圈子里大家约定俗成的说法,它背后代表的往往是游戏质量、规模、投入以及给玩家带来的体验。首先,得说说“3A”的几个核心要素,看看《原神》在哪些方面已经触及,或者未来.............
  • 回答
    在我看来,关于您提出的这个问题,情况比较微妙,不能简单地说“符合主动投案减轻处罚”。这里面需要我们仔细掰扯一下《治安管理处罚法》中关于“主动投案”的规定,以及实际操作中的一些考量。首先,咱们得明确一点,《治安管理处罚法》里提到的“主动投案”,它本身就是一种能够影响处罚力度的情节,通常来说,如果符合条.............
  • 回答
    .......
  • 回答
    这是一个非常深刻且重要的问题,触及了现代社会最核心的议题之一:数据主权。算法确实离不开大数据,而大数据的基础正是我们每一个人在数字世界留下的痕迹。因此,“我们是不是应该拥有主导数据的权利?” 这个问题的答案,在道德、法律和技术层面都值得深入探讨。一、 问题的根源:我们是谁,以及数据如何与我们关联首先.............
  • 回答
    选择一本优秀的算法书是踏上算法学习之旅的关键一步。一本好的算法书不仅能帮助你理解枯燥的概念,更能激发你的学习兴趣,培养解决问题的能力。下面我将从多个维度为你详细讲解如何选择算法书:一、明确你的学习目标和基础:这是选择算法书最重要的一步。在开始挑选之前,问自己几个问题: 你的编程语言偏好? (C+.............
  • 回答
    作为算法工程师,尤其是在负责算法策略制定和优化时,我们常常会面临一个绕不开的挑战:不确定性。这就像在浓雾中航行,你知道目标在那里,但前进的路充满了未知。尤其是在策略上线后,如果效果不如预期,甚至出现负面影响,那么随之而来的绩效考核和职业发展问题,更是让我们感到压力山大。那么,面对这种“没效果”的风险.............
  • 回答
    算法竞赛中的数论训练,就像在迷宫里寻找宝藏,每一步都需要扎实的理论基础和巧妙的计算技巧。要想在这片领域游刃有余,就得循序渐进,把基础打牢,然后逐步攻克难题。第一步:夯实基础,筑牢地基 核心概念的理解: 整除与模运算: 这是数论的基石,要深刻理解 $a pmod{m}$ 的含义,以及整.............
  • 回答
    算法岗位的招聘门槛,尤其是在大厂和研究机构,确实让不少求职者感到焦虑。很多人觉得“没有顶会就别想进”,这话虽然有点绝对,但背后折射出的确实是当下算法岗位对求职者硬实力,特别是科研能力的极高要求。顶会,为什么这么重要?首先,我们需要理解为什么顶会论文会被如此看重。 技术实力的直接证明: 顶会(如 .............
  • 回答
    算法工程师的“落地能力”,这可不是一句空洞的“会调参”就能概括的。它是一个工程师真正能把脑袋里的模型、想法,变成实实在在能运行、能产生价值的东西的能力的总和。用大白话说,就是能把算法从纸面、从notebook里,真正变成一部能稳定运转、能解决实际问题的机器。这能力涵盖的维度非常广,绝不是只懂模型架构.............
  • 回答
    好,我们来深入探讨一下有向图强连通分量的求解算法(Kosaraju算法)以及你提出的那个修改方案的错误之处。Kosaraju算法是求解有向图强连通分量的经典算法之一,它的核心思想是利用两次深度优先搜索(DFS)以及图的转置(反向图)。Kosaraju算法的步骤详解:1. 第一次DFS(在原图上):.............
  • 回答
    作为一个算法工程师,你是否应该持续阅读论文?这是一个非常值得深思的问题,而且答案绝对不是简单的“是”或“否”。我认为,持续阅读论文是算法工程师职业生涯中一个极其重要但又需要策略性对待的环节,它关乎你的技术深度、广度以及未来的发展潜力。我们先来抛开AI的痕迹,像一个真实的、有经验的同行一样,掰开了揉碎.............
  • 回答
    这年头,算法岗的风口好像真的有点变了。曾经风光无限,现在听到的更多是“诸神黄昏”和“内卷”。对于很多想入行或者已经在算法领域摸爬滚打的初级从业者来说,这无疑是个让人焦虑的问题:我的路在哪里?我该怎么选?别急,我们先冷静下来,看看现在这个“诸神黄昏”和“内卷”到底是怎么回事,再聊聊我们该怎么在这个新局.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有