使用 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 开发的斐波那契搜索可视化工具使我们能够了解斐波那契搜索算法的工作原理。我们可以输入搜索词并观察算法如何将列表分成三个部分并执行搜索。可视化工具对于故障排除和理解该方法很有帮助。

更新于: 2023 年 8 月 10 日

189 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.