Python PyQt5 斐波那契搜索可视化器

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())

输出

Python PyQt5 斐波那契搜索可视化器

使用斐波那契搜索算法时,我们首先确定与正在搜索的列表长度最相关的两个斐波那契数。将这两个值用来将列表分成三个部分后,我们可以将要查找的元素与每个部分的中间元素进行比较。根据比较的结果,我们要么继续在列表的第一部分或第二部分中查找,直到找到该元素,要么得出结论该元素不存在。

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程