我正在使用英特尔的Visual Fortran Composer XE 2011,12.1.3537.2010,并且看起来不支持内部findloc
功能(在2008 fortran中型扩展中添加)。
我想要做的是在数组中查找特定值并返回索引。我主要使用小尺寸阵列。
我有两个问题:
由于我的编译器不支持,因此模拟findloc
的方法如下:
minloc( (array-value)**2 )
但是......表现怎么样?还有其他想法吗?
答案 0 :(得分:4)
如果我理解你的第一个问题,你想知道一个尚未实现的功能是如何实现的?具体来说,您想知道findloc
与线性和二进制搜索相比的性能特征,因为您可能已经自己实现了它们?当然,语言标准中没有任何内容要求如何实现该功能,因此您的问题的答案完全取决于编译器。
至于你的第二个问题,我希望大多数编译器能够创建一个临时数组来响应你的表达式array-value
。创建这样的临时操作可能是一个相对耗时的操作,并且会被添加到对minloc
的调用的执行时间中。英特尔minloc
的实现如何工作我不知道,但我希望它是通过阵列的线性扫描。内部函数无法知道数组是否已排序且二进制搜索可能更快。
如果您的阵列很小且未分类,我希望线性搜索是最快的选择。如果它们很小并且已经排序,您可以编写二进制搜索(或类似)以超越线性搜索。我希望这两种方法的性能图有一个交叉,其中交叉符合小尺寸的想法我没有线索。
然而,与性能问题一样,我(或任何其他人)认为无用,数据是您需要的,为什么不继续进行测量呢?
答案 1 :(得分:0)
如果您关注性能,请在任何情况下编写自己的,可能是多线程版本。 minloc
解决方法众所周知,已在comp.lang.fortran
上多次讨论,但如果您想要性能,那对您来说真的不好。圆角或溢出也可能存在问题。
如果你有一个通用数组,你必须线性通过它,如果它是有序的和大的,你可以使用二进制搜索(但请注意,它通常每次比较的开销更大)。