C++ 在整数数组中查找一对元素,使abs(v[i]-v[j])最小化

C++ 在整数数组中查找一对元素,使abs(v[i]-v[j])最小化,c++,c,arrays,C++,C,Arrays,假设我们有一个包含5个元素的int数组:1,2,3,4,5 我需要做的是找到数组元素减法的最小abs值: 我们需要这样检查 1-2 2-3 3-4 4-5 1-3 2-4 3-5 1-4 2-5 1-5 求出这些减法的最小abs值。我们可以用两个fors找到它。问题是,是否有任何算法可以用一来查找值,并且只用于?对列表进行排序并减去最近的两个元素否,除非您知道列表已排序,否则您需要两个它在for循环中的简单迭代 keep 2 variable "minp

假设我们有一个包含5个元素的int数组:1,2,3,4,5

我需要做的是找到数组元素减法的最小abs值:

我们需要这样检查

1-2   2-3  3-4   4-5

1-3   2-4  3-5

1-4   2-5

1-5

求出这些减法的最小abs值。我们可以用两个fors找到它。问题是,是否有任何算法可以用一来查找值,并且只用于?

对列表进行排序并减去最近的两个元素

否,除非您知道列表已排序,否则您需要两个它在for循环中的简单迭代

       keep 2 variable "minpos and maxpos " and " minneg" and "maxneg"  
       check for the sign of the value you encounter and store maximum positive in maxpos
       and minimum +ve number in "minpos" do the same by checking in if case for number 
       less than zero. Now take the difference of maxpos-minpos in one variable and
       maxneg and minneg in one variable and print the larger of the two . You will get 
       desired.
我相信你一定知道如何在一个for循环中找到max和min

       keep 2 variable "minpos and maxpos " and " minneg" and "maxneg"  
       check for the sign of the value you encounter and store maximum positive in maxpos
       and minimum +ve number in "minpos" do the same by checking in if case for number 
       less than zero. Now take the difference of maxpos-minpos in one variable and
       maxneg and minneg in one variable and print the larger of the two . You will get 
       desired.

这个问题相当于排序。可以使用任何排序算法,最后返回最近元素之间的差值。最后一次传递数据可以用来发现差异,也可以在排序过程中进行维护。在对数据进行排序之前,相邻元素之间的最小差值将是一个上限


因此,要在没有两个循环的情况下进行排序,请使用没有两个循环的排序算法。在某种程度上,它感觉像是语义,但递归排序算法只需一个循环就可以做到这一点。如果这个问题是简单的双循环情况所需的nn+1/2减法,则可以使用对数n算法。

可证明的最佳解决方案在常数因子之前是对称线性的

这意味着所花费的时间与数组中元素的数量成正比,这当然是我们所能做的最好的,因为我们至少必须读取数组中已经花费时间的每个元素

下面是一个这样的On解决方案,如果列表可以修改,它也会使用O1空间:

int mindiff(const vector<int>& v)
{
    IntRadixSort(v.begin(), v.end());

    int best = MAX_INT;

    for (int i = 0; i < v.size()-1; i++)
    {
        int diff = abs(v[i]-v[i+1]);
        if (diff < best)
           best = diff;
    }

    return best;
}
IntRadixSort是一种线性时间固定宽度整数排序算法,定义如下:


其概念是,通过在位位置上的一系列固定过程中对int进行划分,利用int的固定位宽特性。ie在高位第32位对它们进行分区,然后在次高位第31位对它们进行分区,然后在次高位第30位对它们进行分区,依此类推-这只需要线性时间。

这可能会对您有所帮助:

end=4;
subtractmin;
m=0;
for(i=1;i<end;i++){
if(abs(a[m]-a[i+m])<subtractmin)
subtractmin=abs(a[m]-a[i+m];}
if(m<4){
m=m+1
end=end-1;
i=m+2;
}}

你不需要两个fors。查找最大值和最小值,最大值和最小值将获得最大差异。对数组进行排序并查找两个最近的相邻值不是更容易吗?是的。有。但是,因为它看起来像是家庭作业,所以最好自己思考。我100%不明白你在做什么——有没有一个通用的口语术语来描述游戏中的数学?我明白了。然后按照第二条注释对+循环进行排序。在logn上比在*NWhy上好,中间两个。如果对列表进行了排序,则最小差异对仍然可以位于任何位置,但它们将彼此相邻。找到这对需要一个for循环。排序至少需要一个。这比单纯的方法好多少?这有点错误,但这种方法是ongn而不是On^2。此解决方案适用于查找最大差异,但不适用于最小差异。您的更正不起作用。例如{4,5,10}。最大值为10,第二个最大值为5。这不确定4,5是正确的对。这是在试图找到最大差异,问题是最小差异