11
votes

Comment réorganiser les données dans la matrice afin que deux éléments similaires ne soient pas à côté de l'autre?

Voulez-vous simplement réorganiser les données de la matrice afin que des éléments similaires ne soient pas à côté de chacun. Les données ne doivent pas être retirées du tableau, s'il ne peut pas être réarrangé, il peut être mis à la fin de la matrice. Mais garder l'ordre d'origine est nécessaire.

Exemple xxx

éditer: Exemple supplémentaire pour montrer que la commande d'origine est nécessaire


10 commentaires

Vous voulez les réorganiser, mais gardez la commande ....?


@Mark - Les deux sont mutuellement exclusifs. Vous gardez la commande ou changez-le ... Pouvez-vous clarifier ce que vous voulez dire?


Au lieu de marquer n'importe quel langage de programmation que vous avez pensé que vous auriez pu et auriez dû le marquer avec une étiquette d'algorithme


Cela ressemble vraiment à une question de devoirs - vous pourriez mentionner que dans la question si c'est - cela aidera les gens à le répondre correctement.


@Armen mentionné les langues ne sont pas un langage de programmation, ils ont une syntaxe similaire. C'est pourquoi je les ai mentionnés.


Ceci est bien plus dur qu'il n'y paraît! Qu'en est-il des tableaux 8 2 2 2 2 2 ou 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 ? ...;)


@Mark K Vous avez donc piqué ma curiosité .. Qu'est-ce que cela pourrait être utilisé? Cela doit presque être une question de puzzle / d'entretien, mais je vous crois que cela semble un peu difficile pour les devoirs.


Vous avez évidemment quelque chose en tête par «Garder l'ordre d'origine», mais cela ne peut pas vraiment dire ce qu'il dit, car vous demandez une réorganisation. Jusqu'à ce que vous clarifiez cela, personne ne peut vraiment vous aider.


BTW, 8 2 2 2 2 7 2 5 2 => 8 2 7 2 5 2 2 peut être fait sous forme de 2 8 2 7 2 5 2, sans aucun 2 à côté de l'autre.


Je suis d'accord avec @wnoise - vous devez définir de manière rigoureuse ce que vous entendez par "Garder l'ordre original".


7 Réponses :


4
votes

hmm. BubblesTort vous vient à l'esprit, mais avec une comparaison de trois éléments; c'est-à-dire que si élément [x] et élément [x + 1] sont identiques et élément [x + 2] est différent, échange élément [x + 1] et élément [x + 2] . Répétez la répétition d'itération à travers la liste jusqu'à ce qu'aucun swaps ne se produise. L'ordre d'exécution est bien sûr horrible, mais cela devrait répondre à vos besoins.


3 commentaires

D'accord, qu'est-ce qui est avec le bowvote? Y a-t-il un problème avec cette approche (autre que l'ordre de temps d'exécution acquitté)?


Je n'ai pas répondu, mais cela n'est même pas garanti de se terminer.


@wnoise: ce n'est même pas pcode, juste une description simple d'un algorithme; Obtenir des conditions de résiliation appropriées en place est en quelque sorte supposée être un exercice pour le lecteur.



0
votes

Remplissez votre tableau dans une classe VaR, vous pouvez ensuite exécuter vos méthodes de tri personnalisées sans le changer. Félicitations, vous venez de créer une nouvelle base de données NOSQL.

Qu'est-ce qui fait peur à tout le monde perd la commande originale.

C'est pourquoi la clé d'un hash s'appelle "index", y réfléchir. xxx

}


0 commentaires

10
votes
  1. Trier votre tableau
  2. Éléments d'échange à de petits index, même d'index avec leurs homologues antipodales supérieurs: XXX

    Edit: D'accord, nous devrions redéfinir les contreparties antipodales. Peut-être que celui-ci est meilleur: mélanger le premier et le troisième quartile (noté X, Y en illustration) et mélanger les deuxième et troisième quartile (indiqués U, V, W). Laissez les contreparties monter parallèlement. xxx


3 commentaires

J'aime cette réponse. C'est simple et semble avoir une bonne complexité de temps (pas pire qu'un facteur constant plus que l'algorithme de tri)


