Bonjour,
Je cherche à écrire une fonction partition(n) qui prend en argument un entier (n = nombre d'élements) et qui renvoie une matrice représentant tous les sous ensembles possibles avec des 0 et des 1 (si un élement est dans le sous ensemble on lui affecte 1,0 sinon).
Le nb de sous ensemble d'un ensemble à n élements est 2^n, donc partition(n) est une matrice de taille n*2^n (ca grossit très vite).
Je ne suis pas du tout familier avec la syntaxe VBA et mes souvenirs d'informatique sont assez anciens mais j'ai réussi à écrire un algorithme trivial qui fonctionne, le code est le suivant.
La fonction est récursive:
J'étais content, jusqu'à ce que je me rende compte que pour n=4 ca met déjà plusieurs secondes à s'exécuter... j'en ai pas besoin pour des valeurs très elevées de n (jusqu'à n=6/7) mais ca prendra trop de temps à tourner car je l'utilise plusieurs fois cette fonction après.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Function Partition(n_elem As Integer) As Variant Dim Tab_temp(1024, 1024) As Integer If n_elem = 1 Then Tab_temp(0, 0) = 0 Tab_temp(0, 1) = 1 Else For k = 0 To 2 ^ (n_elem - 1) - 1 Tab_temp(0, k) = 0 Tab_temp(0, 2 ^ (n_elem - 1) + k) = 1 Next k For i = 0 To n_elem - 2 For k = 0 To 2 ^ (n_elem - 1) - 1 Tab_temp(i + 1, k) = Partition(n_elem - 1)(i, k) Tab_temp(i + 1, 2 ^ (n_elem - 1) + k) = Partition(n_elem - 1)(i, k) Next k Next i End If Partition = Tab_temp End Function
Donc j'essaye d'optimiser la syntaxe de la fonction.
Je pense que ce qui prend du temps c'est que je calcule beaucoup de fois Partition(n_elem-1) dans mes boucles. Donc j'ai essayé de stocker dans un tableau temporaire la valeur Partition(n_elem-1) et appeler ce tableau temporaire:
> temp_part = Partition(n_elem-1)
et appeler temp_part(i,k) dans la suite du code mais ça me met "erreur d'exécution 7: mémoire insuffisante.
Est-ce qu'une âme charitable peut m'aider pour faire marcher tout ça plus rapidement?
Aussi, peut-on créer des tableaux de dimension variable genre Tab(n_elem) par exemple? Je n'ai pas l'impression que ce soit possible. Lié à ça, un mystère est que le nombre d'initialisation de la matrice Dim Tab_temp(1024, 1024) joue énormément dans la vitesse de calcul je ne sais pas pourquoi car je boucle seulement sur les éléments qui m'intéressent.
Merci d'avance pour vos conseils éclairés






Répondre avec citation




Partager