找到最小的差异

时间:2013-03-25 02:05:04

标签: python arrays algorithm sorting minimum

我有一个数组A = [a1,a2,a3,a4,a5 ...],我想找到数组的两个元素,比如A [i]和A [j],这样我小于j和A [j] -A [i]是最小的。

此代码是否可以完成这项工作:

def findMinDifference(A):
    Unsorted=[]
    minDiff=1000000
    Unsorted=A
    Sorted=quickSort(A)
    for i in range(0,len(Sorted)):
        if i>=1:
         SmallElement=Sorted[i-1]
         indexOfSmaller=Unsorted.index(SmallElement)
         BigElement=Sorted[i]
         indexOfBig=Unsorted.index(BigElement)
        if indexOfSmaller<inexOfBig:
             diff=Sorted[i]-Sorted[i-1]
             if diff<minDiff:
                 minDiff=diff
    return minDiff

4 个答案:

答案 0 :(得分:2)

您的代码可以稍微更新一下:

a = [1,2,5,9,10,20,21,45]
a, size = sorted(a), len(a)

res = [a[i + 1] - a[i] for i in xrange(size) if i+1 < size]

print "MinDiff: {0}, MaxDiff: {1}.".format(min(res), max(res))

用两个词来说 - 查找min或max diff可以简化为获取列表的min / max元素,该列表由排序的原始值列表中的每对元素的差异组成

答案 1 :(得分:1)

使用itertools pairwise食谱:

>>> from itertools import tee, izip
>>> def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = tee(iterable)
        next(b, None)
        return izip(a, b)

>>> nums = [1, 3, 7, 13, 9, 18, 22]
>>> min(pairwise(sorted(nums)), key=lambda x: x[1] - x[0])
(1, 3)

答案 2 :(得分:0)

不确定为什么排序。您可以调整此伪代码。

for i = 0; i < array.length; i++
    for j = i + 1; j < array.length; j++
        if a[j] - a[i] < min
            min = a[j] - a[i]
 return min

答案 3 :(得分:0)

这是另一种方法,使用更多的迭代和更多依赖于默认值:

from itertools import imap, islice, izip

def find_min_diff(iterable, sort_func=sorted):
    sorted_iterable = sort_func(iterable)
    return min(imap(
        lambda a, b: b - a,
        izip(sorted_iterable, islice(sorted_iterable, 1)),
    ))