Jump to content
Sign in to follow this  
  • entries
    5
  • comments
    0
  • views
    445

Estructuras de datos - Básico Parte 1

francoe1

124 views

 

Teoría

Para cualquier proyecto necesitamos utilizar estructuras de datos, por lo general listas y arreglos. En este blog intentaré compartir mi experiencia y algunas técnicas para trabajar con listas de forma estructurada y organizada, explicare como implementar querys y veremos ejemplos comparativos entre diferentes alternativas.

Existen múltiples tipos de estructura de datos, diferentes tipos de listas, pero en este blog solo hablaremos de arreglos y listas enlazadas.

¿Listas o Arreglos?
Dependiendo de la implementación lo más importante es entender de forma sencilla la principal diferencia.

¿Cómo funciona un arreglo? un arreglo es un grupo de elementos que se escriben en memoria de forma continua reservando el lugar que va a ocupar según su dimensión. Si creamos un arreglo del tipo Int32 quiere decir que la memoria deberá asignar 32bits multiplicado el largo del arreglo, entonces ¿cómo se separa la información para luego poder ser indexada?, esto es bastante simple, el arreglo almacena únicamente la dirección de memoria del primer elemento, para acceder a otro elemento tiene que sumar el tamaño del tipo por el índice requerido.

main-qimg-717d971bdb4bb63c97c04cbceb1ac2f2.png

Entonces se puede decir, en simples palabras, que un arreglo guarda la posición del primer elemento y reserva la memoria para poder escribir los siguientes elementos de forma continua.

¿Cómo funcionan las listas enlazadas?, esto es más fácil de entender, las listas guardar la dirección de memoria del primer elemento, pero a diferencia de un arreglo cada elemento de una lista se define como un nodo que contiene, la dirección de memoria de su propio valor y la dirección de memoria del nodo de su predecesor, de esta forma es posible iterar las listas.

image.png

Con el breve resumen anterior podemos llegar a una conclusión.

  • Arreglos
    • Asigna la memoria al ser inicializado
    • No se pueden agregar o eliminar elementos de forma dinámica
    • No requiere información extra para acceder a cada elemento.
  • Listas
    • Asigna la memoria de forma dinámica
    • Se puede agregar y eliminar elementos de forma dinámica. 
    • Requiere información extra para acceder a cada elemento.

¿Que debería utilizar?
Lo mejor siempre es identificar el contexto, se debería utilizar listas cuando: no conocemos la cantidad de elementos que puede contener o necesitamos agregar y eliminar elementos constantemente, para lo demás se debería utilizar arreglos. es importante destacar que un arreglo itera más rápido que una lista, las razones son obvias.


Implementación en videojuegos

Pensemos en un contexto simple, un juego de destruir naves. Cuando inicia debe crear 5 naves, una vez destruidas se volverán a crear agregando 5, el limite máximo de naves será de 30.

Implementación con arreglos.

Spoiler

public class Nave
{
    
}

public class GameManager
{
    public Nave[] Naves = new Nave[30];
    
    public int CantidadAnterior = 0;
    
    
    public void IniciarOleada()
    {
        CantidadAnterior += 5;
        for(int i = 0; i < CantidadAnterior; i++)
            Crear();
    }    
    
    public int NavesActivas()
    {
        int count = 0;
        for(int i = 0; i < Naves.Length; i++)
        {
            if (Naves[i] != null)
                count ++;
        }
        return count;
    }
    
    public void Destruir(Nave nave)
    {
        for(int i = 0; i < Naves.Length; i++)
        {
            if (Naves[i] == nave)
            {
                Naves[i] = null;
                break;
            }
        }
    }
    
    public Nave Crear()
    {
        for(int i = 0; i < Naves.Length; i++)
        {
            if (Naves[i] is null)
            {
                Naves[i] = new Nave();
                return Naves[i];                
            }
        }
        
        throw new Exection("No hay espacio para crear una nueva nave");
    }
}

 

Implementación con Listas.

Spoiler

public class Nave
{
    
}

public class GameManger
{
    public List<Nave> Naves = new List<Nave>();    
    public int CantidadAnterior = 0;   
    
    public void IniciarOleada()
    {
        CantidadAnterior += 5;
        for(int i = 0; i < CantidadAnterior; i++)
            Crear();
    }    
    
    public int NavesActivas()
    {
        return Naves.Count;
    }
    
    public void Destruir(Nave nave)
    {
        Naves.Remove(name);
    }
    
    public Nave Crear()
    {
        if (Naves.count >= 30)
            throw new Exection("No hay espacio para crear una nueva nave");
        
        Nave nave  = new Nave();
        Naves.Add(nave);         
        return nave;
    }
}

 

 



0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...