📜  使用 PyQt5 的线性搜索可视化工具(1)

📅  最后修改于: 2023-12-03 15:06:50.078000             🧑  作者: Mango

使用 PyQt5 的线性搜索可视化工具

线性搜索,也称顺序搜索,是一种简单的搜索算法,它从列表的起始位置开始逐一比较列表中的元素,直到找到匹配的元素或搜索完整个列表。在本文中,我们将介绍如何使用 PyQt5 实现线性搜索的可视化工具。

准备工作

在开始编写代码之前,我们需要安装 PyQt5 库。可以使用 pip 命令来安装:

pip install PyQt5

此外,我们还需要用到以下库:

  • random:用于生成随机数。
  • time:用于控制搜索速度。
  • sys:用于退出应用程序。

可以使用以下命令导入这些库:

import random
import time
import sys
实现过程
1. 初始化数据

首先,我们需要生成一个包含随机整数的列表,并在界面上显示出来:

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个随机整数的列表,并随机选择一个整数作为需要搜索的元素。最后,将生成的列表和需要搜索的元素打印到控制台上。

2. 初始化界面

初始化界面包括定义窗口标题、位置、大小,以及界面包含的组件。在本例中,我们需要一个 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 方法中,我们使用 moveresize 方法定义组件的位置和大小,并使用 clicked.connect 方法将按钮的 clicked 信号连接到搜索方法 search 上。

3. 实现线性搜索算法

接下来,我们将实现线性搜索算法。该算法在列表中逐个查找元素,并返回找到的元素的索引,如果没有找到则返回 -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 方法用于在每次搜索后更新界面。

4. 实现搜索方法

在搜索方法中,我们获取用户输入的搜索元素,并将其转换为整数后调用 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)
5. 运行程序

最后,在 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_())

通过执行该程序,可以看到生成的随机列表和需要搜索的元素,并在界面上进行搜索:

search_demo