Visualizador de búsqueda de interpolación usando PyQt5

En este artículo veremos cómo podemos hacer una aplicación PyQt5 que visualizará el algoritmo de búsqueda de interpolación .
La búsqueda de interpolación es una mejora sobre la búsqueda binaria para instancias, donde los valores en una array ordenada se distribuyen uniformemente. La búsqueda binaria siempre va al elemento central para verificar. Por otro lado, la búsqueda por interpolación puede ir a diferentes ubicaciones según el valor de la clave que se busca. Por ejemplo, si el valor de la clave está más cerca del último elemento, es probable que la búsqueda por interpolación comience la búsqueda hacia el lado final.
 

Pasos de implementación de la GUI:
1. Cree una lista de etiquetas de acuerdo con la lista de números dada 
2. Establezca su texto, borde, color y geometría con un espacio respectivo entre sí 
3. La altura de cada etiqueta debe ser proporcional al valor de cada número 
4. Cree un botón de inicio y pausa para iniciar la búsqueda y pausar la búsqueda 
5. Cree una etiqueta de resultado para mostrar el estado de la búsqueda
Pasos de implementación de back-end: 
1. Cree una lista de etiquetas correspondiente a los números dados 
2. Cree una variable para la parte inferior índice superior y de posición y bandera para buscar 
3. Agregar acción al botón pulsador su acción debe cambiar el estado de la bandera, es decir, la acción de inicio debe hacer que la bandera sea verdadera y la acción de pausa debe hacer que la bandera sea falsa. 
4. Cree un objeto de temporizador que llame a un método después de cada tiempo específico 
5. Dentro del método de temporizador, verifique si la bandera es verdadera, comience el algoritmo de búsqueda de interpolación 
6. Verifique si el valor se encuentra dentro del rango, si no muestra la salida como no encontrada, de lo contrario, continúe 
7. Si el índice del índice inferior es mayor que el índice superior, detenga la búsqueda y muestre el resultado como no encontrado 
8. Calcule el índice de posición a través de la fórmula de búsqueda de interpolación 
9. Compruebe si el valor deseado está en el índice de posición si las coincidencias muestran el resultado como encontrado 
10. Si el valor deseado no es igual, actualice el índice inferior y superior de acuerdo con el valor deseado. 
 

A continuación se muestra la implementación. 
 

Python3

# importing libraries
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
 
 
class Window(QMainWindow):
 
    # list of numbers
    number = [10, 12, 13, 16, 18, 19, 20, 21,
                  22, 23, 24, 33, 35, 42, 47]
 
    # desired value
    desired = 24
    def __init__(self):
        super().__init__()
 
        # setting title
        self.setWindowTitle("Interpolation Search ")
 
        # setting geometry
        self.setGeometry(100, 100, 600, 400)
 
        # calling method
        self.UiComponents()
 
        # showing all the widgets
        self.show()
 
    # method for widgets
    def UiComponents(self):
 
        # start flag
        self.start = False
 
        # list to hold labels
        self.label_list = []
 
        # position for keeping index
        self.position = 0
 
        # lower index
        self.lo = 0
 
        # higher index
        self.hi = len(self.number) - 1
 
        # local counter
        c = 0
 
        # iterating list of numbers
        for i in self.number:
 
            # creating label for each number
            label = QLabel(str(i), self)
 
            # adding background color and border
            label.setStyleSheet("border : 1px solid black;
                                 background : white;")
 
            # aligning the text
            label.setAlignment(Qt.AlignTop)
 
            # setting geometry using local counter
            # first parameter is distance from left
            # and second is distance from top
            # third is width and forth is height
            label.setGeometry(50 + c * 30, 50, 20, i * 2 + 10)
 
            # adding label to the label list
            self.label_list.append(label)
 
            # incrementing local counter
            c = c + 1
 
 
        # creating push button to start the search
        self.search_button = QPushButton("Start Search", self)
 
        # setting geometry of the button
        self.search_button.setGeometry(100, 270, 100, 30)
 
        # adding action to the search button
        self.search_button.clicked.connect(self.search_action)
 
        # creating push button to pause the search
        pause_button = QPushButton("Pause", self)
 
        # setting geometry of the button
        pause_button.setGeometry(100, 320, 100, 30)
 
        # adding action to the search button
        pause_button.clicked.connect(self.pause_action)
 
        # creating label to show the result
        self.result = QLabel("To search : " + str(self.desired), self)
 
        # setting geometry
        self.result.setGeometry(350, 280, 200, 40)
 
        # setting style sheet
        self.result.setStyleSheet("border : 3px solid black;")
 
        # adding font
        self.result.setFont(QFont('Times', 10))
 
        # setting alignment
        self.result.setAlignment(Qt.AlignCenter)
 
        # creating a timer object
        timer = QTimer(self)
 
        # adding action to timer
        timer.timeout.connect(self.showTime)
 
        # update the timer every 200 millisecond
        timer.start(200)
 
    # method called by timer
    def showTime(self):
 
        # checking if flag is true
        if self.start:
 
            # Interpolation Search
            # checking if desired number is with in the range
            if (self.desired < self.number[self.lo] or
                  self.desired > self.number[self.hi]):
 
                # make flag false
                self.start = False
                # show result as not found
                self.result.setText("Not Found")
 
            # if lower index become greater then higher index
            if self.lo > self.hi:
 
                # make flag false
                self.start = False
                # show result as not found
                self.result.setText("Not Found")
 
            else:
                # lower index is equal to higher index
                if self.lo == self.hi:
 
                    # checking if it matches desired value
                    if self.number[self.lo] == self.desired:
 
                        # show result
                        self.result.setText("Found at index : " + str(self.lo))
                        # make result label color green
                        self.label_list[self.lo].setStyleSheet(
                                     "border : 2px solid green;"
                                     "background-color : lightgreen;")
 
                    else:
                        # make result color grey
                        self.label_list[self.lo].setStyleSheet(
                                     "border : 1px solid black;"
                                     "background-color : grey;")
 
                # Probing the position with keeping
                # uniform distribution in mind.
                self.position = self.lo + int(((float(self.hi - self.lo) /
                        ( self.number[self.hi] - self.number[self.lo])) *
                          (self.desired - self.number[self.lo])))
 
                # checking if the position matches with desired value position
                if self.number[self.position] == self.desired:
 
                    # make flag false
                    self.start = False
 
                    # show result and make label color green
                    self.result.setText("Found at position : " + str(self.position))
                    self.label_list[self.position].setStyleSheet(
                                        "border : 2px solid green;"
                                        "background-color : lightgreen;")
 
                else:
 
                    # make label color grey
                    self.label_list[self.position].setStyleSheet(
                                      "border : 1px solid black;"
                                      "background-color : grey;")
 
                # If desired is larger, desired is in upper part
                if self.number[self.position] < self.desired:
                    # updating lowe index
                    self.lo = self.position + 1
 
                # If desired is smaller, desired is in lower part
                else:
                    # updating higher index
                    self.hi = self.position - 1
 
 
 
    # method called by search button
    def search_action(self):
 
        # making flag true
        self.start = True
 
        # showing text in result label
        self.result.setText("Started searching...")
 
    # method called by pause button
    def pause_action(self):
 
        # making flag false
        self.start = False
 
        # showing text in result label
        self.result.setText("Paused")
 
 
# create pyqt5 app
App = QApplication(sys.argv)
 
# create the instance of our Window
window = Window()
 
# start the app
sys.exit(App.exec())

Producción : 
 

Publicación traducida automáticamente

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