Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 寻找最小差异_Python_Arrays_Algorithm_Sorting_Minimum - Fatal编程技术网

Python 寻找最小差异

Python 寻找最小差异,python,arrays,algorithm,sorting,minimum,Python,Arrays,Algorithm,Sorting,Minimum,我有一个数组A=[a1,a2,a3,a4,a5…],我想找到数组的两个元素,比如A[I]和A[j],这样I小于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: Sm

我有一个数组A=[a1,a2,a3,a4,a5…],我想找到数组的两个元素,比如A[I]和A[j],这样I小于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
def FindDifference(A):
未排序=[]
minDiff=1000000
未排序=A
排序=快速排序(A)
对于范围(0,len(排序))中的i:
如果i>=1:
SmallElement=已排序[i-1]
indexOfSmaller=未排序的索引(SmallElement)
BigElement=已排序的[i]
indexOfBig=未排序的索引(BigElement)

如果indexOfSmaller不确定为什么排序。您可以修改这个伪代码

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
表示i=0;i<数组长度;我++
对于j=i+1;j
您的代码可以稍微更新一下:

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))
a=[1,2,5,9,10,20,21,45]
a、 大小=已排序(a),长度(a)
res=[a[i+1]-如果i+1

简言之,查找最小或最大差异可以简化为获取列表中的最小/最大元素,该列表由排序后的原始值列表中每对元素的差异组成

这是另一种方法,使用更多的可编辑项,更多地依赖默认值:

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)),
    ))
使用配方:


我想你可以通过测试代码来回答你自己的问题。旁白:很难说(格式自那以后就被编辑了),但是你的缩进在我看来很奇怪,这有时是原始代码中混合了制表符和空格的迹象。您可能需要使用
python-tt your_program\u name.py
运行代码,以检查空格是否不一致,以防万一。@Blender您对算法的正确性有何想法?@user220595 use
minDif=float('inf')
。检查
.index()
的开销为O(N),因此对于大列表,您的算法会非常慢。O(n^2)我相信。也请使用小写变量名。此外,根据您的快速排序实现,您的算法可能会更慢,但我不确定他是否希望获得正的最小差异。差异不一定是正的,但运行时必须是O(nlog(n))而不是O(n^2)。我的方法在O(nlog(n))运行时会给出正确的答案吗?这是一个很好的观点,我现在还不清楚,在一家餐馆里,我一直在喝酒:),但这看起来是一个进行大量单元测试的好例子。如果你的方法是正确的,它看起来确实是O(n*log(n))@DavidWilliams,它不是O(n log(n))。看我上面的评论,这似乎很好,但我的方法在O(nlog(n))运行时会给出正确的答案吗?
>>> 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)