嵌套数组中第一次匹配的函数

时间:2018-06-08 17:26:13

标签: apl

在每个向量中首次出现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的索引位置或者如果一个10项阵列不存在,则为0。

2 个答案:

答案 0 :(得分: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毫秒)

答案 1 :(得分:1)

我不确定最好的方法,但如果每个向量只有少量元素(少于一千),我怀疑搜索整个向量是一个问题。

这是Dyalog APL中的dfn,它返回向量中第一个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}如果等于len+1

,则设为0