查看一组值是否出现在数组中的有效方法?

时间:2015-04-14 15:38:54

标签: arrays algorithm fortran

我正在尝试检查整数的一维数组 A 是否包含,在每个大小(A)位置,是否包含任何元素整数集合 S (也是一维数组),一般情况为 size(S)> 1

简单明了的方法是执行以下嵌套循环:

DO i = 1, size(A)
   DO j = 1, size(S)
        IF(A(i) == S(j)) ** do something **
   ENDDO 
ENDDO

问题在于,对于大型阵列 A S ,此过程效率非常低。是否有一个内在的FORTRAN子例程或函数可以更快地执行此操作?还是其他方法?

我尝试过以下操作,但它不想编译:

DO i = 1, NNODES
   IF(A(i) == ANY(S)) ** do something **
ENDDO

出现的错误消息如下:“error #6362: The data types of the argument(s) are invalid.”我正在使用VS2010和Intel Parallel Studio 2013。

2 个答案:

答案 0 :(得分:5)

表达式

A(i) == ANY(S)

lhs 上有一个整数, rhs 上有一个逻辑。对于那些在Fortran中作为可比类型的人来说,我们没有那种C风格的废话,非常感谢你。实际上,它比这更糟糕,any返回一个逻辑但在输入上获取一个逻辑数组,因此any(array_of_int)将无法编译。

你可以尝试

ANY(S==A(i))

代替。这应该会给你一个可编译的解决方案。

现在,至于效率,你的第一个片段是O(n^2)。你可以渐渐地做得更好。对两个数组进行排序并将它们串联扫描,即O(n + n log n)或类似的东西。如果您需要帮助编写代码,请更新您的问题,但我怀疑它已经在SO上被询问和回答。

我强烈怀疑,你可以检查你是否在乎,在单个(显式)循环中使用any也是O(n^2) - 因为any必须操作最常见的情况我看不到扫描数组的任何现实替代方案 - 换句话说是另一个循环。

答案 1 :(得分:0)

除了高性能标记的回答,当您扫描已排序的数组时,您可以并且应该使用二进制搜索算法。