📌  相关文章
📜  Python |根据绝对差对数组排序

📅  最后修改于: 2021-04-26 06:45:15             🧑  作者: Mango

给定N个不同的元件的阵列和多个缬氨酸,根据与val中的绝对差重新排列的数组元素,即,具有最小元素差至上等。同样,在两个或更多元素具有相同差异的情况下,应保持数组元素的顺序。

例子:

方法:通常, Python的字典只能保存一个与键对应的值。但是在这个问题中,我们可能必须为一个特定的键存储多个值。显然,不能使用简单的字典,我们需要像C++中的multimap这样的东西。因此,这里使用Default字典,它在Python用作Multimap。以下是解决问题的步骤。

  • 将值存储在字典中,其中key是’val’和数组元素之间的绝对差(即abs(val-a [i])),而值是数组元素(即a [i])
  • 在multiimap中,值已经按照关键字进行了排序,因为它在内部实现了self-balancing-binary-search-tree。
  • 通过逐一存储字典元素来更新原始数组的值。

下面是上述方法的实现。

# Python program to sort the array
# according to a value val 
  
# Using Default dictionary (works as Multimap in Python)
from collections import defaultdict
def rearrange(a, n, val):
     # initialize Default dictionary
     dict = defaultdict(list)  
       
     # Store values in dictionary (i.e. multimap) where,
     # key: absolute difference between 'val' 
     # and array elements (i.e. abs(val-a[i])) and
     # value: array elements (i.e. a[i])
     for i in range(0, n):
          dict[abs(val-a[i])].append(a[i])
       
     index = 0  
       
     # Update the values of original array 
     # by storing the dictionary elements one by one
     for i in dict:
           
          pos = 0
          while (pos
输出:
7 4 8 2 12 0

时间复杂度: O(N * Log N)
辅助空间: O(N)

替代方法:使用大小为n * 2的二维矩阵将绝对差和索引存储在(i,0)和(i,1)处。对二维矩阵进行排序。根据内置的矩阵属性,将根据第一个元素对矩阵进行排序,如果第一个元素相同,则将根据第二个元素对矩阵进行排序。获取索引并相应地打印数组元素。

下面是上述方法的实现。

def printsorted(a, n, val):
      
    # declare a 2-D matrix 
    b =[[0 for x in range(2)] for y in range(n)]
      
    for i in range(0, n): 
        b[i][0] = abs(a[i]-val) 
        b[i][1] = i
          
      
    b.sort() 
      
    for i in range(0, n): 
        print a[b[i][1]],
      
          
      
a = [7, 12, 2, 4, 8, 0]
n = len(a) 
val = 6
printsorted(a, n, val) 
输出:
7 4 8 2 12 0

时间复杂度: O(N * Log N)
辅助空间: O(N)