首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在整数数组中找到使abs(v[i]-v[j])最小化的元素对

在整数数组中找到使abs(v[i]-v[j])最小化的元素对
EN

Stack Overflow用户
提问于 2012-03-30 03:29:57
回答 6查看 632关注 0票数 0

假设我们有5个元素的整型数组: 1,2,3,4,5

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

我们需要像这样检查

代码语言:javascript
运行
复制
1-2   2-3  3-4   4-5

1-3   2-4  3-5

1-4   2-5

1-5

并找到这些减法的最小abs值。我们可以用2个for来找到它。问题是,有没有什么算法可以用一个并且只有一个for来求值

EN

回答 6

Stack Overflow用户

发布于 2012-03-30 03:32:49

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

票数 1
EN

Stack Overflow用户

发布于 2012-03-30 03:53:31

证明了最优解是渐近线性O(n) up,直到因子不变。

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

这里有一个这样的O(n)解决方案(如果列表可以就地修改,它也使用O(1)空间):

代码语言:javascript
运行
复制
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是一个线性时间固定宽度整数排序算法,定义如下:

http://en.wikipedia.org/wiki/Radix_sort

其概念是,通过在位位置上将整数划分为一系列固定的遍,来利用它们的固定位宽特性。即在hi位(32位)上划分它们,然后在下一个最高位(31位)上划分它们,然后在下一个位(30位)上划分它们,依此类推-这只需要线性时间。

票数 1
EN

Stack Overflow用户

发布于 2012-03-30 03:48:22

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9932158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档