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