Meilleur moyen de modifier un tableau en C?
J'ai un tableau qui contient une histoire de valeurs, et lors de l'ajout d'une nouvelle valeur, j'ai besoin de changer toutes les valeurs précédentes d'une position vers la gauche, perdre de la valeur la plus ancienne et faire de la place pour la prochaine.
Je pense à deux manières de le faire, en utilisant memmove:
memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr));
Ou en échangeant les pointeurs:
for (i = 0; i != sizeof(arr) - 1; i++) {
*(arr + i) = *(arr + i + 1);
}
Est-il une différence de performance entre les deux méthodes, et si non, que l'on serait conseillé?
Avez-vous envisagé de ne pas utiliser un tableau pour ce ou n'est-ce pas une option?
J'ai besoin de garder une trace de la dernière valeurs de X, donc je ne peux pas penser à tout plus logique de les stocker à l'exception d'un tableau.
Utiliser une file d'attente (vous pouvez toujours utiliser un tableau pour la mise en œuvre), et d'éviter à la mémoire de la copie. thelearningpoint.net/computer-science/...
Pourquoi ne pas utiliser un double-clos liste? De cette façon, vous obtenez O(X) la complexité de l'accès à vos X éléments, mais l'insertion d'éléments par voie rapide. Ce qui fonctionne le mieux à la fin dépend de l'application. Ne vous insérez un lot ou avez-vous accès à un grand nombre?
Ou de l'utilisation d'un tampon circulaire (garder un
J'ai besoin de garder une trace de la dernière valeurs de X, donc je ne peux pas penser à tout plus logique de les stocker à l'exception d'un tableau.
Utiliser une file d'attente (vous pouvez toujours utiliser un tableau pour la mise en œuvre), et d'éviter à la mémoire de la copie. thelearningpoint.net/computer-science/...
Pourquoi ne pas utiliser un double-clos liste? De cette façon, vous obtenez O(X) la complexité de l'accès à vos X éléments, mais l'insertion d'éléments par voie rapide. Ce qui fonctionne le mieux à la fin dépend de l'application. Ne vous insérez un lot ou avez-vous accès à un grand nombre?
Ou de l'utilisation d'un tampon circulaire (garder un
int head
d'index et de faire tous les accès % arraySize
).OriginalL'auteur Muis | 2013-09-02
Vous devez vous connecter pour publier un commentaire.
Ils ont à la fois la complexité en même temps. Toute autre différence dans la performance serait due à des circonstances spécifiques, tels que le PROCESSEUR, le compilateur, comment memmove est mis en oeuvre, et la taille de la matrice, de sorte que vous avez à mesurer le rendement de chaque chemin et de voir ce qui est le mieux.
OriginalL'auteur Vaughn Cato
Il y a une option plus rapide:
Un tampon circulaire où insérer, supprimer et lire sont tous O(1).
OriginalL'auteur Klas Lindbäck
Je ne pense pas qu'un tableau est la meilleure façon pour ce faire , essayez d'utiliser une liste, et vous n'aurez pas ce problème.
OriginalL'auteur Farouk Jouti
Vous pouvez utiliser le File d'attente FIFO mis en œuvre comme une liste ou un tableau. À partir de votre description, c'est la solution la plus simple.
OriginalL'auteur pkacprzak