J'aime la réponse, même si cela me concerne le temps d'exécution potentiel, dans la mesure où une liste minimale différente de la condition cible entraînera le temps d'exécution maximal avec cet algorithme (en raison du tri). C'est-à-dire une liste qui correspond aux critères cibles qui a ensuite un élément ajouté à celui-ci provoquera potentiellement une grande exécution d'exécution (c'est-à-dire que cet algorithme est agnostique du degré par lequel l'entrée répond aux critères d'achèvement). Cela dit, si ce n'est pas un cas attendu, cet algorithme semble que cela fonctionne bien.


triché -> 1 1 1 1 1 1 2 ; Swap (0, 6) -> 2 1 1 1 1 1 1



-1
votes

Dans JavaScript, je ferais probablement:

    var arr = [ 1, 1, 1, 2, 3 ];
    var i = 0, len = arr.length;

    while (i < len - 1) {
        if (arr[i] == arr[i+1]) {
            //index is equal to it's partner.
            if (arr[i+2] && arr[i] == arr[i+2]) {
                // 3 equal values in a row, swapping won't help. Need to recheck this index in this case.
                var tmp = arr[i];
                arr.splice( i, 1 );
                arr.push( tmp );
            } else {
                // Swap the next and 2nd next index.
                var tmp = arr[i+1];
                arr[i+1] = arr[i+2];
                arr[i+2] = tmp;
                i++;
            }
        } else {
            // this index is fine, move on.
            i++;
        }
    }


1 commentaires

Cela pend indéfiniment parfois, ne l'utilisez pas!



0
votes

Assumer un tableau contenant des chiffres compris entre 0 et 9: Semblable au Seau Tri d'une manière

int B[10];//buckets
diff=0;//how many different digits appeared

for(i=0;i<A.length;i++)
{
 x=A[i];
 if(B[x]==0)
 {
  diff++;
 }
 B[x]++;
}//loaded
while(diff>=0)//now to place back to array makes an interleaving
{
 for(digit=0;digit<10;digit++)
 {
  if(B[digit]<>0)
  {
   A[B[digit]+diff]=digit;
   B[digit]--;
  }
 }
 diff--;
}


0 commentaires

0
votes

Prenez l'ensemble de la matrice et analysez-le pour les doublons. Lorsque vous rencontrez des dupes, rappelez-vous où ils sont. Donc, pour quelque chose comme 2 1 2 2 * 3 3 * 3 * 4 4 * 2 2 * 5. Ceux avec des étoiles doivent être rappelés.

Regardez maintenant les choses "mémorisées", vous avez 2 2, 2 3 et un 4

Maintenant, je trierais ces listes les plus nombreux (2 et 3 et 3) au moins nombreux (4)

prenez maintenant simplement le plus nombreux qui ne dupliquent pas le "front" actuel (qui serait 3 parce que 2 duplicats) et le déplacent à l'avant, puis retirez-le de votre liste.

Répétez jusqu'à ce que les listes soient vides. La deuxième fois que via votre liste commencera par «3» et vous aurez 2 2 a 3 et un 3 et une 4, vous mettrez donc l'un des 2's à l'avant ...

Si vous avez laissé (il ne peut s'agir que d'un numéro) le mettre à la fin ..

fait, gâteau.


0 commentaires

2
votes

Après avoir saisi ce que vous êtes après, voici une solution possible

  1. partition de votre tableau p>

    [1,1,1,8,8,8,2,3,3,4,1,1,1,2,2] -> [[3,1],[3,8],[1,2],[2,3],[1,4],[3,1],[2,2]]
    
  2. pour chaque entrée de partition i code> avec p [i] [0]> 1 code> (fois> 1): P>

    • Choisissez une position "Code" valide " j code> (donc p [j] [1]! = p [i] [1] && p [j + 1] [1 ]! = p [i] [1] code>) p> li>

    • Décrément p [i] [0] code> élément et insert [p [i] [1], 1] code> en partition à la position J P > li> ul>

      ou laissez-le sortir s'il n'y a pas de ce poste de ce type. P> li> ol>

      Ceci devrait avoir une complexité de temps linéaire (des positions valides du livre pour chaque numéro). P> P>


0 commentaires