使用 PyQt5 的斐波那契搜尋視覺化工具
列表排序有助於我們以更短的時間解決大量資料以及各種數學和邏輯問題。我們可以藉助斐波那契搜尋方法輕鬆地在排序列表中找到特定元素。在這裡,我們將使用 Python 中的 PyQt5 模組建立一個斐波那契搜尋視覺化工具。
示例
在此示例中,我們使用了斐波那契視覺化工具的使用者介面,該介面包含一個帶有斐波那契數列表的視窗,並顯示結果。
以下 PyQt5 小部件在此程式碼中使用
QListWidget
QLineEdit
QPushButton
演算法
步驟 1:提供要搜尋的數字列表和元素。
步驟 2:找到兩個最接近的斐波那契數,這兩個數大於或等於列表的長度。
步驟 3:使用 0 和斐波那契列表中的第一個數字初始化低索引和高索引。
步驟 4:重複以下步驟,直到找到元素且搜尋間隔的長度大於 1:計算中間元素的索引。使用第一個和第二個斐波那契數計算第二部分中中間元素的索引。比較元素,如果元素小於中間元素,則在第一部分中搜索,並相應地更新高索引和斐波那契數。
步驟 5:如果元素大於中間元素,則在第二部分中搜索;如果元素等於中間元素,則返回中間元素的索引。
步驟 6:如果未找到元素,則返回 -1。
# importing libraries from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui from PyQt5.QtGui import * from PyQt5.QtCore import * import sys class SearchWindow(QMainWindow): number = [1, 2, 3, 4, 5, 6, 7, 8] desired = 5 def __init__(windo): super().__init__() windo.setWindowTitle("Fibonacci Search Program") windo.setGeometry(100, 100, 600, 400) windo.UiComponents() windo.show() def UiComponents(windo): windo.start = False windo.divide = False windo.fib_search = True windo.label_list = [] windo.fib1 = 1 windo.fib2 = 0 windo.fib = windo.fib1 + windo.fib2 windo.offset = -1 # local counter count = 0 for i in windo.number: label = QLabel(str(i), windo) label.setStyleSheet("border : 1px solid black;") label.setAlignment(Qt.AlignTop) label.setGeometry(50 + count * 30, 50, 20, i * 10 + 10) windo.label_list.append(label) count = count + 1 windo.search_button = QPushButton("Start Search", windo) windo.search_button.setGeometry(100, 300, 100, 30) windo.search_button.clicked.connect(windo.search_action) pause_button = QPushButton("Pause", windo) pause_button.setGeometry(100, 300, 100, 30) # adding action to the search button pause_button.clicked.connect(windo.pause_action) # creating label to show the result windo.result = QLabel("Result : " + str(windo.desired), windo) windo.result.setGeometry(320, 300, 250, 40) windo.result.setStyleSheet("border : solid black;") windo.result.setFont(QFont('Times', 10)) windo.result.setAlignment(Qt.AlignCenter) timer = QTimer(windo) timer.timeout.connect(windo.showTime) timer.start(300) def showTime(windo): # checking if flag is true if windo.start: if windo.fib_search: if windo.fib < len(windo.number): windo.fib2 = windo.fib1 windo.fib1 = windo.fib windo.fib = windo.fib2 + windo.fib1 windo.result.setText("Searching Fibonacci number >=" + str(windo.desired)) else: windo.result.setText("Fibonacci found, searching number") windo.fib_search = False windo.divide = True if windo.divide: if windo.fib <= 1: windo.result.setText("Number not available") windo.start = False return i = min(windo.offset + windo.fib2, len(windo.number) - 1) windo.label_list[i].setStyleSheet("border : 1px solid black;" "background-color : grey") if (windo.number[i] < windo.desired): windo.fib = windo.fib1 windo.fib1 = windo.fib2 windo.fib2 = windo.fib - windo.fib1 windo.offset = i elif (windo.number[i] > windo.desired): windo.fib = windo.fib2 windo.fib1 = windo.fib1 - windo.fib2 windo.fib2 = windo.fib - windo.fib1 else: windo.result.setText("Found at : " + str(i)) windo.label_list[i].setStyleSheet( "border : 2px solid green;" "background-color : lightgreen;") windo.start = False def search_action(windo): windo.start = True windo.result.setText("Started searching...") def pause_action(windo): windo.start = False windo.result.setText("Paused") App = QApplication(sys.argv) window = SearchWindow() sys.exit(App.exec())
輸出
在使用斐波那契搜尋演算法時,我們識別出與要搜尋的列表長度最相關的兩個斐波那契數。使用這兩個值將列表分成三個部分後,我們可以將我們要查詢的元素與每個部分中的中間元素進行比較。根據比較結果,我們繼續在列表的第一部分或第二部分中查詢,直到找到該元素或得出它不存在的結論。
結論
我們使用 PyQt5 開發的斐波那契搜尋視覺化工具使我們能夠了解斐波那契搜尋演算法的工作原理。我們可以輸入搜尋詞並觀察演算法如何將列表分成三個部分並執行搜尋。視覺化工具對於故障排除和理解該方法很有幫助。
廣告