Рубрики
Без рубрики

Estructuras de Datos Para Network Engineers 101: LAS Linked Lists

ES рекомендуется Tener Manejo del Lenguaje de Programación Python 3, También Conocimientos EN Программа … Помечено сетью, LinkedList, структурой данных, Python.

Estructura de Datos Para Networking (5 серии деталей)

ES рекомендуется Tener Manejo del Lenguaje de Programación Питон 3 , También Conocimientos en Programación Orientada A objetos (Poo) . Нет эстратмента necesario, pero si cattere, tener por lo menos nociones del concepto Магические методы (методы Dundder) de Python.

Es Muy Вероятно, Que Cundo se hable de Organizar Datos de manera secuencial tu primera opción sea intentar utilizar un array (conocido por algunos como arreglo) o Lista, Y Bueno, No Te Culpo, También era el mío antes de conocer por Нет Está mal USAR Dichas Estructuras, Pero Exceed Otras Alternativas para situaciones, особенно Que harán que tus infertaciones sean más fáciles, seguras yficientes.

¿КОВЕРСКИЕ СПИСОК?

Связанный список o Lista Enlazada ( aquí utilizaremos anglicismos 😜) es una estructura de datos lineal, compuesta por objetos llamados Nodos , Los Cuales Están Referenciados unos contros y no necesariamente porque etéth ubicados continuamente en bloques de memoria, como pasa tradicionalmente con los Массивы Анкет

Memoria Volátil ( como la ram ), en el caso de los arreglos, se colocan todos los intergantes uno al lado del otro en Bloques de Memoria непрерывные. Por ejemplo, Supongamos que se tiene lo siguiente:

frutas = ['pizza', 'banana', 'naranja', 'pera', 'piña', 'melón']

La 🍕 нет es en una fruta pero a veces le eechan tanta piña que parece una 😪.

La manera como se aloja en bloques de memoria continuos es la siguiente:

Нота : en la Imagen semum UCS-4 , lo que vipplica que se ocupan 4 байт por caracter.

En El Caso de Las Linked List, No Es Necesario, Sino, Que Los Integrantes (O Nodos) de Dicha Lista Pueden Estar En Bloques de Memoria Bastante Alejados O Bastante Cerca:

Си, я sé … Te estás preguntando que quiere decir eso, déjame ilustrarte:

Hasta Este Punto tenemos una exlicación más clara que concluye en que las linked list son un grupo de nodos que se seerencian entre sí. SIN EMBARGO, FALTA UN DETALLE WATTERE, BUENO, DOS DETALLES WATTERES 😅. Lo Primero es Que nuestro objeto de Linked List No almacena por si solo los nodos, Sino que esta guarda una unda selicencia soulo al primer nodo, el cual se llama Голова (o Кабеза). Эль Глава , Su Vez Guarda Selichencia al nodo siguiente, y así mismo el nodo siguiente al que le le sigue, hasta llegar al último, el cual tiene que apuntar ana dirección de Memoria vacya o de Valor Nulo , Esto es Porque En Una Linked List Todos Los Nodos Deben de Estar Apuntando «алго».

Ya que sabemos más o menos los foundamementos, te estarás preguntando sobre las ventajas de sobre las listas o arrays, bueno, реальный Ciertas ventajas que murieron con la utilización de los Lenguajes de Alto Nivel , ya que estos en su mayoría son seon de ajustar dinámicamente los tamaños de los bloques de memoria, ya que tradicionalmente eran fijos, también outmenten tener objetos de diferentes tipos ena masma estructura. Нет препятствия, La Verdadera Ventaja de Esta Estaructura es eceso secuencial de la, Lo Cualcys Areakión de Otras Estructuras Muy Vatives Que Veremos más Adelante. Ya Verás: Twink:.

Podemos Hacer Moadas Operaciones Como Las Linked List, Así Como Insertar Elementos, Buscar Elementos, Entre Otras Más. SIN EMBARGO, LA Más Vating Es La DE Recorrer La Linked List, Ya Que todas las demás se apoyan en esta, es decir, siempre hay que recorr la linked list. Si Quieres Sabre Sobre Más Operaciones Que Se Se Pueden Hacer Con Las Linked List , te Invito a ver esto Анкет También Exceeden OTRAS Варианты DE Linked List , сын Файлс де -Зендер Se Se Aplican Los Conceperos explicados aydermente, sin embargo, no las estaremos utilizando a lo largo de esta serie y eso no me подержал бы яв. Si Tu Aplicación Demonda Dichas Implantaciones, Ensconces Adelante.

