Implementación de array dinámica en Python

¿Qué es una array dinámica?

Una array dinámica es similar a una array, pero con la diferencia de que su tamaño puede modificarse dinámicamente en tiempo de ejecución. No es necesario especificar el tamaño de una array de antemano. Los elementos de una array ocupan un bloque contiguo de memoria y, una vez creados, su tamaño no se puede cambiar. Una array dinámica puede, una vez que la array está llena, asignar una mayor cantidad de memoria, copiar el contenido de la array original a este nuevo espacio y continuar llenando las ranuras disponibles.

Usaremos una biblioteca integrada llamada ctypes of python. Consulte la documentación para obtener más información, pero básicamente se usará aquí como una array sin procesar del módulo ctypes.

Una nota rápida sobre los métodos públicos frente a los privados, podemos usar un guión bajo _ antes del nombre del método para que no sea público. Por ejemplo:

class M(object):
      
    def public(self):
        print 'Use Tab to see me !'
          
    def _private(self):
        print "You won't be able to Tab to see me !"
m = M()
m.public()
Output:
Use Tab to see me!
m._private()
Output:
You won't be able to see me!


Implementación de lógica de array dinámica:

La clave es proporcionar medios para hacer crecer una array A que almacene los elementos de una lista. En realidad, no podemos hacer crecer la array, su capacidad es fija. Si un elemento se agrega a una lista a la vez, cuando la array subyacente está llena, debemos realizar los siguientes pasos.

  1. Asigne un nuevo arreglo B con mayor capacidad (una regla comúnmente utilizada para el nuevo arreglo es tener el doble de capacidad que el arreglo existente)
  2. Establezca B[i]=A[i] , para i=0 a n-1 donde n denota el número actual de artículos.
  3. Establezca A = B , es decir, de ahora en adelante usamos B como la array de la lista de soporte.
  4. Inserta un nuevo elemento en la nueva array.

Implementación de código de array dinámica:

import ctypes
  
class DynamicArray(object):
    '''
    DYNAMIC ARRAY CLASS (Similar to Python List)
    '''
      
    def __init__(self):
        self.n = 0 # Count actual elements (Default is 0)
        self.capacity = 1 # Default Capacity
        self.A = self.make_array(self.capacity)
          
    def __len__(self):
        """
        Return number of elements sorted in array
        """
        return self.n
      
    def __getitem__(self, k):
        """
        Return element at index k
        """
        if not 0 <= k <self.n:
            # Check it k index is in bounds of array
            return IndexError('K is out of bounds !') 
          
        return self.A[k] # Retrieve from the array at index k
          
    def append(self, ele):
        """
        Add element to end of the array
        """
        if self.n == self.capacity:
            # Double capacity if not enough room
            self._resize(2 * self.capacity) 
          
        self.A[self.n] = ele # Set self.n index to element
        self.n += 1
  
     def insertAt(self,item,index):
        """
         This function inserts the item at any specified index.
        """
  
          
        if index<0 or index>self.n:
            print("please enter appropriate index..")
            return
          
        if self.n==self.capacity:
            self._resize(2*self.capacity)
              
          
        for i in range(self.n-1,index-1,-1):
            self.A[i+1]=self.A[i]
              
          
        self.A[index]=item
        self.n+=1
  
  
          
    def delete(self):
        """
        This function deletes item from the end of array
        """
  
        if self.n==0:
            print("Array is empty deletion not Possible")
            return
          
        self.A[self.n-1]=0
        self.n-=1
          
          
          
      
    def removeAt(self,index):
        """
        This function deletes item from a specified index..
        """        
  
        if self.n==0:
            print("Array is empty deletion not Possible")
            return
                  
        if index<0 or index>=self.n:
            return IndexError("Index out of bound....deletion not possible")        
          
        if index==self.n-1:
            self.A[index]=0
            self.n-=1
            return        
          
        for i in range(index,self.n-1):
            self.A[i]=self.A[i+1]            
              
          
        self.A[self.n-1]=0
        self.n-=1
  
          
    def _resize(self, new_cap):
        """
        Resize internal array to capacity new_cap
        """
          
        B = self.make_array(new_cap) # New bigger array
          
        for k in range(self.n): # Reference all existing values
            B[k] = self.A[k]
              
        self.A = B # Call A the new bigger array
        self.capacity = new_cap # Reset the capacity
          
    def make_array(self, new_cap):
        """
        Returns a new array with new_cap capacity
        """
        return (new_cap * ctypes.py_object)()
# Instantiate
arr = DynamicArray()
# Append new element
arr.append(1)
len(arr)
Output:
1
# Append new element
arr.append(2)
# Check length
len(arr)
Output:
2
# Index
arr[0]
Output:
1
arr[1]
Output:
2

Impresionante, ¡hicimos nuestra propia array dinámica! Juega con él y observa cómo cambia de tamaño automáticamente.

Publicación traducida automáticamente

Artículo escrito por $augata_debnath y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *