Предположим, у меня есть два списка, один - текст 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 - время выполнения операции пересечения.
Однако, субквадратичный алгоритм все еще предпочтителен на тот случай, если кто-то дал огромный текстовый файл.