Python 降低时间复杂性:查找列表中元素之间的最小差异

Python 降低时间复杂性:查找列表中元素之间的最小差异,python,arrays,list,Python,Arrays,List,我的目标是找到列表中任意两个元素之间的最小差异。我写了下面的代码,但我想知道在时间复杂度方面是否有更有效的方法 def最小绝对差异(arr): arr.sort() 最小差值=abs(arr[0]-arr[1]) 对于范围内的i(len(arr)): 对于范围(i+1,len(arr))内的j: 如果abs(arr[i]-arr[j])。我们开始比较2和3。一旦我们比较它们,我们就不必比较2和5,因为它们之间的差异总是大于相邻元素。类似地,我们只比较3和5,而不比较3和8或任何其他元素与3

我的目标是找到列表中任意两个元素之间的最小差异。我写了下面的代码,但我想知道在时间复杂度方面是否有更有效的方法

def最小绝对差异(arr):
arr.sort()
最小差值=abs(arr[0]-arr[1])
对于范围内的i(len(arr)):
对于范围(i+1,len(arr))内的j:
如果abs(arr[i]-arr[j])
事实上,如果仔细观察,您会发现排序列表后不需要使用两个循环。您可以通过以下方式直接执行-

def minimumAbsoluteDifference(arr):
    arr.sort()
    min_diff = 10**10       #Initilising to an huge value
    for i in range(len(arr)-1):
        if arr[i+1] - arr[i] < min_diff: 
            min_diff = arr[i+1] - arr[i] 
    return min_dif
def最小绝对差异(arr):
arr.sort()
最小差异=10**10#初始值很大
对于范围内的i(len(arr)-1):
如果arr[i+1]-arr[i]

它是如何工作的-
  • 对列表排序后,最小绝对差异的潜在候选元素仅为相邻元素

  • 一旦从相邻元素移开,绝对差值必然会增大

  • 对于EG,考虑排序列表为“代码> LST= [2,3,5,8,15] < /代码>。我们开始比较2和3。一旦我们比较它们,我们就不必比较2和5,因为它们之间的差异总是大于相邻元素。类似地,我们只比较
    3和5
    ,而不比较
    3和8
    或任何其他元素与3


因此,这种改进的解决方案将在
O(nLogn)
时间复杂度下工作,这比使用2个循环
O(n^2)
更快


希望这有帮助

一旦有了排序数组,就不需要扫描所有对:显然,元素i和元素i+1之间的差异将小于或等于(i,i+2)元素之间的差异。 更快的方法是检查每两个相邻元素之间的差异:

def最小绝对差异(arr):
#假设:数组中有多个元素
arr.sort()
最小差值=arr[1]-arr[0]
对于范围(1,len(arr))中的i:
电流差=arr[i]-arr[i-1]
最小差值=最小值(最小差值,当前差值)
返回最小差值
遍历数组,该数组是
O(n)
。每次此代码选择当前差异和迄今为止发现的最小差异之间的最小值。
arr.sort
take
O(nlogn)
,因此总时间复杂度为
O(nlogn)
。您的原始代码需要O(n^2)

执行此操作的最短方法:

def minimumAbsoluteDifference(arr):
    arr.sort()
    min_diff = float('inf')                               # initiating with infinity value
    for i in range(2, len(arr)):                          # start from the second element
        min_diff = min(min_diff, abs(arr[i] - arr[i-1]))  # use the built-in minimum python method 
    return min_dif

想想哪对数字是真正的候选答案。例如,在对(4,6)、(4,10)和(4,12)中,这些都是可能产生最小绝对差的势对吗?为什么?KevinWang我包括了
arr=list(set(arr))
,我试图通过用I+1替换j来删除j的第二个for循环,但由于索引超出范围而被卡住了谢谢你的帮助,它成功了。我只有一个问题,这会不会遗漏最后一对?我循环到
len(arr)-1
,因为我们正在比较
arr[I+1]
arr[I]
。最后一次比较是
arr[len(arr)-2]
arr[len(arr)-1]
。所以没有一对会错过好的,明白了。谢谢