Nom de ce problème de réarrangement / tri?

10

On vous donne un tableau de longueur . Chaque élément du tableau appartient à l'une des K classes. Vous êtes censé réorganiser le tableau en utilisant un nombre minimum d'opérations de swap afin que tous les éléments de la même classe soient toujours regroupés, c'est-à-dire qu'ils forment un sous- tableau contigu. Par exemple: nK
Il reste trois autres dispositions valables.

[2,1,3,3,2,2][2,2,2,1,3,3], or[2,1,3,3,2,2][1,2,2,2,3,3], or[2,1,3,3,2,2][3,3,2,2,2,1].

Comment appelle-t-on ce problème dans la littérature? Existe-t-il un algorithme efficace pour cela?

Marko Bukal
la source
1
Je ne suis pas sûr que ce problème ait un nom, bien qu'il soit certainement possible. Tous les problèmes imaginables n'ont pas de noms.
Yuval Filmus
2
En pratique, cela s'appellerait le groupement . Je ne connais pas la terminologie en algorithmique classique. (C'est certainement un problème intéressant et potentiellement difficile! Minimiser le nombre de swaps a le sentiment de "trouver la meilleure permutation de groupes", ce qui se sent à son tour NP-hard-ish.)
Raphael
Eh bien les gars, merci pour l'instant. Bien sûr, je suis intéressé par la solution du problème, mais je pensais que cela avait déjà été étudié, alors je demandais une référence.
Marko Bukal

Réponses:

6

Remarque: C'est une preuve de dureté, et je pense qu'il existe des algorithmes pratiques comme la programmation entière, etc.

Kn1,,nKLm1,,mLni=mj=N

  • K+(N+1)(L1)
  • Kn1,,nKN+1
  • m1,(N+1)2,m2,(N+1)2,m3,,(N+1)2,mL
    (N+1)2N+1

(N+1)2N

Willard Zhan
la source
Nm1,,mL(N+1)2(N+1)N+1échange déjà, donc nous ne pouvons pas), ou "glisser" le tout d'une position à gauche ou à droite (mais cela implique de "glisser" chacun ...
j_random_hacker
N+1N+1N
1

Je soupçonne également que c'est NP-difficile, mais en l'absence d'une idée de preuve, voici quelques limites inférieures rapidement calculables qui pourraient être utiles pour vérifier l'optimalité d'une solution heuristique ou élaguer une recherche de branche et de liaison .

iniijLiijinijLiiO(n)O(Kn)

  1. LiK=2K
  2. Li

Dans votre exemple, ces bornes donnent toutes deux 1 (0,5 peut être arrondi dans ce dernier cas), ce qui est bien sûr lâche.

j_random_hacker
la source