Visualización de Merge sort usando Matplotlib

Prerrequisitos: Introducción a Matplotlib , Merge Sort

La visualización de algoritmos facilita su comprensión al analizar y comparar la cantidad de operaciones que tuvieron lugar para comparar e intercambiar los elementos. Para esto usaremos matplotlib, para trazar gráficos de barras para representar los elementos del arreglo,

Acercarse:

  1. Generaremos una array con elementos aleatorios.
  2. Se llamará al algoritmo en esa array y se usará la declaración de rendimiento en lugar de una declaración de retorno para fines de visualización.
  3. Daremos los estados actuales de la array después de comparar e intercambiar. Por lo tanto, el algoritmo devolverá un objeto generador.
  4. La animación de Matplotlib se utilizará para visualizar la comparación y el intercambio de la array.
  5. La array se almacenará en un objeto contenedor de barras matplotlib (‘bar_rects’), donde el tamaño de cada barra será igual al valor correspondiente del elemento en la array.
  6. El método incorporado FuncAnimation de la animación matplotlib pasará los objetos contenedor y generador a la función utilizada para crear la animación. Cada cuadro de la animación corresponde a una sola iteración del generador.
  7. La función de animación que se llama repetidamente establecerá la altura del rectángulo igual al valor de los elementos.

A continuación se muestra la implementación del enfoque anterior.

Python3

# import all the modules
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import axes3d
import matplotlib as mp
import numpy as np
import random
  
  
# function to recursively divide the arra
def mergesort(A, start, end):
    if end <= start:
        return
  
    mid = start + ((end - start + 1) // 2) - 1
      
    # yield from statements have been used to yield 
    # the array from the functions 
    yield from mergesort(A, start, mid)
    yield from mergesort(A, mid + 1, end)
    yield from merge(A, start, mid, end)
  
# function to merge the array
def merge(A, start, mid, end):
    merged = []
    leftIdx = start
    rightIdx = mid + 1
  
    while leftIdx <= mid and rightIdx <= end:
        if A[leftIdx] < A[rightIdx]:
            merged.append(A[leftIdx])
            leftIdx += 1
        else:
            merged.append(A[rightIdx])
            rightIdx += 1
  
    while leftIdx <= mid:
        merged.append(A[leftIdx])
        leftIdx += 1
  
    while rightIdx <= end:
        merged.append(A[rightIdx])
        rightIdx += 1
  
    for i in range(len(merged)):
        A[start + i] = merged[i]
        yield A
  
# function to plot bars
def showGraph():
      
    # for random unique values
    n=20
    a=[i for i in range(1, n+1)]
    random.shuffle(a)
    datasetName='Random'
      
    # generator object returned by the function
    generator = mergesort(a, 0, len(a)-1)
    algoName='Merge Sort'
      
    # style of the chart
    plt.style.use('fivethirtyeight')
      
    # set colors of the bars
    data_normalizer = mp.colors.Normalize()
    color_map = mp.colors.LinearSegmentedColormap(
        "my_map",
        {
            "red": [(0, 1.0, 1.0),
                    (1.0, .5, .5)],
            "green": [(0, 0.5, 0.5),
                      (1.0, 0, 0)],
            "blue": [(0, 0.50, 0.5),
                     (1.0, 0, 0)]
        }
    )
  
    fig, ax = plt.subplots()
      
    # bar container 
    bar_rects = ax.bar(range(len(a)), a, align="edge", 
                       color=color_map(data_normalizer(range(n))))
      
    # setting the limits of x and y axes
    ax.set_xlim(0, len(a))
    ax.set_ylim(0, int(1.1*len(a)))
    ax.set_title("ALGORITHM : "+algoName+"\n"+"DATA SET : "+datasetName, 
                 fontdict={'fontsize': 13, 'fontweight': 'medium', 
                           'color' : '#E4365D'})
      
    # the text to be shown on the upper left
    # indicating the number of iterations
    # transform indicates the position with 
    # relevance to the axes coordinates.
    text = ax.text(0.01, 0.95, "", transform=ax.transAxes, 
                   color="#E4365D")
    iteration = [0]
  
    def animate(A, rects, iteration):
        for rect, val in zip(rects, A):
              
            # setting the size of each bar equal 
            # to the value of the elements
            rect.set_height(val)
        iteration[0] += 1
        text.set_text("iterations : {}".format(iteration[0]))
      
    # call animate function repeatedly
    anim = FuncAnimation(fig, func=animate,
        fargs=(bar_rects, iteration), frames=generator, interval=50,
        repeat=False)
    plt.show()
  
showGraph()

Producción:

Publicación traducida automáticamente

Artículo escrito por maryamnadeem20 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 *