📅  最后修改于: 2023-12-03 15:06:50.078000             🧑  作者: Mango
线性搜索,也称顺序搜索,是一种简单的搜索算法,它从列表的起始位置开始逐一比较列表中的元素,直到找到匹配的元素或搜索完整个列表。在本文中,我们将介绍如何使用 PyQt5 实现线性搜索的可视化工具。
在开始编写代码之前,我们需要安装 PyQt5 库。可以使用 pip 命令来安装:
pip install PyQt5
此外,我们还需要用到以下库:
random
:用于生成随机数。time
:用于控制搜索速度。sys
:用于退出应用程序。可以使用以下命令导入这些库:
import random
import time
import sys
首先,我们需要生成一个包含随机整数的列表,并在界面上显示出来:
class LinearSearchVisualization(QWidget):
def __init__(self):
# 界面初始化
super().__init__()
self.title = 'Linear Search Visualization'
self.left = 10
self.top = 10
self.width = 640
self.height = 480
self.initUI()
# 数据初始化
self.number_of_elements = 50
self.elements = [random.randint(1, 100) for i in range(self.number_of_elements)]
self.searched_element = random.randint(1, 100)
print('Elements:', self.elements)
print('Searched element:', self.searched_element)
在构造函数中,我们初始化了界面,并生成了一个包含50个随机整数的列表,并随机选择一个整数作为需要搜索的元素。最后,将生成的列表和需要搜索的元素打印到控制台上。
初始化界面包括定义窗口标题、位置、大小,以及界面包含的组件。在本例中,我们需要一个 QLineEdit
输入框、一个 QPushButton
按钮和一个 QLabel
标签用于显示搜索结果。
def initUI(self):
# 定义窗口标题、位置、大小
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# 定义组件
self.number_input = QLineEdit(self)
self.number_input.move(20, 20)
self.number_input.resize(200, 30)
self.search_button = QPushButton('Search', self)
self.search_button.move(230, 20)
self.search_button.resize(100, 30)
self.search_button.clicked.connect(self.search)
self.result_label = QLabel(self)
self.result_label.move(20, 70)
self.result_label.resize(310, 30)
在 initUI
方法中,我们使用 move
和 resize
方法定义组件的位置和大小,并使用 clicked.connect
方法将按钮的 clicked
信号连接到搜索方法 search
上。
接下来,我们将实现线性搜索算法。该算法在列表中逐个查找元素,并返回找到的元素的索引,如果没有找到则返回 -1
。
def linear_search(self, searched_element):
for i in range(len(self.elements)):
if self.elements[i] == searched_element:
return i
time.sleep(0.1)
self.update()
return -1
linear_search
方法使用 for
循环逐个比较列表元素,并使用 time.sleep
方法来模拟搜索的速度。self.update
方法用于在每次搜索后更新界面。
在搜索方法中,我们获取用户输入的搜索元素,并将其转换为整数后调用 linear_search
方法来查找元素。查找结果将被显示在界面上的 QLabel
标签中。
def search(self):
searched_number = int(self.number_input.text())
index = self.linear_search(searched_number)
if index >= 0:
result = 'Found at index ' + str(index)
else:
result = 'Not found'
self.result_label.setText(result)
最后,在 LinearSearchVisualization
类中添加 main
方法,用于运行应用程序:
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = LinearSearchVisualization()
ex.show()
sys.exit(app.exec_())
到这里,我们的线性搜索可视化工具就完成了,完整的代码如下:
import random
import time
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QLabel
class LinearSearchVisualization(QWidget):
def __init__(self):
# 界面初始化
super().__init__()
self.title = 'Linear Search Visualization'
self.left = 10
self.top = 10
self.width = 640
self.height = 480
self.initUI()
# 数据初始化
self.number_of_elements = 50
self.elements = [random.randint(1, 100) for i in range(self.number_of_elements)]
self.searched_element = random.randint(1, 100)
print('Elements:', self.elements)
print('Searched element:', self.searched_element)
def initUI(self):
# 定义窗口标题、位置、大小
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
# 定义组件
self.number_input = QLineEdit(self)
self.number_input.move(20, 20)
self.number_input.resize(200, 30)
self.search_button = QPushButton('Search', self)
self.search_button.move(230, 20)
self.search_button.resize(100, 30)
self.search_button.clicked.connect(self.search)
self.result_label = QLabel(self)
self.result_label.move(20, 70)
self.result_label.resize(310, 30)
def linear_search(self, searched_element):
for i in range(len(self.elements)):
if self.elements[i] == searched_element:
return i
time.sleep(0.1)
self.update()
return -1
def search(self):
searched_number = int(self.number_input.text())
index = self.linear_search(searched_number)
if index >= 0:
result = 'Found at index ' + str(index)
else:
result = 'Not found'
self.result_label.setText(result)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = LinearSearchVisualization()
ex.show()
sys.exit(app.exec_())
通过执行该程序,可以看到生成的随机列表和需要搜索的元素,并在界面上进行搜索: