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
Partager