OVH Cloud OVH Cloud

routine de tri fusion

10 réponses
Avatar
Sébastien Kirche
Bonjour,

dans le code vb que j'essaie d'adapter en python, je suis en ce moment sur
un tri fusion (composé de 2 fonctions que je reproduis plus bas).

En gros on a un tableau Tab à trier en entrée et 2 tableaux en sortie :
- le tableau Res qui est le tableau Tab trié
- le tableau Ordre qui contient les index des éléments de Res dans le
tableau initial

(restent les paramètres debut qui est initialement à 0 et nbelt qui est le
nombre d'éléments à trier)

La méthode sort() du type 'list' me conviendrait tout à fait mais je suis un
peu coincé avec le tableau d'index. Est-ce qu'il existe une lib standard qui
permettrait de l'obtenir, ou faut-il que je réécrive les fonctions vb ?

Ou encore y a-t-il une notion dans la philosophie python qui me permettrait
d'y arriver autrement ?

8<------8<------8<------8<------8<------8<------8<------8<------8<------
Sub Tri(ByRef Tab, ByVal debut, ByVal nbelt, ByRef Ordre, ByRef Res)

Dim taille As Integer
Dim OGauche(2500), ODroit(2500), RDroit(2500), RGauche(2500)

If (nbelt > 1) Then
taille = nbelt \ 2
Tri(Tab, debut, taille, OGauche, RGauche)
Tri(Tab, debut + taille, nbelt - taille, ODroit, RDroit)
Fusion(Tab, debut, taille, debut + taille, nbelt - taille,
OGauche, ODroit, RGauche, RDroit, Ordre, Res)
Else
Res(0) = Tab(debut)
Ordre(0) = debut
End If

End Sub

Sub Fusion(ByRef Tab, ByVal debutG, ByVal nbeltG, ByVal debutD, ByVal
nbEltD, ByRef Gauche, ByRef Droit, ByRef RGauche, ByRef
RDroit, ByRef Ordre, ByRef Resultat)

Dim compteur1 As Integer = 0
Dim compteur2 As Integer = 0
Dim compteur As Integer = 0

While (compteur1 < nbeltG Or compteur2 < nbEltD)
If compteur1 = nbeltG Then
Resultat(compteur) = RDroit(compteur2)
Ordre(compteur) = Droit(compteur2)
compteur2 += 1
ElseIf compteur2 = nbEltD Then
Resultat(compteur) = RGauche(compteur1)
Ordre(compteur) = Gauche(compteur1)
compteur1 += 1
ElseIf RGauche(compteur1) < RDroit(compteur2) Then
Resultat(compteur) = RGauche(compteur1)
Ordre(compteur) = Gauche(compteur1)
compteur1 += 1
Else
Resultat(compteur) = RDroit(compteur2)
Ordre(compteur) = Droit(compteur2)
compteur2 += 1
End If
compteur += 1
End While

End Sub
8<------8<------8<------8<------8<------8<------8<------8<------8<------


--
Sébastien Kirche

10 réponses

Avatar
Yermat
Sébastien Kirche wrote:
Bonjour,
[...]

En gros on a un tableau Tab à trier en entrée et 2 tableaux en sortie :
- le tableau Res qui est le tableau Tab trié
- le tableau Ordre qui contient les index des éléments de Res dans le
tableau initial
[...]

Ou encore y a-t-il une notion dans la philosophie python qui me permettrait
d'y arriver autrement ?


Cela a déjà été discuté plusieurs fois ici ou dans comp.lang.python.
Je ne sais plus la conclusion mais voici un code fonctionnel. Quid de
l'efficacité ?

tab = [1, 7, 3, 8]
aux = zip(tab, range(len(tab)))
aux.sort()
aux
[(1, 0), (3, 2), (7, 1), (8, 3)]



res = [o for (o, i) in aux]
res
[1, 3, 7, 8]



ordre = [i for (o,i) in aux]
ordre
[0, 2, 1, 3]





--
Cordialement,
Yermat



Avatar
Sébastien Kirche
Le 23 Feb 2005, Yermat a formulé :

Cela a déjà été discuté plusieurs fois ici ou dans comp.lang.python.
Je ne sais plus la conclusion mais voici un code fonctionnel. Quid de
l'efficacité ?

tab = [1, 7, 3, 8]
aux = zip(tab, range(len(tab)))
aux.sort()
aux
[(1, 0), (3, 2), (7, 1), (8, 3)]



res = [o for (o, i) in aux]
res
[1, 3, 7, 8]



ordre = [i for (o,i) in aux]
ordre
[0, 2, 1, 3]





Excellent !!! Et concis. Merci.

Pour l'efficacité, je verrai bien ce que ça donne mais c'est certainement
plus rapide que le code vb (.net).

Je vais faire tourner ça avec des tableaux moyens (de plusieurs centaines ou
milliers de valeurs) mais ponctuellement.

--
Sébastien Kirche




Avatar
Encolpe DEGOUTE
Dans fr.comp.lang.python, Sébastien Kirche écrivit:
Le 23 Feb 2005, Yermat a formulé :

Cela a déjà été discuté plusieurs fois ici ou dans comp.lang.python.
Je ne sais plus la conclusion mais voici un code fonctionnel. Quid de
l'efficacité ?

tab = [1, 7, 3, 8]
aux = zip(tab, range(len(tab)))
aux.sort()
aux
[(1, 0), (3, 2), (7, 1), (8, 3)]



res = [o for (o, i) in aux]
res
[1, 3, 7, 8]



ordre = [i for (o,i) in aux]
ordre
[0, 2, 1, 3]





Excellent !!! Et concis. Merci.

Pour l'efficacité, je verrai bien ce que ça donne mais c'est certainement
plus rapide que le code vb (.net).

Je vais faire tourner ça avec des tableaux moyens (de plusieurs centaines ou
milliers de valeurs) mais ponctuellement.


Pourquoi ne pas utiliser sort() tout simplement ?

--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales





Avatar
Sébastien Kirche
Le 23 fév 2005, Encolpe DEGOUTE vraute :

Pourquoi ne pas utiliser sort() tout simplement ?


Compatibilité avec le reste des fonctions que j'essaie de convertir.

Ces routines constituent des «briques» élémentaires sur lesquelles des
modules plus élaborés s'appuient.

Je ne souhaite pas tout réécrire dans un premier temps mais réécrire en
python les fonctions de base et conserver en l'état le fonctionnement des
modules.

Sort m'aurait suffi, mais j'ai un module client qui a besoin de la
correspondance entre les données non triées et celles qui le sont.

Voilà.

--
Sébastien Kirche

Avatar
Encolpe DEGOUTE
Dans fr.comp.lang.python, Sébastien Kirche écrivit:
Le 23 fév 2005, Encolpe DEGOUTE vraute :

Pourquoi ne pas utiliser sort() tout simplement ?


Compatibilité avec le reste des fonctions que j'essaie de convertir.

Ces routines constituent des «briques» élémentaires sur lesquelles des
modules plus élaborés s'appuient.

Je ne souhaite pas tout réécrire dans un premier temps mais réécrire en
python les fonctions de base et conserver en l'état le fonctionnement des
modules.

Sort m'aurait suffi, mais j'ai un module client qui a besoin de la
correspondance entre les données non triées et celles qui le sont.


Correspondance ? C'est-à-dire ?
Si deux tris donnent le même résultat, la correspondance est la même.

--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales


Avatar
Sébastien Kirche
Le 23 fév 2005, Encolpe DEGOUTE a dit :

Correspondance ? C'est-à-dire ?


Je n'ai pas décortiqué exactement pourquoi mais j'ai un module qui a besoin
de pouvoir trier un tableau et il a aussi besoin de savoir la position dans
le tableau non trié des données triées.

Je ne sais pas si je suis clair... :/

Si deux tris donnent le même résultat, la correspondance est la même.


Certes.

--
Sébastien Kirche

Avatar
Encolpe DEGOUTE
Dans fr.comp.lang.python, Sébastien Kirche écrivit:
Le 23 fév 2005, Encolpe DEGOUTE a dit :

Correspondance ? C'est-à-dire ?


Je n'ai pas décortiqué exactement pourquoi mais j'ai un module qui a besoin
de pouvoir trier un tableau et il a aussi besoin de savoir la position dans
le tableau non trié des données triées.

Je ne sais pas si je suis clair... :/


Oui. :)
C'est une méthode qui sert plutôt pour trier un liste selon un sous-critère
d'un élément à la base, mais cela convient dans notre cas:

