2 つのリストがあるとします。1 つはテキストt
、もう 1 つは文字のリストですc
。各文字がテキストに何回出現するかを数えたい。
これは、次の APL コードで簡単に実行できます。
+⌿t∘.=c
ただし遅いです。外積を取り、各列を合計します。
これは、n と m が と のサイズである O(nm) アルゴリズムt
ですc
。
もちろん、t
文字ごとに読み取り、この問題を O(n+m) で解決する手続き型プログラムを APL で作成できます (完全なハッシュを想定)。
ループ(または条件付き)なしで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 は交差操作を実行する時間です。
ただし、誰かが巨大なテキスト ファイルを渡した場合に備えて、サブ 2 次アルゴリズムが引き続き推奨されます。