x-.y А как насчет пересечения?

#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 была проделана некоторая работа, чтобы исправить эту проблему.)

Возможно, это разочаровывает, но практично.