#j
#j
Вопрос:
x-.y
включает все элементы x, за исключением тех, которые являются ячейками y
Но что, если я хочу получить все элементы, которые являются ячейками x и y?
Я могу добиться этого с помощью
x -.^:2 y
Но это требует выполнения дорогостоящей операции дважды.
Есть ли лучшее решение?
Комментарии:
1. Выполнение
-.
дважды обходится недешево.-.
довольно эффективно.
Ответ №1:
e.
часто полезно при работе с наборами.
x e. y
выдает список совпадений:
для каждого элемента x возвращайте,
1
если он существует в «наборе» y,0
в противном случае.
1 2 3 4 e. 5 9 2
0 1 0 0
Тогда,
x (e. # [) y
выбирает те элементы, которые действительно существуют в обоих списках.
1 2 3 4 (e. # [) 5 9 2
2
5 8 (e. # [) i.12
5 8
Комментарии:
1.
-.^:2
кстати, кажется более эффективным.
Ответ №2:
Выполнение -.
дважды — классический способ реализации пересечения в J.
Неэффективность незначительна (постоянный фактор — и, в общем, вы не должны беспокоиться о проблемах с эффективностью в J, если они не превышают коэффициент 2 — когда у вас проблемы с ресурсами, вы, как правило, захотите сосредоточиться на факторе 1000 или более проблем).
Иными словами, если ([-.-.)
or -.^:2
слишком медленный для вас, то -.
он также будет слишком медленным для вас. (Это может произойти на чрезвычайно больших наборах данных, где базовая реализация была неэффективной. В последних версиях J была проделана некоторая работа, чтобы исправить эту проблему.)
Возможно, это разочаровывает, но практично.