Comment étendre efficacement des tableaux
Bonjour,
Je cherche à savoir si il existe une solution efficace connu à un problème que j'ai. Je code actuellement en oCaml, donc une solution orienté objet, fonctionnelle/récursive, ou itérative/impérative, tout me va.(C'est pour ça que je l'ai mis en section algorithmique)
Soient m>n des entiers.
J'ai un tableau t de taille n, puis je veux étendre ce tableau en plusieurs tableau t_1, t_2, t_3... de taille m, et où les n premières valeurs de t2 sont les valeurs de t1.
Et je recommence l'opération récursivement, donc je peux me trouver avec t_i1,t_i2,..., t_ijklm..z
Le tableau contient des constantes, au sens que, toutes les valeurs du tableau sont connu à sa création, et elle sont imédiatement écrite. Après, je lirai les cases de ce tableau mais ne les écrirai plus.
Une fois que les ti seront créé, je n'utiliserai plus t, donc ce n'est pas grave si le tableau est détruit au passage.
Actuellement, je vois trois solutions:
Soit quand je créé t1, j'initialise un nouveau tableau de taille m, et recopie les n premiières valeurs (mais c'est inefficace à la création)
Soit ti sera un couple, composé de t, et d'un nouveau tableau de taille m-n, et je dis que si je veux la kième case, si k>n, alors je prend la k-n ème case du nouveau tableau, sinon je prend la kième case du tableau t.
(Avec un module/une classe, ça s'écrit très facilement récursivement pour que ce soit transparant pour l'utilisateur, et permette d'étendre plusieurs fois un tableau)
Mais dans ce cas, si on étendu hj fois, l'accès à un élément du "tableau" n'est plus en O(1) mais en O(h) ce qui n'est pas vraiment efficace.
Soit j'abandonne le tableau, et j'utilise des arbre de recherche équilibré persistant, depuis les position du tableau vers mes valeurs.
(probablement un AVL, puisque oCaml fournit ça avec le module Map dans sa bibliothèque)
La création de t_i serait donc du O((m-n)log(m)), et la recherche en O(log(m)), ce n'est donc pas vraiment très efficace, mais j'évite les gros temps des deux premières solutions
Je souhaitai savoir si quelqu'un connaissait une méthode plus efficace au niveau du temps d'éxécution. Moi je bloque. (La mémoire n'est pas autant un problème, le garbage collector fera son office sur ce dont je ne me sers plus)
Pour information, j'ai malheureusement peu d'information pertinante sur son execution.
La plupart des tableau seront étendu, souvent une seule fois, parfois jusqu'à une dizaine de fois. (dans le sens où on aura t1 t2 ... t10). Certaines extensions seront utilisé très peu avant d'être détruite. Pour ces raisons, la première méthode est à proscrire
Mais les extensions qui sont gardé pourront être étendu plein de fois. Il n'est pas impossible qu'on se retrouve avec un tableau de la forme t_i1i2...i50, et que dans la 50ème extension, on est besoin d'accéder à une valeur du tout premier tableau. Donc la deuxième méthode est aussi à proscrire.