使用 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 开发的斐波那契搜索可视化工具使我们能够了解斐波那契搜索算法的工作原理。我们可以输入搜索词并观察算法如何将列表分成三个部分并执行搜索。可视化工具对于故障排除和理解该方法很有帮助。
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP