C++ 为什么只改变循环计数器逻辑时,使用2个嵌套循环O(n^2)复杂度来解决两个和问题的速度要快得多?

C++ 为什么只改变循环计数器逻辑时,使用2个嵌套循环O(n^2)复杂度来解决两个和问题的速度要快得多?,c++,algorithm,localityofreference,C++,Algorithm,Localityofreference,解决这个问题可以使用O(n)复杂度算法来实现,但我刚刚尝试了O(n^2)复杂度,这是一种简单的方法,使用2个嵌套循环来检查每个第I个整数与每个剩余整数的和是否符合目标值,下面是O(n^2)实现,对于这2个实现,nums是整数数组,n是nums的大小,index是一个大小为2的数组,用于保存2个整数的索引 for(int i=0; i<n; ++i) for(int j=i+1; j<n; ++j) { if(nums[i] + nums[j] == target) {

解决这个问题可以使用O(n)复杂度算法来实现,但我刚刚尝试了O(n^2)复杂度,这是一种简单的方法,使用2个嵌套循环来检查每个第I个整数与每个剩余整数的和是否符合目标值,下面是O(n^2)实现,对于这2个实现,nums是整数数组,n是nums的大小,index是一个大小为2的数组,用于保存2个整数的索引

for(int i=0; i<n; ++i)
for(int j=i+1; j<n; ++j) {
    if(nums[i] + nums[j] == target) {
        indices[0] = i; indices[1] = j; return indices;
    }
}

for(int i=0;i一个公平的比较会让两个程序执行到最后,但仍然找不到索引。从外观上看,您是在测试答案存在的情况。当然,在这种情况下,我们搜索答案的顺序非常重要

例如,当唯一的答案是
{n-2,n-1}
时,第一个代码需要O(n^2)操作才能找到它,而第二个代码在O(n)中找到它。要生成的代码:

std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[n - 2] = 1;
num[n - 1] = 1;
std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[0] = 1;
num[n - 1] = 1;
相反,当唯一的答案是
{0,n-1}
时,第一个代码在O(n)中找到它,而第二个代码将执行O(n^2)步骤。要生成的代码:

std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[n - 2] = 1;
num[n - 1] = 1;
std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[0] = 1;
num[n - 1] = 1;

&num[0]
东西是为了确保它能工作,无论
num
是数组还是向量。

一个公平的比较会让两个程序执行到最后,仍然找不到索引。从外观上看,你是在测试答案存在的情况。自然,在这种情况下,我们搜索答案的顺序非常重要

例如,当唯一的答案是
{n-2,n-1}
时,第一个代码需要O(n^2)操作才能找到它,而第二个代码在O(n)中找到它。要生成的代码:

std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[n - 2] = 1;
num[n - 1] = 1;
std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[0] = 1;
num[n - 1] = 1;
相反,当唯一的答案是
{0,n-1}
时,第一个代码在O(n)中找到它,而第二个代码将执行O(n^2)步骤。要生成的代码:

std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[n - 2] = 1;
num[n - 1] = 1;
std::fill (&num[0], &num[0] + n, 0);
target = 2;
num[0] = 1;
num[n - 1] = 1;

&num[0]
的功能是确保无论
num
是一个数组还是一个向量,它都能工作。

如果很少执行
代码,则可能是
。因此,您通常应该使用多个不同的基准(而不仅仅是一个测试用例)来备份您的测量结果。您可以查看生成的代码以了解编译器如何处理代码。这样的网站非常有用,因为您可以同时看到两个变体。请包含输入数据。或者更好的是,提供一个。如果
代码很少执行,则可能是您的
。因此,您通常应该使用多个di备份您的度量值不同的基准(而不仅仅是一个测试用例)。您可以查看生成的代码,以了解编译器如何处理代码。这样的网站非常有用,因为您可以同时查看两个变体。请包含输入数据。或者更好的是,提供一个。是的,正如您所说,这都是关于两个整数的位置。如果没有,它们的运行时几乎相同解决方案。是的,正如你所说,这都是关于2个整数的位置。当没有解决方案时,它们的运行时间几乎相同。