Python 寻找最小差异
我有一个数组A=[a1,a2,a3,a4,a5…],我想找到数组的两个元素,比如A[I]和A[j],这样I小于j,A[j]-A[I]最小 此代码是否可以执行此任务: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
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 useminDif=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)