J'ai un très long tableau unidimensionnel d'entiers positifs. À partir d'une extrémité, j'ai besoin de trouver les plus longues tranches/morceaux du tableau qui ont des valeurs qui sont à au moins un nombre de tous les constituants de cette tranche.Recherche les plus longues tranches d'un tableau contenant des valeurs séparées
C'est-à-dire que je souhaite effectuer un partitionnement du tableau (en partant de la gauche) de sorte que chaque partition contienne des éléments éloignés de tous les autres éléments de cette partition.
Par exemple:
- [1,1,9,5,3,8,7,4,1,2] -> [1], [1,9,5,3], [ 8], [7,4,1], [2]
- [1,5,9,1,3,6,4,2,7,0] -> [1,5,9], [1 , 3,6,4], [2,7,0]
Ci-dessous, j'ai écrit un petit code en Fortran qui me permettra de trouver le premier point de récurrence d'une valeur précédente.
- masque est un tableau LOGIQUE tableau
- est le tableau en question
- n est la longueur du tableau
Je peux facilement étendre ce pour trouver la partition complète. Donc, ma question est, y a-t-il une meilleure façon (alorithme) de faire cela? Quand je dis mieux, je veux dire la vitesse. Cela ne me dérange pas un coût de mémoire.
@ d_1999 Oh, ce que je veux, c'est un partitionnement tel que chaque tranche n'ait que des nombres éloignés de plus de 1 de tout autre constituant de cette tranche. – physkets
Si vous n'avez pas besoin d'une solution de diffusion en continu, un deuxième tableau des deltas peut être calculé, puis rompez le tableau (de sortie) aux points où vous avez les zéros dans le tableau delta. Obtenir du code vectorisé pour les deltas devrait être facile avec -O3 ou un peu comme un pragma! DIR? SIMD ou!? OMP SIMD (OpenMP) sont faciles. Ensuite, le masque peut toujours être utilisé pour montrer où se trouve le zéro. Cela dépend de la taille d'un très long tableau (?), Mais vous dites que la mémoire n'est pas un problème ... Vous devriez pouvoir limiter la bande passante sur la partie delta vectorisée. Le masque peut également être un nombre entier pour suivre la sous-section du tableau. – Holmz
Juste quelques réflexions: Dans votre premier exemple, est-ce que vous avez autorisé '9' et' 8' à apparaître dans la même tranche? Ne devrait-il pas être [1], [1,9,3], [8], [7,4,1], [2] '? Aussi, cela suit votre règle de * à partir de la gauche *. Dans un cas '[1,1,9,3,8,10,5,1]' voudriez-vous '[1], [1,9,3], [8,10,5,1]' (gauche) ou voulez-vous ramasser la tranche maximale plus longue '[1], [1,9], [3,8,10,5,1]'. – Steve