基本运算中算法复杂性的符号

计算科学 算法 复杂
2021-12-07 08:55:03

我正在比较几种用于实时计算的算法(矩和矩阵乘积)在基本运算中的数值复杂性方面。

[编辑] 算法在循环和操作方面非常相似。所有操作都以标量方式(不是矩阵/向量积)执行,元素存储在查找表中或动态计算。假设我想检查算法 1 是否使用了比算法 2 更多的运算。我将只考虑加法(或减法)、乘法和非整数求幂。

到目前为止,我已将运算分为三类:和/差、乘积和非整数幂: (+,),(×)(^). 我对渐近不感兴趣,例如我没有使用朗道符号O().

[编辑] 例如,如果算法 1 和 2 有 [n2 (+,)/2n2 (×)] 和 [n3 (+,)/3n2 (×)] 分别,我可以说算法 1 似乎更有效。

  1. 这三个类是否足以进行基本比较,假设正负相同的复杂性仍然有意义吗?
  2. 例如,我是否应该包含循环指标?或者它是否非常依赖软件/硬件,以至于这种算法复杂性变得毫无价值?
  3. 什么是一个很好的紧凑符号?为了ax0.3+by0.7,我正在考虑类似的事情:
    (1+,2×,2^)
1个回答

几十年前,您使用的类别很有意义,当时浮点运算与处理器所做的所有其他类型的事情相比非常昂贵。但它们不再是:例如,今天的浮点加法和乘法只需要几个时钟周期,因此不会比整数运算长很多,例如执行循环索引递增或循环开始或结束时的跳转; 并且浮点操作比从内存加载数据花费的时间要少得多(一个数量级或更多),特别是如果该数据不在缓存中。

因此,仅使用您在帖子中计数的度量就无法再充分衡量算法的性能。举一个我最近遇到的例子,我的合作者 Martin Kronbichler 测量了简单操作(例如两个之间的点积)所花费的时间(或者更确切地说,是内存带宽,这是倒数,由数据量标准化)向量。如果您的措施是相关的,您将得到一条恒定线(因为每个向量元素的操作数是恒定的)。但实际上,这些曲线与水平线相去甚远。看看这里看例子:https ://github.com/dealii/dealii/pull/2517