Python 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开发的斐波那契搜索可视化工具使我们能够看到斐波那契搜索算法的运行过程。我们可以输入一个搜索词,并观察算法如何将列表分成三个部分并进行搜索。该可视化工具可用于故障排查和理解该方法。