8
votes

Numéro d'inversion optimale sur les tableaux int


8 commentaires

Qu'est-ce qu'une inversion? Je vois le terme décrocher ailleurs en ce qui concerne les tableaux, mais je ne peux pas vraiment glaner le sens.


OK - a trouvé la réponse à ma propre question - pour le tableau A, si un [i]> A [i + j] où J> 0, un [i] et un [j] sont une inversion. Juste un terme fantaisie pour deux éléments qui sont «d'ordre naturel» WRT. l'un l'autre.


Oh, désolé, j'aurais peut-être dû m'expliquer à ce sujet.


Qu'est-ce qui serait mieux que O (n log n) dans le monde de l'informatique, à court de O (n)?


@Luiz - Pas de problème, à en juger d'autres messages, je suis le seul à ne pas (pas!) Savoir ce que cela signifie!


Ouais, peut-être une non-comparaison, mais je ne pouvais pas comprendre comment.


Quelles sont les limites sur n et m? Il est possible de faire avec un algorithme similaire à compter Tri dans O (n * m) , mais il est douteux qu'il va battre le O (n log n) algorithme.


1 <= n <= m <= 10 ^ 6. Dans ce cas, ce ne serait pas meilleur que l'algorithme quadratique):


3 Réponses :


5
votes

Le meilleur résultat de la littérature est un algorithme O (n √ (journal n)) en raison de Chan et Patrascu . Aucune idée de la constante.


1 commentaires

Intéressant, j'ai toujours pensé que le problème d'inversion avait la même liaison inférieure que le tri, donc dans ce cas où de nombreux algorithmes linéaires sont disponibles pour trier la même chose à faire avec l'inversion. Quoi qu'il en soit, merci pour votre réponse!



1
votes

O (n journal n) est le meilleur possible autant que je sache.

Une explication détaillée a été donnée ici:

http://www.geeksforgeeks.org/counting-inversions/


0 commentaires

0
votes

Si nous supposons que le nombre de bits utilisées pour représenter l'entier est constant (disons 32 ou 64 bits), cela peut être résolu dans O (n) temps.

Voici un exemple de mise en oeuvre Python. P>

http://ideone.com/g57o87 p>

p>

def inv_count(a, m=(1<<32)):
  if not m or not a:
      return 0
  count = 0
  ones = []
  zeros = []
  for n in a:
    if n & m:
      ones.append(n & ~m)
    else:
      count += len(ones)
      zeros.append(n & ~m)
  m /= 2
  return count + inv_count(ones, m) + inv_count(zeros, m)

print inv_count([1, 2, 3, 4, 5])
print inv_count([5, 4, 3, 2, 1])


0 commentaires