2011-11-29 3 views
0

J'essaie de faire une analyse d'ADN en C++. J'ai un tableau 2D de caractères contenant des séquences d'ADN. Maintenant, basé sur le modèle d'ADN, je fais un peu de traitement sur le tableau d'entrée et trouve une nouvelle séquence pour ce modèle.Réorganisation d'un tableau 2D

Disons que la séquence d'origine était 1,2,3,4,5,6. Ce sont les 6 ADN (rangées du tableau 2D)

Après traitement, je reçois la commande sous 1,6,2,4,3,5. Ensuite, comment réorganiser le tableau d'entrée d'origine selon cette séquence. Autrement dit, la première rangée d'entrée devrait maintenant avoir le 1er ADN, la 2e rangée devrait maintenant avoir l'ADN qui était sixième dans le tableau original et ainsi de suite. Des idées pour changer les adresses dans la mémoire afin de réorganiser le tableau d'origine?

+0

C++ offre des classes de collection ordonnées qui sont beaucoup plus flexibles que la construction matricielle de bas niveau. Y at-il une raison spécifique pour laquelle vous n'utilisez pas 'vector' ou similaire? http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html – HostileFork

+0

Eh bien, c'est une partie d'un code d'environ 50k lignes. J'ai donc besoin de faire des changements dans le tableau original lui-même. En fait, j'ai besoin de passer ce tableau re ordered à un autre algorithme pour le traitement. –

+0

Ce que je demande est pourquoi ne pas avoir chacune de vos lignes stockées en tant qu'objet (disons, 'classe DnaSequence') ... alors avoir un vecteur de pointeurs vers ces objets. Votre réorganisation aurait alors simplement réorganiser les pointeurs, et il serait capable de le faire rapidement même si les séquences d'ADN étaient longues. Soit dit en passant, si vous êtes hyper-préoccupé par l'espace de stockage des éléments radix 4 (ou même si vous avez d'autres états comme "unknown"), vous pourriez trouver ma bibliothèque Nstate intéressante: http://hostilefork.com/nstate/ – HostileFork

Répondre

0

Si vous n'avez pas besoin de le faire, créez simplement une nouvelle matrice de destination, copiez les lignes 1 à 1, la ligne 6 à la ligne 2, et ainsi de suite ... Utilisez simplement la sortie [i] comme index pour rangée de matrice originale.

Avec un peu plus de tenue de livres, il peut certainement aussi être fait en place. Ok, si vous avez besoin en place, je ferais quelque chose comme ceci: Vous avez votre liste de paire de [ligne source] [ligne de destination], comme:

[1] < - [1], [2] < - [6], [3] < - [2], ...

Créer carte décrivant cette opérations de copie. Puis commencez à partir de 1.

[1] < - [1] est facile. (Vous pouvez le retirer de la carte)

[2] < - [6] remplace la ligne 2 d'origine dont vous avez besoin à l'étape suivante. Vous échangez donc les lignes 2 et 6. Maintenant, la ligne 6 est à la bonne place, mais vous devez changer de mappage. Vous devez modifier le mappage [3] < - [2] à [3] < - [6] en utilisant quelque chose comme map [2] = 6.

Et ainsi de suite, jusqu'à fait.

+0

Ou vous pouvez utiliser std :: swap() pour une matrice de petite taille, mais elle échange des valeurs pas les pointeurs. – v01d

+0

Mais alors je devrais aussi recopier tout le contenu de la nouvelle matrice à l'original. C'est la dernière option. Je cherche quelque chose de plus efficace car la taille des données est trop grande et par conséquent cela prendrait trop de temps. –

1

Cela ne se déplacer des pointeurs:

char input[5][9] = { {'A','A','A','T','C','A','G','T','A'}, 
         {'A','T','T','A','C','T','G','C','A'}, 
         {'A','G','C','T','A','C','T','G','C'}, 
         {'A','T','T','A','C','T','G','C','A'}, 
         {'A','G','C','T','A','C','T','G','C'} 
       }; 

char* output[5]; 
output[0] = input[3]; 
output[1] = input[2]; 
output[2] = input[4]; 

char test = output[1][3]; 
0

Personnellement, j'utiliser vector<string> input

puis

vector<double> output_list (t,0); // length t, initialized to 0 

// assign the values of output_list 

for (int i = 0; i<t; i++) 
{ 
cout << input[output_list[i]] << " "; 
} 

S'il vous plaît noter que cette solution ne nécessite pas la mémoire supplémentaire (il n'y a pas un deuxième tableau 2D) ni de temps de calcul supplémentaire (vous n'échangez pas les données, vous appelez simplement la partie dont vous avez besoin)

Si vous devez à la place absolument réorganiser le tableau (comme je le remarque dans vos commentaires), vous pouvez swap(input[i],input[j]) autant de fois que nécessaire.