Delta encoding⚓︎
Le codage par différence (delta encoding en anglais) permet de compresser un tableau de données en indiquant pour chaque donnée, sa différence avec la précédente (plutôt que la donnée elle-même). On se retrouve alors avec un tableau de données assez petites nécessitant moins de place en mémoire. Cette méthode se révèle efficace lorsque les valeurs consécutives sont proches.
Programmer la fonction delta_encoding
qui prend en paramètre un tableau non vide de nombres entiers et qui renvoie un tuple à deux éléments comprenant :
- En premier, la valeur initiale
- En second, le tableau des différences, contenant les valeurs entières compressées à l'aide de cette technique.
Exemples
>>> delta_encoding([1_000_000, 1_000_042, 1_000_040, 1_000_055, 1_000_010])
(1000000, [42, -2, 15, -45])
>>> delta_encoding([42])
(42, [])
Afin de gagner en lisibilité, Python autorise de placer un tiret-bas pour séparer les chiffres par paquets de trois. Ainsi 1_000_000
correspond bien à un million, et est plus lisible que 1000000
. En revanche, l'affichage en console d'un résultat ne l'utilise pas.
def deltapy-undencoding(valeurs):bksl-nl ...bksl-nlbksl-nlbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlassert deltapy-undencoding(bksl-nl [1py-und000py-und000, 1py-und000py-und042, 1py-und000py-und040, 1py-und000py-und055, 1py-und000py-und010]bksl-nl) == (1000000, [42, -2, 15, -45])bksl-nlbksl-nlassert deltapy-undencoding([42]) == (42, [])bksl-nlbksl-nldef deltapy-undencoding(valeurs):bksl-nl differences = [valeurs[i] - valeurs[i - 1] for i in range(1, len(valeurs))]bksl-nl return (valeurs[0], differences)bksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlassert deltapy-undencoding(bksl-nl [1py-und000py-und000, 1py-und000py-und042, 1py-und000py-und040, 1py-und000py-und055, 1py-und000py-und010]bksl-nl) == (1000000, [42, -2, 15, -45])bksl-nlbksl-nlassert deltapy-undencoding([42]) == (42, [])bksl-nlbksl-nl
A
Cette solution utilise une liste en compréhension.
Liste dynamique⚓︎
def delta_encoding(valeurs):
differences = []
for i in range(1, len(valeurs)):
differences.append(valeurs[i] - valeurs[i - 1])
return (valeurs[0], differences)
On pouvait aussi itérer de 0
à len(valeurs) - 1
def delta_encoding(valeurs):
differences = []
for i in range(len(valeurs) - 1):
differences.append(valeurs[i + 1] - valeurs[i])
return (valeurs[0], differences)
Z