3

我正在使用 Intel 的 Visual Fortran Composer XE 2011, 12.1.3537.2010 并且看起来findloc不支持内部函数(在 2008 fortran 中型扩展中添加)。

我想要做的是在数组中查找特定值并返回索引。大多数情况下,我使用小型数组。

我有两个问题:

  1. 我想用这个功能替换线性和二进制搜索,当我在其他线程中阅读时,不清楚哪种算法更适合获得最佳性能。内在函数如何处理这个问题?
  2. 由于我的编译器不支持此功能,因此模拟的方法findloc如下:

    minloc( (array-value)**2 )
    

    但是……性能呢?还有其他想法吗?

4

2 回答 2

5

如果我正确理解您的第一个问题,您想知道尚未实现的功能是如何实现的?具体来说,您想知道findloc与线性和二分搜索相比的性能特征,因为您可能已经自己实现了它们?语言标准中肯定没有任何内容规定如何实现该功能,因此您的问题的答案完全是编译器特定的。

至于你的第二个问题,我希望大多数编译器会创建一个临时数组来响应你的表达式array-value。创建这样一个临时的很可能是一个比较耗时的操作,并且会增加调用的执行时间minlocminloc我不知道英特尔的实现是如何工作的,但我希望它是对阵列的线性扫描。内部函数无法知道数组已排序并且二进制搜索可能更快。

如果您的数组很小且未排序,我希望线性搜索是最快的选择。如果它们很小且已排序,您可能可以编写二进制搜索(或类似的)以优于线性搜索。我希望这两种方法的性能图会有一个交叉,这个交叉位于你对小尺寸的想法我不知道的地方。

但是,与性能问题一样,我(或其他任何人)认为是无用的,数据就是您需要的,您为什么不继续进行一些测量?

于 2013-02-18T12:19:06.290 回答
0

如果您关心性能,无论如何都要编写自己的,可能是多线程版本。minloc解决方法是众所周知的,已在 上讨论过多次,comp.lang.fortran但如果您想要性能,它对您确实不利。舍入或溢出也可能存在问题。

如果您有一个通用数组,则必须线性遍历它,如果它已排序且很大,则可以使用二进制搜索(但请注意,每次比较通常具有更大的开销)。

于 2013-02-18T12:18:25.973 回答