APL 中扫描算子的时空复杂度是多少?

2024-01-07

通常scan,左变体和右变体,在空间和时间上都是 O(n)。不过,APL 似乎\运算符就像scanl但似乎表现不同,因为它是右关联的并且每次都在数组上运行,使其成为 O(n^2)。

例如,

nums ← 10?10  ⍝ 1 7 4 5 10 3 9 6 2 8
⌈\nums        ⍝ 1 7 7 7 10 10 10 10 10 10

给了我正确的行为,但根据右关联性相当于

(1 f (7 f (4 f (5 f (10 f (3 f (9 f (6 f (2 f 8)))))))))     ⍝ where f ← (⊣,⌈)

所以最后一个操作是1 f (7 7 7 10 10 10 10 10 10)

这不是效率低下吗?这里实际的大 O 复杂度是多少和/或是否有一些惯用的优化?


你的算法描述 Scan 是正确的,在一般情况下,它确实是 O(N²) 。然而,到目前为止,它最常见的用途是与一组已知的标量基元(包括+, , , , , <, , )。这些由解释器识别,然后解释器使用特殊的代码 O(n)(或更少,因为它们可能会提前离开)代码。

我们可以通过比较性能来轻松证明这一点+与功能相同的+∘⊢(另外,正确的参数由恒等函数预处理):

      'cmpx'⎕CY'dfns'
      a←?2000⍴127
      cmpx'+∘⊢\a'
1.8E¯1
      a←?4000⍴127
      cmpx'+∘⊢\a'
7.6E¯1

我们可以看到+∘⊢\当我们将小整数的数量从 2000 增加到 4000 时,花费了大约 4 倍的时间 (0.2 s → 0.8 s)。然而:

      a←?2000⍴127
      cmpx'+\a'
1.5E¯6
      a←?4000⍴127
      cmpx'+\a'
2.9E¯6

+\当从 2000 到 4000 个小整数时,仅加倍(15 ms → 29 ms)。另请注意优化情况和非优化情况之间的极端性能差异。

Scan 从Reduce 获取其评估顺序。Iverson https://apl.wiki/Ken_Iverson解释在评估顺序约定 https://www.jsoftware.com/papers/EvalOrder.htm:

  1. 在定义中
    
       F/x ≡ x1 F x2 F x3 F ... F x⍴x  
    从右到左约定比从左到右约定为非关联函数 F 提供了更有用的定义。例如,-/x表示各分量的交替和x,而在从左到右的约定中,它将表示第一个分量减去其余分量的总和。因此如果d是表示数字的十进制数字的向量n,那么表达式的值0=9|+/d决定了可分性n by 9;在从右到左的约定中,类似的表达式0=11|-/d确定整除性11 .
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APL 中扫描算子的时空复杂度是多少? 的相关文章

  • 确定两个未排序的数组是否相同?

    给定两个unsorted arrays A and B具有不同的元素 确定是否A and B可以重新排列 使它们相同 我的策略如下 首先 使用确定性选择算法O N 是时候找到Max of A and Max of B 如果他们没有相同的Ma
  • 时间复杂度:删除双端队列的元素

    删除一个元素的时间复杂度是多少collections deque E g deq collections deque 1 2 3 del deq 1 Summary 时间复杂度为 O n 其中 n 是到最近端点的距离 总尺寸为deque不要
  • 时间复杂度 嵌套循环 内循环 + 外循环

    谁能解释一下这个算法的时间复杂度是多少 for i 1 i lt n i for j 1 j lt n j i note not j printf Iteration d d n i j The printf在内循环中称为exactly c
  • Ruby 方法的大 O 表示法?

    如何找到 Ruby 方法的复杂度 例如length http www ruby doc org core 2 1 2 Array html 如果我查看源代码 我会看到以下内容 static VALUE rb ary length VALUE
  • 这三个for循环的复杂度是多少?

    Having 输入数组A 1 n N的长度A 算法 for int i N i gt 0 i Loop 1 for int j 1 j
  • 行列反转所形成的矩阵左上象限的最大和

    我正在研究一个 HackerRank 问题 该问题在反转行和列后找到 2N x 2N 矩阵的左上象限中元素的最大总和 例如 如果矩阵是 M 112 42 83 119 56 125 56 49 15 78 101 43 62 98 114
  • 幂集生成函数的时间复杂度

    我试图计算出我编写的函数的时间复杂度 它生成一个电源组 http en wikipedia org wiki Power set对于给定的字符串 public static HashSet
  • 对于超过 64 个字符的字符串,什么会影响 Python 字符串比较性能?

    我正在尝试评估比较两个字符串是否会随着长度的增加而变慢 我的计算表明比较字符串应该花费摊销常数时间 但我的 Python 实验产生了奇怪的结果 这是字符串长度 1 到 400 与时间 以毫秒为单位 的关系图 自动垃圾收集已禁用 并且gc c
  • 查找两个字符串之间的公共子串

    我想比较两个字符串并保留匹配的字符串 在比较失败的地方分开 所以如果我有 2 个字符串 string1 apples string2 appleses answer apples 另一个例子 因为字符串可能有多个单词 string1 app
  • 层序遍历的时间复杂度

    二叉树层次顺序遍历的时间复杂度是多少 是 O n 还是 O log n void levelorder Node n queue lt Node gt q q enqueue n while q empty Node node q fron
  • 如何找到Python中内置函数的复杂度

    我有问题的特殊情况 但很高兴知道它是否适用于任何函数 所以我想找到字符串中子字符串的位置 好的 在Python中有一个查找方法 https docs python org 2 library string html string find这
  • 深度优先图算法的时间复杂度[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始学习时间复杂度 并且我在示例中查找了一些简单排序的时间复杂度 我想知道如何计算图中深度优先搜索的平均时间复杂度 V n and E
  • C++ 3sum 复杂度

    我试图解决cpp中的3和问题 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 class Solution public vector
  • 查找数组长度的时间复杂度

    我对时间复杂度有点困惑len 函数将是 我读过很多不同的文章 在 python 中查找数组的长度是O 1 与len 函数和其他语言类似 这怎么可能 您是否不必遍历整个数组来计算它占用了多少个索引 您是否不必遍历整个数组来计算它占用了多少个索
  • 如何在 O(1) 时间内将数组归零?

    有没有一种方法可以将数组归零 时间复杂度为 O 1 很明显 这可以通过for loop memset来完成 但它们的时间复杂度不是O 1 Yes 但不是任何数组 它需要一个专门为此工作而设计的数组 template
  • 检查一个列表是否是另一个可处理重复项的列表的轮换

    我有这个函数来确定一个列表是否是另一个列表的旋转 def isRotation a b if len a len b return False c b 2 i 0 while a 0 c i i 1 for x in a if x c i
  • Java TreeMap时间复杂度-lowerKey

    时间复杂度是多少lowerKey Java实现中的操作TreeMap 我认为它是 log n 但我在文档中找不到它 更基本操作的复杂性已有详细记录 此实现提供了有保证的 log n 时间成本 containsKey 获取 放置和删除操作 顺
  • for循环内递归函数的时间复杂度

    如果我们有一个函数 int x 0 int fun int n if n 0 return 1 for int i 0 i
  • 除法的时间复杂度是多少?

    我使用除法算法 根据https en wikipedia org wiki Computational complexity of mathematical operations https en wikipedia org wiki Co
  • 大 O 和等号,滥用符号

    维基百科说 http en wikipedia org wiki Big O notation Matters of notation 上面定义的语句 f x is O g x 通常写为 f x O g x 有些人认为这是对符号的滥用 因为

随机推荐