【问题标题】:C++ - Searching in array from both sidesC ++ - 从两侧搜索数组
【发布时间】:2021-02-14 15:00:42
【问题描述】:

在执行速度方面,第一个循环和第二个循环的速度有什么不同吗?我也在谈论比这个示例更大的数组。

int main()
{
    int n = 17;
    int posz = 7;
    int array[] = {0, 1, 9, 2, 8, 3, 8, 5, 4, 7, 6, 10, 23, 43, 123, 54, 76, 34};
    for (int i = 0; i < (n / 2) + 1; i++)
    {
        if (array[i] == posz || array[n - 1 - i] == posz)
        {
            std::cout << "found\n";
            break;
        }
    }

    for (int i = 0; i < n; i++)
    {
        if (array[i] == posz)
        {
            std::cout << "found\n";
            break;
        }
    }

    return 0;
}

【问题讨论】:

  • 我对此表示怀疑。我猜选项 1 更慢(更多操作)。如果我在代码审查中看到选项 1,您将把它重写为选项 2,因为它更清晰:-)
  • 如果方法 1 更快,std::find 算法函数的实现者会想办法这样编写循环。

标签: c++ arrays search


【解决方案1】:

就 Big-O 时间而言,不,因为这两种方法都是 O(n)。

在第一个循环中,您迭代的次数更少,但每次迭代的计算量更多。在第二个循环中,每次迭代执行较少的计算,但总体上执行更多的迭代。我不希望两者之间有任何巨大的性能差异,如果您单步执行汇编代码,编译器甚至可能会将两者更改为相同。

这还取决于您的 CPU 使用的缓存方案,因为在足够大的数组中,第一个循环可能会缓存两个内存块,而不是第二个只会缓存一个内存块。这可能会对direct-mapped cache 产生不利影响,因为高索引和低索引可能指的是占用同一缓存块的内存位置,因此一个接一个地访问会导致不断的缓存未命中。

在这一点上,这真的取决于你想要完成什么更清楚,所以我推荐循环#2。更不用说,第二种方法更不容易出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2014-06-26
    相关资源
    最近更新 更多