En este artículo veremos cómo podemos hacer una aplicación PyQt5 que visualizará el algoritmo de búsqueda Jump .
Al igual que la búsqueda binaria, la búsqueda por saltos es un algoritmo de búsqueda de arrays ordenadas. La idea básica es verificar menos elementos (que la búsqueda lineal) avanzando en pasos fijos o omitiendo algunos elementos en lugar de buscar todos los elementos.
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 el espacio respectivo entre sí
3. La altura de cada etiqueta debe ser proporcional al valor de cada número
4. Cree un inicio y pausar el botón para iniciar la búsqueda y pausar la búsqueda
5. Cree una etiqueta de resultado para mostrar el estado de la búsquedaPasos de implementación del algoritmo:
1. Cree una lista de etiquetas correspondiente a los números dados.
2. Crear variable para el índice de índice de salto y el índice de búsqueda lineal. Además, un contador y banderas para el proceso de búsqueda lineal y de salto.
3. Agregue una 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 del temporizador, busque la bandera. Si el indicador es verdadero, inicie la búsqueda de salto, verifique el indicador de salto si es verdadero, comience a saltar el índice.
6. Si el valor del índice de salto es igual al valor deseado, haga que la etiqueta sea verde y muestre el resultado a través de la etiqueta. Si el valor del índice es mayor, detenga el salto del índice y comience la búsqueda lineal.
7. Verifique el valor del índice a través de la búsqueda lineal, si lo encuentra, muestre a través de la etiqueta, de lo contrario, muestre el resultado como no encontrado.
A continuación se muestra la implementación:
# 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 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] def __init__(self): super().__init__() # setting title self.setWindowTitle("Jump 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 # linear search and binary search flag self.linear = False self.jump = True # list to hold labels self.label_list = [] # desired value self.desired = 11 # step size self.step = 4 # counter to calculate index self.counter = 0 # index used to jumping self.index = 0 # local index for linear search self.linear_index = 0 # 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 * 10 + 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 300 millisecond timer.start(500) # method called by timer def showTime(self): # checking if flag is true if self.start: # implementing jump search # implementing jumping gap if self.jump: # checking if jump index is greater then the length of list if self.counter * self.step >= len(self.number): # setting linear indes self.linear_index = self.index - self.step # setting counter value self.counter = 0 # making jumping false self.jump = False # making linear flag true self.linear = True # updating the index self.index = self.step * self.counter # checking if desired value get found if self.number[self.index] == self.desired: # stopping the search self.start = False self.jump = False # show result in the result label self.result.setText("Found at index : " + str(self.index)) # making the label color green self.label_list[self.index].setStyleSheet("border : 2px solid green;" "background-color : lightgreen;") # if not found else: # making the label color grey self.label_list[self.index].setStyleSheet("border : 1px solid black;" "background-color : grey;") # if index value is greater if self.number[self.index] > self.desired: # setting linear index self.linear_index = self.index - self.step # updating the counter value self.counter = 0 # making linear flag True self.linear = True # stopping the jumping self.jump = False # updating the counter self.counter += 1 # updating the index self.index = self.step * self.counter # if index exceeds the limit if self.counter * self.step >= len(self.number): # updating the linear search self.linear_index = self.index - self.step # updating the counter value self.counter = 0 # stopping the jumping self.jump = False # starting linear search self.linear = True # linear search if self.linear: # if counter become equal to steop if self.counter == self.step: # stop the search self.start = False # show result i.e not found self.result.setText("Not found") # if linear index is negative if self.linear_index < 0: # making it zero self.linear_index = 0 # checking value if found if self.number[self.counter + self.linear_index] == self.desired: # stop the search self.linear = False self.start = False # show result self.result.setText("Found at index : " + str(self.counter + self.linear_index)) # make label color green self.label_list[self.counter + self.linear_index].setStyleSheet( "border : 2px solid green;" "background-color : lightgreen;") # if not found else: # make label color grey self.label_list[self.counter + self.linear_index].setStyleSheet( "border : 1px solid black;" " background-color : grey;") # updating the counter self.counter += 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