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

  1. 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
    
  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
    
  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]
    
  4. 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]
    
  5. 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']