Haciendo nuestra propia linkedlist

CABE DESTACAR QUE LA ESTRUCTURA DE DATOS Список de Python, Puede utilizarse Como Una Linked List, De Hecho Tiene Métodos par Коллекции que contiene una estructura llamada Deque La Cual Funciona parecido. En nuestro caso, haremos la nuestra para fines de explicación de la infulación. En la Vida Real, Estas Estructuras ya construidas por el lenguaje que utilicemos nos ahorran tiempo y son más eficientes.

Primero, Empezamos Creando Los Nodos, Estos Serán Los objetos Que almacenaremos en nuestra Linked List, EJ.: Пицца, банан, пера и т. Д. Анкет La Estrategia es que el nodo pueda hacer serfice al objeto que tendrá como valor y al nodo siguiente.

class Node:

  def __init__(self, value=None, next=None):
    self.value = value
    self.next = next

HASTA AQUI NO CREO QUE LA COSA SE COMPARICE 😬. Tenemos un objeto nodo que posee un valor y una referencia de quien le sigue. Пор Ло Tanto, si yo creo un nodo, le doy su Valor y el del nodo que le le sigue, si no tienen ningún otro, Ensonces Apunta a Нет , Así Voy Creando Mi Linked List.

ОК, oversio que no es todo … ¿Cómo Puedo Sabre Cual Es El Голова de mi lista? … Нет Пуэди Понер Дичо Обжето В твердом кодировании en mi código porque si cambia en alguna parte de este, tendré un tremendo lío con la referencia. Por Lo Tanto, Tenemos Que Crear un objeto связанный список Que Siempre Guarde Una Serformencia en el Atributo Head ( tal como lo habíamos dicho antes ) y también efectué todas las operaciones necesarias sobre la lista, сказки Como Recorrerla, Voltearla, Añadir Otros nodos, Extreerlos и т. Д.

class LinkedList:
  def __init__(self, head=None, l=None):

    # Referencia al nodo head
    self.head = head

    # Si se pasó una lista como argumento, se crea una Linked List
    if l is not None:
      # Selecciona el primer elemento de la lista como la cabeza
      self.head = Node(l[0])
      current_node = self.head

      list_len = len(l)
      # Itera sobre la lista, si el elemento en curso es el ultimo
      # apunta su siguiente nodo a None
      for i in range(1, list_len):
        current_node.next = Node(l[i])

        if i == list_len:
          current_node.next = None

        else:
          current_node = current_node.next

  # Magic method para recorrer la Linked List
  # Este metodo se llama cuando se está recorriendo la Linked List
  def __iter__(self):
    node = self.head
    # Retorna cada nodo en la iteración correspondiente
    while node is not None:
      yield node
      node = node.next

  # Magic method que retorna la longitud de la lista
  def __len__(self):
    count = 0

    # Itera la Linked List mientras cuenta cada elemento
    for node in self:
      count += 1

    return count

  # Magic method que retorna el nodo, dado un indice a la entrada 
  def __getitem__(self, item):
    current = self.head
    count = 0

    # Retorna el valor del nodo si el item es un entero
    while count != idx:
      current = current.next
      count += 1
    return current

  # Inserta un nodo al final de la Linked List
  def append(self, item: Node):
    #Si no hay nodo, entonces lo inserta como Head
    if self.head is None:
      self.head = item
      self.head.next = None
      return None

    # Busca el último nodo y lo apunta al nodo a insertar
    for node in self:
      if node.next is None:
        node.next = item
        item.next = None

Podemos añadir más métodos para hacer más operaciones con nuestra linked, pero lo vamos a dejar hasta ahí el el mompo para no crearte un stackoverflow 😫 😵 en el 🧠. La Idea Es Que Eniendas el Concepto de Esta Estructura, Las Demás Operaciones las estaremos viendo conforme salgan los otros посты.

Aplicando lo aprendido

Para poner en práctica lo explicado anthermente, vamos a utilizar nuestro código y haremos un Reproductor de Tracklists como el de spotify ( más sencillo ). En Dado Caso Que no quieras utilizar lo Que se creó más arriba, puedes utilizar las estructuras nativas de python que te mencioné y tomarlo como ejercicio, esto si no sabes sobre poo, más adelante haré una serie al desetro.

