在每个向量中首次出现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。
答案 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