PDA

Voir la version complète : ranger des valeurs par ordre croissant/ou decroissant dans un tableau



clemz
01/09/2011, 10h26
bijour ,

j'ai un petit soucis sur lequel je me prends la tête bêtement car je sents bien que ce n'est pas très compliqué mais je butte .. :

j'ai un tableau A (array) qui stocke n valeurs (8 exactement) ; ces valeurs sont variables , et je voudrais les classer par ordre croissant mais sans réorganiser A , je veux créer un autre tableau B qui lui me donnerait les indices des ID de A en fonction d'un ordre croissant .
par exemple :
A=
0: 35
1: 20
2: 44
3: 12
4: 66
5: 22
6: 17
7: 48

je voudrais donc avoir B me donnant :
0: 4
1: 7
2: 2
3: 0
4: 5
5: 1
6: 6
7: 3

J'ai donc essayé de faire des doubles loop ( un 1er for(i=0;i<=7;i++) contenant un autre for(j=0;j<=7;j++) , avec var v1=A[i] et var v2=A[j] ... si v2>v1 alors je stocke l'indice de j en valeur de B[i]... donc je compare chaque valeur de A[i] à toutes les autres dans A[j] ( avec i!=j) mais cela ne fonctionne pas . je sents bien qu'il faudrait que le 2eme loop (for(j..) ) soit dynamique et se réduise au fur et à mesure que i avance , et que l'on enlève de la comparaison les indices qui ont été trouvés.

bon je continue de chercher mais mon petit cerveau sature là :S

merki si vous aviez des idées.

clem

edit : ok ayé j'ai trouvé un truc qui marche :) je sais pas si c'est super optimisé mais bon il m'affiche bien les ids dans l'ordre de croissance:

var Abis = A; // A etant mon tableau de valeurs ; je crée une copie de A : Abis qui va me servir à mettre les valeurs dedans à 0 au fur et à mesure
var c1,c2,ind ;
for (i=0;i<=n-2;i++) // n etant mon nombre de cases dans le tableau / nbre de valeurs
{
c1 = Abis[i];
j=0;
while(j<=n-1)
{
c2=A[j];
if(c2>c1)
{
c1=c2;
ind=j;
}
j=j+1;
if(j==n-1) break;
}
Abis[ind]=0;
B[i]=ind; // B etant mon 2eme tableau où je souhaite avoir les Ids de A par ordre croissant des valeurs de A
println(B[i]);
}

en cherchant sur google je suis tombé sur des posts où les types conseillent de passer par des " Effective STL" .. j'ai ..rien ..compris :D !

phidek
01/09/2011, 16h47
Hello Clemz,

En python j'ai trouvé ça


li_a=[2,5,3,7] # Soi le résultat du test devrai être [0,2,1,3]
li_b=[]
li_c=[]

for i in li_a:
li_b.append(i)

li_b.sort() # La liste _b est une copie triée de la liste _a
while li_b:
for i in range(len(li_a)):
if li_b[0]==li_a[i]:
li_c.append(i)
li_b.remove(li_b[0])


print li_c
[0, 2, 1, 3] # Bingo

clemz
01/09/2011, 17h45
merci Phidek :) . bon je capte pas trop trop le python encore ^^ .. mon petit cerveau fonctionne en coffee pour l'instant .

( en fait mon exemple ci dessus est faux car il me sort que les 7 1ère valeurs manque la 8ème . faut que je regarde où j'ai merdouillé )

phidek
01/09/2011, 18h15
Je ne connais pas le Coffee.
Ce que j't'ai fait pourrait être traduit assez facilement en y ajoutant quelque var... et autre {} :biggrin: qui disparaissent sous python.

Bref y'a t'il un traducteur dans la salle? :P

valkaari
01/09/2011, 18h27
en c++ il y a des classes dans le SDK pour gérer les tableaux (bien qu'en c++, y a ce qu'il faut).

En coffee, je crois pas qu'il y ai un équivalent.

Par contre, dans la gestion de list python cartonne.

Pour tes boucles en coffee, fait attention avec les <=n-1 tu peux aussi mettre directement <n (enfin me semble)

En général, c'est là qu'il nous manque une boucle xD

clemz
01/09/2011, 21h13
merci :)