t = ['e', 'a', 'j', 'p', 'f']

# on crée un tableau temporaire avec (l'élement, l'index de l'élément)
t_temp = [ (e, t.index(e)) for e in t]
print t_temp
t_temp.sort()

# la liste trié
t_trie = [ e[0] for e in t_temp]
print t_trie

# la liste des index avant le tri
t_index = [ e[1] for e in t_temp]
print t_index



--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales


Avatar
Encolpe DEGOUTE
Dans fr.comp.lang.python, Encolpe DEGOUTE écrivit:
Dans fr.comp.lang.python, Sébastien Kirche écrivit:
Le 23 fév 2005, Encolpe DEGOUTE a dit :

Correspondance ? C'est-à-dire ?


Je n'ai pas décortiqué exactement pourquoi mais j'ai un module qui a besoin
de pouvoir trier un tableau et il a aussi besoin de savoir la position dans
le tableau non trié des données triées.

Je ne sais pas si je suis clair... :/


Oui. :)
C'est une méthode qui sert plutôt pour trier un liste selon un sous-critère
d'un élément à la base, mais cela convient dans notre cas:


C'est la même solution que Yermat, mais en moins condensé.

t = ['e', 'a', 'j', 'p', 'f']

# on crée un tableau temporaire avec (l'élement, l'index de l'élément)
t_temp = [ (e, t.index(e)) for e in t]
print t_temp
t_temp.sort()

