假设我有两个列表,一个是文本t
,一个是字符列表c
。我想计算每个字符在文本中出现的次数。
这可以通过以下 APL 代码轻松完成。
+⌿t∘.=c
然而它很慢。它取外积,然后对每一列求和。
这是一个 O(nm) 算法,其中 n 和 m 是 和 的t
大小c
。
当然,我可以在 APL 中编写一个程序程序,t
逐个字符读取并在 O(n+m) 中解决这个问题(假设完美散列)。
有没有办法在没有循环(或条件)的情况下在 APL 中更快地做到这一点?我也接受 J 中的解决方案。
编辑: 实际上,我这样做是因为文本比字符列表短得多(字符是非 ascii)。我正在考虑文本长度为 20 且字符列表长度为数千的位置。
鉴于 n 小于 m ,有一个简单的优化。
w ← (∪t)∩c
f ← +⌿t∘.=w
r ← (⍴c)⍴0
r[c⍳w] ← f
r
w 仅包含 t 中的字符,因此表大小仅取决于 t 而不是 c。该算法在 O(n^2+m log m) 中运行。其中 m log m 是进行交叉操作的时间。
但是,以防万一有人给出一个巨大的文本文件,仍然首选二次算法。