使用排序查找列表中最接近的两个数字

时间:2016-04-25 02:24:27

标签: python-2.7 sorting closest-points

如果给出一个整数/浮点数列表,我如何使用排序找到最接近的两个数字?

3 个答案:

答案 0 :(得分:1)

这样的方法会做你想要的:

>>> def minDistance(lst):
    lst = sorted(lst)
    index = -1
    distance = max(lst) - min(lst)
    for i in range(len(lst)-1):
        if lst[i+1] - lst[i] < distance:
            distance = lst[i+1] - lst[i] 
            index = i
    for i in range(len(lst)-1):
        if lst[i+1] - lst[i] == distance:
            print lst[i],lst[i+1]

在第一个for循环中,我们找出最小距离,在第二个循环中,我们打印具有此距离的所有对。工作如下:

>>> lst = (1,2,3,6,12,9,1.4,145,12,83,53,12,3.4,2,7.5)
>>> minDistance(lst)
2 2
12 12
12 12
>>> 

答案 1 :(得分:0)

这可能不止一种可能性。考虑这个列表

[0,1, 20, 25, 30, 200, 201]

[0,1]和[200,201]最接近。

答案 2 :(得分:0)

何塞有一个有效的观点。但是,您可以只考虑这些情况并且不关心返回其中一种情况。

我不认为你需要一种排序算法,但也许只是一种“冠军”#39;像这样的算法:

def smallestDistance(self, arr):
    championI = -1
    championJ = -1
    champDistance = sys.maxint
    i = 0
    while i < arr.length:
        j = i + 1
        while j < arr.length:
            if math.fabs(arr[i] - arr[j]) < champDistance:
                championI = i
                championJ = j
                champDistance = math.fabs(arr[i] - arr[j])
            j += 1
        i += 1
    r = [arr[championI], arr[championJ]]
    return r

此函数将返回一个子数组,其中两个值最接近。请注意,这仅适用于给定至少两个long的数组。否则,你会抛出一些错误。

我认为称为冒泡排序的流行排序算法可以做得很好。如果这种事情对你很重要,可能会在O(n^2)时间运行......

这是基于按整数大小排序数组的标准冒泡排序。

 def bubblesort( A ):
  for i in range( len( A ) ):
    for k in range( len( A ) - 1, i, -1 ):
      if ( A[k] < A[k - 1] ):
        swap( A, k, k - 1 )

def swap( A, x, y ):
  tmp = A[x]
  A[x] = A[y]
  A[y] = tmp

如果您坚持使用排序算法执行此操作,则可以稍微修改算法以适合您的目的。但是,我认为初始功能也有效......

希望有所帮助。