Функция для первого совпадения во вложенном массиве

Каков наилучший способ поиска для такого вложенного массива по первому появлению 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

Другие вопросы по тегам