31. Desplaçament de dades¶
El desplaçament de dades es refereix a l’acció de traslladar dades d’un lloc a un altre de memòria. És una operació que es realitza en moltes ocasions, per exemple, en els algoritmes de gestió, que veurem a les següents unitats.
Nota
En el llenguatge Python hi ha mètodes eficients per realitzar desplaçaments de dades. Aquests mètodes es basen en l’ús de llesques, l’assignació de tuples i les funcions d’inserció i esborrades d’elements a les llistes. Tanmateix, en aquesta unitat i a continuació, no s’utilitzaran aquests mètodes de desplaçament de dades eficients a Python. El propòsit és adquirir una comprensió a un nivell inferior de com es duen a terme aquestes operacions, que poden ser aplicables en qualsevol altre llenguatge de programació.
Intercanvi de dades¶
És habitual que un programa intercanviï les dades de dues variables o dues posicions d’una llista. Per intercanviar les dades, utilitzarem una variable temporal intermèdia
bajo = 200
alto = 100
# Intercambiamos los datos entre sí.
temp = bajo
bajo = alto
alto = temp
Un altre exemple pot trobar llistes de dades. En el cas següent, ordenarem una llista de números que no estiguin ordenats, intercanviant els dos números del mitjà de la llista
lista = [ 1, 3, 2, 4 ]
temp = lista[1]
lista[1] = lista[2]
lista[2] = temp
Desplaçament dret¶
Si hem de desplaçar molts números d’una llista, el procediment serà similar al de l’intercanvi de dades, però una mica més.
En l'exemple següent, hem de moure l'últim element d'una llista al començament de la llista per ordenar tots els números
lista = [ 1, 2, 3, 4, 5, 0 ]
# ^---------------┘
Es tracta d’una operació similar a l’intercanvi. Implica traslladar tots els números al dret de deixar un espai lliure al començament de la llista, que és on finalment col·locarem el número 0.
Per començar, guardarem el valor de l’últim element en una variable intermèdia
temp = lista[5]
Ara movem tots els elements, tret de l’últim, a la dreta. Per no trepitjar els valors, haureu de començar per la dreta
lista[5] = lista[4]
# [ 1, 2, 3, 4, 5, 5 ]
i continueu cap a l’esquerra
lista[4] = lista[3]
# [ 1, 2, 3, 4, 4, 5 ]
lista[3] = lista[2]
# [ 1, 2, 3, 3, 4, 5 ]
lista[2] = lista[1]
# [ 1, 2, 2, 3, 4, 5 ]
lista[1] = lista[0]
# [ 1, 1, 2, 3, 4, 5 ]
Finalment copiem el valor de la variable temporal La primera posició de la llista a l'esquerra del conjunt, per obtenir la llista completament ordenada
lista[0] = temp
# [ 0, 1, 2, 3, 4, 5 ]
Aquestes operacions es poden accelerar mitjançant un `` `` ``, de manera que el programa final seria el següent
lista = [ 1, 2, 3, 4, 5, 0 ]
final = len(lista) - 1
temp = lista[final]
for i in range(final, 0, -1):
lista[i] = lista[i - 1]
lista[0] = temp
print(lista)
La sortida del programa serà la llista ordenada
[0, 1, 2, 3, 4, 5]
Desplaçament esquerre¶
Aquest cas és similar al anterior, però ara volem moure les dades en el sentit contrari.
En l'exemple següent, hem de moure el primer element d'una llista al final de la llista per demanar tots els números
lista = [ 5, 0, 1, 2, 3, 4 ]
# └---------------^
Aquesta operació implica traslladar tots els números a l'esquerra per deixar un espai lliure al final de la llista, que és on col·locarem el número 5.
El programa final serà el següent
lista = [ 5, 0, 1, 2, 3, 4 ]
final = len(lista) - 1
temp = lista[0]
for i in range(final):
lista[i] = lista[i + 1]
lista[final] = temp
print(lista)
La sortida del programa serà la llista ordenada
[0, 1, 2, 3, 4, 5]
Exercicis¶
Escriviu un programa que intercanvi les dades de les variables següents de manera que cada variable conté el número que correspon al seu nom. Recordeu utilitzar una variable temporal
uno = 2 dos = 1 ... ... print(uno, dos)
Sortida
1 2
Escriviu un programa que intercanvi les dades de les variables següents de manera que cada variable conté el número que correspon al seu nom. Recordeu utilitzar una variable temporal
uno = 3 dos = 1 tres = 2 ... ... print(uno, dos, tres)
Sortida
1 2 3
Escriviu una funció que mogui tots els elements d’una llista a l’esquerra. El primer element ha de desaparèixer i a l’últim element s’assignarà el segon paràmetre de la funció.
Exemple
lista = [0, 1, 2, 3, 4, 5] desplaza_izquierda(lista, 7) print(lista)
Sortida
[1, 2, 3, 4, 5, 7]
Escriviu una funció que mogui els elements d’una llista a la dreta, però només a una posició donada pel seu segon paràmetre, la variable `` min``. L’últim element de la llista s’ha de situar a la posició `` min``. Comproveu que la funció funcioni correctament amb els exemples següents.
Exemple 1
lista = [0, 1, 2, 3, 4, 5] desplaza_derecha(lista, 3) print(lista)
Sortida
[0, 1, 2, 5, 3, 4]
Exemple 2
lista = [0, 1, 2, 3, 4, 5] desplaza_derecha(lista, 1) print(lista)
Sortida
[0, 5, 1, 2, 3, 4]
Escriviu una funció que traslladi els elements d’una llista a l’esquerra, a l’element donat pel seu segon paràmetre, la variable `` min``. Un cop realitzat el desplaçament, l’últim element de la llista s’ha d’assignar al valor que hi havia a la posició `` min``.
Exemple
lista = ['a', 'b', 'c', 'd', 'e', 'f'] desplaza_izquierda(lista, 1) print(lista)
Sortida
['a', 'c', 'd', 'e', 'f', 'b']