使用 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 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告