我正在尝试检查整数的一维数组 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。
答案 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)
除了高性能标记的回答,当您扫描已排序的数组时,您可以并且应该使用二进制搜索算法。