algorithm - Efficient way to see if a set of values appear in an array? -
i'm trying check if 1d array of integers a contains or not, @ every 1 of it's size(a) positions, of elements of set of integers s (also 1d array), general case of size(s) > 1.
the easy , obvious way following nested loop:
do = 1, size(a) j = 1, size(s) if(a(i) == s(j)) ** ** enddo enddo
the problem that, large arrays a , s, process inefficient. there intrinsic fortran subroutine or function faster? or other method?
i've tried following, doesn't want compile:
do = 1, nnodes if(a(i) == any(s)) ** ** enddo
the error message appears following: "error #6362: data types of argument(s) invalid.
" i'm using vs2010 intel parallel studio 2013.
the expression
a(i) == any(s)
has integer on lhs , logical on rhs. we'll have none of c-inspired nonsense of regarding comparable types in fortran thank much. actually, it's worse that, any
returns logical takes array of logicals on input, any(array_of_int)
won't compile.
you try
any(s==a(i))
instead. should give compilable solution.
now, efficiency, you're first snippet o(n^2)
. can better, asymptotically. sort both arrays , scan them in tandem, o(n + n log n)
or similar. if need coding up, update question, though suspect it's been asked , answered here on so.
i suspect, , can check if care to, using any
inside single (explicit) loop o(n^2)
-- since any
has operate on general cases can't see realistic alternative scanning array -- loop in other words.
Comments
Post a Comment