# la liste trié
t_trie = [ e[0] for e in t_temp]
print t_trie

# la liste des index avant le tri
t_index = [ e[1] for e in t_temp]
print t_index






--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales



Avatar
Yermat
Encolpe DEGOUTE wrote:
Dans fr.comp.lang.python, Encolpe DEGOUTE écrivit:

Dans fr.comp.lang.python, Sébastien Kirche écrivit:

Le 23 fév 2005, Encolpe DEGOUTE a dit :


[...]
C'est la même solution que Yermat, mais en moins condensé.





t = ['e', 'a', 'j', 'p', 'f']

# on crée un tableau temporaire avec (l'élement, l'index de l'élément)
t_temp = [ (e, t.index(e)) for e in t]



Et en plus long car ici tu fais appel à t.index(e) qui doit parcourir la
liste pour retrouver son index... Ce n'est donc plus linéaire.

De plus si l'élément e est présent plusieurs fois dans la liste, il n'y
aura référence qu'au premier index. Dans l'autre algo., le tri se fera
d'abord sur l'élément puis sur l'index d'origine. Tous les index
d'origines seront donc présents...

--
Yermat




Avatar
Encolpe DEGOUTE
Dans fr.comp.lang.python, Yermat écrivit:
Encolpe DEGOUTE wrote:
Dans fr.comp.lang.python, Encolpe DEGOUTE écrivit:

Dans fr.comp.lang.python, Sébastien Kirche écrivit:

Le 23 fév 2005, Encolpe DEGOUTE a dit :


[...]
C'est la même solution que Yermat, mais en moins condensé.





t = ['e', 'a', 'j', 'p', 'f']

# on crée un tableau temporaire avec (l'élement, l'index de l'élément)
t_temp = [ (e, t.index(e)) for e in t]



Et en plus long car ici tu fais appel à t.index(e) qui doit parcourir la
liste pour retrouver son index... Ce n'est donc plus linéaire.

De plus si l'élément e est présent plusieurs fois dans la liste, il n'y
aura référence qu'au premier index. Dans l'autre algo., le tri se fera
d'abord sur l'élément puis sur l'index d'origine. Tous les index
d'origines seront donc présents...


oui.
cela m'apprendra à ne pas relire le code.

--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales