python数据结构之搜索讲解

Python数据结构之搜索讲解

搜索的定义

搜索是在数据集合中查找特定目标的过程。在计算机科学中,最常见的搜索是在数据结构中查找某个特定值的过程。常见的搜索算法包括线性搜索、二分搜索、深度优先搜索和广度优先搜索等。下面我们将详细讲解这些搜索算法的具体实现。

线性搜索

线性搜索是最基本的搜索算法,在一个数据集合中按顺序逐个查找目标值。可以通过以下 Python 代码实现线性搜索:

def linear_search(target, lst):
    for i in range(len(lst)):
        if lst[i] == target:
            return i
    return -1

其中 target 是要查找的目标值,lst 是数据集合。在上述代码中,我们使用了 for 循环遍历 lst,在每次循环中判断当前元素是否等于 target,如果等于则返回当前下标。如果最终没有找到目标值,则返回 -1,表示搜索失败。

二分搜索

二分搜索又称折半搜索,是一种利用数据集合有序这一特点进行优化的搜索算法。它的基本思想是将数据集合分成两部分,每次查找先判断目标值与中间值的大小关系,从而确定下一次查找的数据集合。可以通过以下 Python 代码实现二分搜索:

def binary_search(target, lst):
    low, high = 0, len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        if lst[mid] < target:
            low = mid + 1
        elif lst[mid] > target:
            high = mid - 1
        else:
            return mid
     return -1

其中 target 是要查找的目标值,lst 是有序数据集合。在上述代码中,我们首先将要查找的数据集合的范围初始化为整个 lst。然后在 while 循环中,每次查找都将数据集合分成两部分。如果中间值小于目标值,则说明目标值应该在右半部分,更新数据集合范围为右半部分。如果中间值大于目标值,则说明目标值应该在左半部分,更新数据集合范围为左半部分。如果中间值等于目标值,则说明已经找到目标值,返回中间值下标。如果最终没有找到目标值,则返回 -1,表示搜索失败。

深度优先搜索

深度优先搜索是一种利用栈实现的搜索算法,它的基本思想是先访问顶点,然后依次访问与它相邻的未被访问过的顶点,直至搜索到目标值或者无法继续搜索为止。可以通过以下 Python 代码实现深度优先搜索:

def dfs(graph, start, target):
    stack = [start]
    visited = set()
    while stack:
        node = stack.pop()
        if node in visited:
            continue
        visited.add(node)
        if node == target:
            return True
        stack.extend(graph[node] - visited)
    return False

其中 graph 是表示图的字典,start 是搜索的起始顶点,target 是要查找的目标值。在上述代码中,我们使用栈来实现深度优先搜索,将起始顶点加入栈中。对于每个出栈的顶点,我们首先判断该顶点是否已经被访问过。如果已经被访问过,则继续出栈下一个顶点;如果未被访问过,则将该顶点标记为已访问。如果该顶点等于目标值,则搜索成功,返回 True。否则,将该顶点的未访问邻居加入栈中,继续搜索下一个顶点。如果最终没有找到目标值,则返回 False,表示搜索失败。

广度优先搜索

广度优先搜索是一种利用队列实现的搜索算法,它的基本思想是先访问距离起始顶点最近的顶点,然后依次访问距离起始顶点更远的顶点,直至搜索到目标值或者无法继续搜索为止。可以通过以下 Python 代码实现广度优先搜索:

def bfs(graph, start, target):
    queue = [start]
    visited = set()
    while queue:
        node = queue.pop(0)
        if node in visited:
            continue
        visited.add(node)
        if node == target:
            return True
        queue.extend(graph[node] - visited)
    return False

其中 graph 是表示图的字典,start 是搜索的起始顶点,target 是要查找的目标值。在上述代码中,我们使用队列来实现广度优先搜索,将起始顶点加入队列中。对于每个出队列的顶点,我们首先判断该顶点是否已经被访问过。如果已经被访问过,则继续出队列下一个顶点;如果未被访问过,则将该顶点标记为已访问。如果该顶点等于目标值,则搜索成功,返回 True。否则,将该顶点的未访问邻居加入队列中,继续搜索下一个顶点。如果最终没有找到目标值,则返回 False,表示搜索失败。

示例说明

示例一

假设我们要在一个无序数组中查找目标值 8,可以使用线性搜索算法,其中 lst=[1, 3, 5, 8, 2, 4, 7, 9],代码如下:

print(linear_search(8, [1, 3, 5, 8, 2, 4, 7, 9]))

这段代码将返回 3,表示在给定的数组中找到了目标值 8,并且它的下标为 3

示例二

假设我们要在一个有序数组中查找目标值 6,可以使用二分搜索算法,其中 lst=[1, 2, 3, 4, 5, 6, 7, 8, 9],代码如下:

print(binary_search(6, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

这段代码将返回 5,表示在给定的有序数组中找到了目标值 6,并且它的下标为 5

以上便是 Python 数据结构之搜索讲解的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python数据结构之搜索讲解 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python基础之函数的返回值

    下面是关于Python基础之函数的返回值的完整攻略: 函数返回值的意义 函数的返回值是指函数执行完成后终止并返回给调用者的值。在Python中,可以使用return语句将值从函数中返回。函数的返回值可以用于后续的计算、判断、显示等操作。 函数返回值的用法 返回单个值 在函数中可以使用return语句返回任何值,包括数字、字符串、列表、字典等等。下面是一个返回…

    python 2023年6月5日
    00
  • Python语法学习之正则表达式的使用详解

    Python语法学习之正则表达式的使用详解 正则表达式是一种用于描述字符串模式的语言,可以用于匹配、查找、替换和割。在Python中,我们可以使用re块来使用正则表达式。本文将详细介绍Python中正则表达式的使用方法,包括正则表达式的语法、re模块的常用函数等。 正则表达式的语法 正则表达式的语法较复杂,但是掌握了基本的语法规则,就可以应对大部分的正则表达…

    python 2023年5月14日
    00
  • python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)

    Python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup) 在本文中,我们将介绍如何使用Python解析HTML和XHTML文档。我们将使用Python内置的HTMLParser模块和第三方库BeautifulSoup来解析HTML和XHTML文档。 HTMLParser模块 HTMLParser模块是P…

    python 2023年5月15日
    00
  • 给Python中的MySQLdb模块添加超时功能的教程

    为了给Python中的MySQLdb模块添加超时功能,我们可以采用以下步骤: 1. 安装必要工具 首先,我们需要安装MySQLdb模块,以及DBUtils模块。可以使用pip命令进行安装,具体命令如下: pip install mysqlclient pip install dbutils 2. 为MySQLdb添加超时功能 我们可以使用Connection…

    python 2023年6月3日
    00
  • Python用来做Web开发的优势有哪些

    当今Web开发领域中,有很多语言可以用来开发Web应用,其中Python也是一种十分流行的选择。Python语言本身就具备一些Web开发方面的优势,下面我们来一一介绍。 1. 方便易用的Web框架 Python拥有非常丰富和多样化的Web框架。其中,Flask和Django是最流行的两个Web框架。 Flask是一个非常轻量级的Web框架,适用于简单和小型应…

    python 2023年5月20日
    00
  • python常用request库与lxml库操作方法整理总结

    以下是关于Python常用request库与lxml库操作方法整理总结的攻略: Python常用request库与lxml库操作方法整理总结 在Python中,request库和lxml库是常用的网络爬虫库。以下是Python常用request库与lxml库操作方法整理总结的攻略。 request库的使用 使用request库发送HTTP请求时,需要使用ge…

    python 2023年5月14日
    00
  • 用Python中的字典来处理索引统计的方法

    使用Python中的字典是一种非常高效的方式来处理索引统计。本攻略将介绍如何使用Python字典实现索引统计的方法。具体过程如下: 步骤1:读取文本内容 首先,需要读取文本内容,可以使用Python中的open方法读取文本文件,例如: with open(‘text.txt’, ‘r’, encoding=’utf-8′) as f: text = f.re…

    python 2023年5月13日
    00
  • python转化excel数字日期为标准日期操作

    “python转化excel数字日期为标准日期操作”的完整实例教程如下: 一、背景知识 在Excel中,日期被存储为数值类型,为1900年1月1日到某个日期日期之间的天数。例如,2019年9月15日,在Excel中对应的数值为43741。 在Python中,要将这个数值转化为标准日期,需要用到datetime模块。 二、实现步骤 导入所需模块。需要导入dat…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部