oué j'ai toujours un problême et je me demande même si coffee bugouille pas un peu , car j'obtiens des trucs pas logiques : je définis un tableau A et un autre Abis qui est sa copie ( Abis = A; ) j'obtiens un certain résultat après la moulinette de rangement , et si je definis Abis excatement comme A ( à savoir A est un tableau stockant des vecteurs "(p2-p1)" .. donc si je dis que A[i] = p2-p1 (avec p2 et p1 , définis en fonction de i ) ; et Abis[i] = p2-p1; je n'ai pas le même résultat qu'en faisant A[i] = p2-p1; et Abis= A; ..
je vais devenir fou .. et pourtant je vérifie bien dans la console le contenu de A et Abis .. et il est identique dans les 2 cas ..encore heureux , mais il est interprété différément dans les loop de stockage :(

bon je vais chercher encore .. jsuis à plus de 1000lignes codes et tout le reste fonctionne bien ça serait con de bloquer sur ça

Faudra vraiment que je franchisse le pas avec Python :P

xs_yann
01/09/2011, 21h57
Bref y'a t'il un traducteur dans la salle? :P

Ca fait un peu longtemps que je n'ai pas fais de COFFEE mais je tente. C'est un peu plus lourd par contre car il n'y a pas de fonctions de tri ou de copie de tableaux en COFFEE(enfin pas à ma connaissance). Donc les dites fonctions :
array_sort(a)
{
var len = sizeof(a);
var i, j;
for (i = 0; i < len; ++i)
for (j = i; j < len; ++j)
if (a[j] > a[i])
{
var tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
return a;
}

array_getCopy(a)
{
var len = sizeof(a);
var copy = new(array, len);
var i;
for (i = 0; i < len; ++i)
copy[i] = a[i];
return copy;
}

Et le reste :

var len = sizeof(a);
var sorted = array_sort(array_getCopy(a));
var ids = new(array, len);
var i, j;
for (i = 0; i < len; ++i)
for (j = 0; j < len; ++j)
if (sorted[i] == a[j])
ids[i] = j;

for (i = 0; i < len; ++i)
println(ids[i]);

C'est pas spécialement optimisé (le tri est très basique).

oli_d
02/09/2011, 04h49
Bien joué xs_yann, c'est vrai que c'est pas évident de revenir au COFFEE, surtout pour les tableaux qui sont un vrai bonheur en python ...

Pour Phidek : ton code est très bien, mais pour simplifier un peu il existe une fonction sorted() qui te donne directement une copie d'une liste triée



lst = [3,2,12,1,0]
lst2 =sorted(lst)ou sinon encore plus simple tu stockes les valeurs dans une tuple type (nombre,identifiant) que tu tries après :



lst = [3,2,12,1,0]
lst2 =[]
for i,nb in enumerate(lst):
lst2.append((nb,i))
lst2.sort()Python: 5 lignes, COFFEE: 33 lignes, choisis ton camp, camarade !

clemz
02/09/2011, 10h02
merci XS_yann et Oli_D :) .. c'est vrai que cette commande en python à l'air excellente ! et tellement plus simple

ok ayé j'ai modifié un truc et ça à l'air de marcher , j'ai bien tous mes Ids sans duplicatat et rangés dans le bon ordre



var Abis = A // A est un array de n éléments stockant des vecteurs
var c1,c2,ind;
for (i=0;i<n;i++)
{
c1 = 0;
for (j=0;j<n;j++)
{
c2=Abis[j];
if(c2 > c1)
{
c1=c2;
ind=j;
}
}
Abis[ind]=0;
B[i]=ind; // B est le tableau où sont rangés les indices du tableau A en fonction des grandeurs des vecteurs dedans
}




merci à vous pour votre aide :)



Python: 5 lignes, COFFEE: 33 lignes, choisis ton camp, camarade ! haha c'est clair ! :D (jsuis pas à 33 lignes cela dit tu es mauvaise langue ^^ ! )

oli_d
02/09/2011, 10h48
haha c'est clair ! :D (jsuis pas à 33 lignes cela dit tu es mauvaise langue ^^ ! )

J'ai compté les lignes de xs_yann, ceci dit j'ai compté les accolades, les println, j'admets être totalement de mauvaise foi, autant qu'un macintoshien devant un pc, mais qu'est ce que je ferais pas pour te convertir !

xs_yann
02/09/2011, 15h58
var Abis = A; // A est un array de n éléments stockant des vecteurs

Attention en COFFEE si tu fais ça tu obtiens une référence vers le tableau A et non sa copie, et donc tout ce que tu modifieras dans Abis sera répercuté sur A.


c1 = 0;
...
Abis[ind]=0;

Le zéro empêche le bon fonctionnement du code en cas de valeurs négatives dans le tableau, je ne sais pas si dans ton cas il y en aura mais fais attention. ;)

+1 pour oli_d, passe au Python clemz, la transition n'est pas très compliquée (pour avoir un code fonctionnel, après il faut du temps pour apprendre les outils mis à disposition par Python).

Bon courage. :icon_artist:

valkaari
02/09/2011, 16h50
j'ai eu du mal à passer au python aussi mais faut reconnaitre que c'est tip top et qu'il y a de base, pleins pleins de possibilités. (sans parler d'ajout de librairies)

clemz
02/09/2011, 16h59
var Abis = A; // A est un array de n éléments stockant des vecteurs

Attention en COFFEE si tu fais ça tu obtiens une référence vers le tableau A et non sa copie, et donc tout ce que tu modifieras dans Abis sera répercuté sur A.


c1 = 0;
...
Abis[ind]=0;

Le zéro empêche le bon fonctionnement du code en cas de valeurs négatives dans le tableau, je ne sais pas si dans ton cas il y en aura mais fais attention. ;)

