Функция для первого совпадения во вложенном массиве
Каков наилучший способ поиска для такого вложенного массива по первому появлению 2 2 2 в каждом векторе? Есть ли в APL специальные функции, позволяющие избежать поиска по всему вектору?
? 10 / ¨10⍴2
(1 1 2 2 1 1 2 1 1 2) (1 2 1 2 1 1 1 1 1 1) (1 2 1 2 2 2 2 2 2 2) (1 1 2 2 1 1 2 1 1 2) (1 2 1 2 1 1 1 1 1 1) (1 2 1 2 2 2 2 2 2 2) (1 1 2 2 1 1 2 1 1 2) (1 2 1 2 1 1 1 1 1 1) (1 2 1 2 2 2 2 2 2 2) (1 2 1 2 1 1 1 1 1 1)
Позиция индекса для первых 2 2 2 или 0, если отсутствует для массива из 10 элементов.
2 ответа
Как насчет:
firsthit←{(⊃⍸)¨⍺∘⍷¨⍵} ⍝ (first where) each ⍺ found in each ⍵
v←?10000/¨10000⍴2
t←⎕AI[3] ⋄ ≢2 2 2 firsthit v ⋄ ⎕AI[3]-t
10000
666
(Прошло 666 миллисекунд)
Я не уверен в лучшем способе, но если у каждого вектора есть только небольшое количество элементов (менее тысячи), я сомневаюсь, что поиск по всему вектору является проблемой.
Вот DFN в Dyalog APL, который возвращает индекс первого 2 2 2
в векторе, 0
иначе.
{len←≢⍵⋄{⍵×⍵≢len+1}1⍳⍨2 2 2⍷⍵}
Превратить его в решение вашей проблемы так же просто, как придерживаться ¨
в конце, чтобы сделать это для всех векторов.
Объяснение:
len←≢⍵⋄
обозначить длину вектора с len
2 2 2⍷⍵
Найти все экземпляры 2 2 2
1⍳⍨
Получить первый индекс 1
(т.е. индекс, где первый 2 2 2
начинается) возвращаясь len+1
если это не найдено
{⍵×⍵≢len+1}
Установите в 0, если он равен len+1