En este artículo veremos cómo podemos hacer una aplicación PyQt5 que visualizará el algoritmo de búsqueda exponencial.
La búsqueda exponencial también se puede utilizar para buscar en listas limitadas. La búsqueda exponencial puede incluso superar a las búsquedas más tradicionales de listas limitadas, como la búsqueda binaria, cuando el elemento que se busca está cerca del comienzo de la array. Esto se debe a que la búsqueda exponencial se ejecutará en tiempo O(log i), donde i es el índice del elemento que se busca en la lista, mientras que la búsqueda binaria se ejecutará en tiempo O(log n), donde n es el número de elementos en la lista.
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 una 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úsquedaPasos de implementación de back-end:
1. Crear una lista de etiquetas correspondiente a los números dados
2. Crear una variable para el índice utilizado por la búsqueda exponencial y otra variable utilizada por el índice de búsqueda binaria y la bandera para la búsqueda y la bandera para la búsqueda binaria y exponencial.
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 de temporizador, verifique que la bandera sea verdadera, comience el algoritmo de búsqueda exponencial
6. Verifique si el valor se encuentra dentro del rango, si no, muestre la salida como no encontrada, de lo contrario, continúe
7. Comience a encontrar el valor en el índice si lo encuentra, detenga la búsqueda y muestre el resultado; de lo contrario, duplique el valor del índice
8. Encuentre el rango en el que estaría el valor e inicie la búsqueda binaria y establezca el valor inferior y superior de la búsqueda binaria
9. Muestre el resultado con el ayuda de busqueda binaria
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("Exponential 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 self.binary = False self.expo = True # list to hold labels self.label_list = [] # desired value self.desired = 8 # Exponential Search variable self.index = 1 # binary search variable self.first = 0 self.last = len(self.number) - 1 self.mid = 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(300) # method called by timer def showTime(self): # checking if flag is true if self.start: # Exponential Search if self.expo: # if equal for index value 0 if self.number[0] == self.desired: # stop the searching self.start = False # show the result and make the label green self.result.setText("Found at index : 0" ) self.label_list[self.index].setStyleSheet( "border : 2px solid green;" "background-color : lightgreen") # if not equal else: # make the label grey self.label_list[0].setStyleSheet( "border : 1px solid black;" "background-color : grey") # double the value of index self.index = self.index * 2 # temporary stores index temp = self.index # checking if index is greater then the len of list if self.index >= len(self.number): # update the index self.index = len(self.number) - 1 # start binary search self.expo = False self.binary = True # set variable of binary search self.first = temp//2 self.last = self.index # if desired value is smaller if self.desired < self.number[self.index]: # start binary search self.expo = False self.binary = True # set binary search variables self.first = temp//2 self.last = self.index # if number is equal to the index value if self.number[self.index] == self.desired: # stop the search self.start = False # show result and make label color green self.result.setText("Found at index : " + str(self.index)) self.label_list[self.index].setStyleSheet( "border : 2px solid green;" "background-color : lightgreen") # if not equal else: # make label color grey self.label_list[self.index].setStyleSheet( "border : 1px solid black;" "background-color : grey") # binary search if self.binary: # implementing binary search # finding mid index self.mid = (self.first + self.last) // 2 # if first index become greater than last index if self.first > self.last: # make start flag false self.start = False # show output as not found self.result.setText("Not Found") # if mid value is equal to the desired value if self.number[self.mid] == self.desired: # make flag false self.start = False # show output in result label self.result.setText("Found at index : " + str(self.mid)) # set color of label to green self.label_list[self.mid].setStyleSheet( "border : 2px solid green; " "background-color : lightgreen") # if not equal to mid value else: # make color grey self.label_list[self.mid].setStyleSheet( "border : 1px solid black; " "background-color : grey") # mid value is higher if self.number[self.mid] > self.desired: # change last index self.last = self.mid - 1 # if mid value is smaller if self.number[self.mid] < self.desired: # change first index self.first = self.mid + 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