+1 pour oli_d, passe au Python clemz, la transition n'est pas très compliquée (pour avoir un code fonctionnel, après il faut du temps pour apprendre les outils mis à disposition par Python).

Bon courage. :icon_artist:

arf :( . merci XS_Yann pour les infos ..cela explique pourquoi j'obtenais des résultats différents .. cela dit j'avais essayé de faire un " ->GetClone()" mais cela ne fonctionne pas avec les array , juste les matrices apparement . et en python c'est pareil ? si je dis que 'Abis = A' ; ce n'est pas une copie en python ?
pour les valeurs négatives je ne savais pas :S puré c'est nul le coffee :D ! heureusement pour moi là je stocke que des valeurs absolues de vecteurs .

Dominatium
02/09/2011, 17h01
La finalité c'est pour faire quoi ? :whistling:

clemz
02/09/2011, 17h05
La finalité c'est pour faire quoi ? :whistling:

je voulais finir mon ébauche "d'autowalk" commencée ya bein longtemps ... où je dois manipuler tout un tas de vecteurs , les ranger etc ..
(ici mon vieux test : autowalk-wip (http://kiteclem35.free.fr/3D/C4D/Spider/Autowalk-wip2.avi) qui commencait un peu à fonctionner mais les jambes étaient "indépendantes" )

Dominatium
02/09/2011, 17h07
Tout s'explique ! Bon courage :P

oli_d
02/09/2011, 17h50
si je dis que 'Abis = A' ; ce n'est pas une copie en python ?
pour les valeurs négatives je ne savais pas :S puré c'est nul le coffee :D ! heureusement pour moi là je stocke que des valeurs absolues de vecteurs .

et oui en python aussi, on s'est tous fait avoir une fois ou l'autre, mais il y a des fonctions pour copier :
lst2 = lst[:] ou
lst2 = list(lst)

Pour ce qui est des valeurs négatives, il y a l'histoire du pilote de chasse israélien qui s'est retrouvé au dessus de la mer morte et tout ces instruments de bord ont bugué. La mer morte étant à très basse en altitude, il volait en fait en dessous du niveau zéro, et évidement les programmeurs n'avaient pas prévu ce cas de figure ... (entendu dans les pythonneries)

phidek
02/09/2011, 17h58
et en python c'est pareil ? si je dis que 'Abis = A' ; ce n'est pas une copie en python ?


C'est traitre, exemple:



a=[2,3,1]
b=a
b.sort()
print a
[1, 2, 3]

a=12
b=a
b=b/2
print a
>>>12
print b
>>>6
Python indique seulement que ce qu'il y a dans variable a ce trouve au même endroit que la variable b dixit pythonnerie n°2
A partir de 3min:


http://www.dailymotion.com/video/xbk6nq_pythonnerie-n-2_tech



st2 = lst[:] ou
lst2 = list(lst)
Merci du tuyau

clemz
02/09/2011, 21h54
ok merci :) je commence à capter la logique .

tant que je vous tiens : est-ce vous sauriez comment lire aléatoirement un tableau ( en coffee ) ?

je me retrouve avec un tableau de 4 éléments , j'ai un élément qui doit sortir en 1er ( je connais l'indice du tableau ) mais pour les 3 autres éléments je voudrais faire un choix aléatoire ..
Je regarde du coté des random là ( var rand = new(random); rand->Init(time()); rand->Get01() ; ) mais bon je vois pas trop encore comment choisir les éléments restants avec . Dans l'idéal , je créerais bien un nouveau tableau avec comme 1er élément, l'élément choisi par l'indice connu , et puis les 3 autres restants .. jsais pas si je suis très clair là ^^ ?

oli_d
03/09/2011, 05h28
Si nb est ton nombre de cases du tableau tu rajoutes 1 et tu multiplies par ton nombre obtenu par le random , le tout transformé en integer :


int(rand->Get01()*(nb+1))

clemz
03/09/2011, 10h11
Merci Oli_D :) .

est-ce que ta soluc ne risque pas de me sortir 2x la même valeur ? (si le random sort 2 valeurs proches à la suite )

oli_d
03/09/2011, 16h07
Si tu ne veux pas que la même valeur sorte deux fois, tu supprimes la case de ton tableau une fois qu'elle est sortie (je ne sais même plus comment on supprime une entrée dans un tableau en COFFEE)

valkaari
03/09/2011, 17h52
Si tu ne veux pas que la même valeur sorte deux fois, tu supprimes la case de ton tableau une fois qu'elle est sortie (je ne sais même plus comment on supprime une entrée dans un tableau en COFFEE)

un coup sec derrière la nuque.

clemz
03/09/2011, 18h22
hehe ^^ . oki bon dans l'immédiat je me contente de lire dans l'ordre croissant mon 1er tableau d'où je sorts mes valeurs .. tanpis pour le random là .. l'ordre est déja un peu 'random' lui aussi donc peut-être que cela suffira . merkii en tout cas .