Para Esto, Consumberemos un API de Discogs Que nos proporcione los tracklist de acuerdo a leases de los artistas, elegiremos cual Queremos Reproducir y Podremos Cambiar de canción o трек ( avanzar a la siguiente y/o Volver a la передняя ).

Nota : esto no es en un tuporming para apis apis, esta parte la puedes oversiar, te puedes hacer de cuenta que es una función que llamas Y TE DA UNA LISTA DE TRACKS. De Todos Modos, Pondré el Código Por Si Alguien Se Anima A Querer intenderlo, нет Tiene Muga Complejidad Анкет

import time
import requests
from random import sample

def get_tracklists(artist_id:int=57620, releases_n:int = 5) -> list:
  # Url para obtener los releases 
  url = "https://api.discogs.com/artists/{}/releases".format(artist_id)
  response = requests.request("GET", url,).json()['releases']
  releases = [(release['id'], release['title']) for release in response if release['type'] == 'master']

  # Filtrando la data y obteniendo el campo de releases
  random_rels = sample(releases, k=releases_n) 

  # Url para obtener información acerca de los releases
  url = "https://api.discogs.com/masters/{}"
  tracklists_names = []

  # Separando los tracklist de cada reseale
  for rel in random_rels:
    tracklists = requests.request('GET', url.format(rel[0])).json()['tracklist']
    # Tiempo de delay para que api.discogs.com no niegue los responses
    # debido a la velocidad en un corto lapso de tiempo
    time.sleep(0.5)

    tracklists_names.append({rel[1]: [track['title'] for track in tracklists if track['type_'] == 'track']})

  return tracklists_names

En resumen, la funcion retorna una lista con varios diccionarios, en los cuales cada ключ es el nombre de un Выпуск En Offictifico de un Artista en, особенно ( para el ejemplo he cogido a buddy rich ), el value de cada uno sería una dista de las canciones o треки PerteneCientes Dicho Выпуск Анкет

Para Crear Nuestra App de Nuestro Reproductor, Tendríamos lo Siguiente:

from apis import get_tracklists
from linked_list import LinkedList, Node

def app():
  # Obtiene la lista de los releases con sus repectivos tracklists
  releases = get_tracklists()
  current_rel, current_track = 'No release selected', Node('No track selected')

  #Linked List para manejar los tracks
  tracklist = LinkedList()

  # String de las opciones del menu
  main_menu = """

Main menu 
===================

1. Select Release
2. Next track
3. Previous track
4. Exit
Current Release: {}
Current Track: {}

Select an option: """

  while True:
    # Guarda la opcion seleccionada en el menu
    selection = input(main_menu.format(current_rel, current_track.value))

    if selection == '1':
      # Construye el menu de releases
      # Para fines de este tutorial, no se abundará esta parte
      rel_menu = lambda rel_list: ''.join(['{}- {} \n'.format(index, list(rel.keys())[0]) for index, rel in zip(range(1, len(rel_list)+1), rel_list)])
      releases_menu = """

Releases Menu
=====================

{}

Select an option: """

      # Captura la selección del release
      release_selection = input(releases_menu.format(rel_menu(releases)))

      # Guarda el release seleccionado en el menu
      # El release contiene una lista con los tracklist
      rel_dic = releases[int(release_selection)-1]
      rel_name = list(rel_dic.keys())[0]
      rel_tracks = list(rel_dic.values())[0]

      # Actualiza la Linked List a una con el tracklist seleccionado 
      tracklist = LinkedList(l=rel_tracks)
      # Asigna los valores para el release seleccionado,
      # y el track en reproduccion como el head de la Linked List
      current_rel, current_track = rel_name, tracklist.head

    # Para cambiar al siguiente solo se asigna el nodo siguiente al track actual
    elif selection == '2':
      if current_track.next:
        current_track = current_track.next

    # Para volver atrás se recorre la lista hasta que el nodo siguiente
    # del iterado sea el del track actual 
    elif selection == '3':
      for track in tracklist:
        if track.next == current_track:
          current_track = track

    # Sale de la aplicación
    elif selection == '4':
      break

Вывод

Post, iremos Adentrándonos más Adelante.

Te dejo el código en repl.it del resultado final para que queedas correrlo tu mismo.

Estructura de Datos Para Networking (5 серии деталей)

Оригинал: “https://dev.to/jorgmassih/estructuras-de-datos-para-network-engineers-101-las-linked-list-50n9”