六个搜索算法及其python实现

搜索算法

搜索算法的含义可以从以下几个方面进行解释和归纳:

  1. 基本定义:搜索算法是利用计算机的高性能来有目的地穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。这本质上是一种穷举算法,旨在列出所有的可能性以找到满足特定条件的解。

  2. 核心目的:搜索算法的核心目的是在给定的问题空间内,通过一定的策略和规则,快速、准确地找到问题的解。这个过程中可能涉及到对解空间的遍历、剪枝(即提前排除不可能成为解的部分),以及利用启发式信息来指导搜索方向。

  3. 应用场景:搜索算法广泛应用于多个领域,包括但不限于数据检索(如在数据库或文件系统中查找特定信息)、图形搜索(如在地图应用中寻找两点之间的最短路径)、路径规划(如机器人导航或自动驾驶中的路径规划)、游戏AI(如棋类游戏中的走棋预测)、问题求解(如解决八皇后问题、数独等约束满足问题)以及机器学习(如神经网络参数优化)等。

  4. 主要类型:搜索算法有多种类型,其中深度优先遍历(DFS)和广度优先遍历(BFS)是两种常用的搜索策略。此外,还有线性搜索、二分查找、插值查找等针对不同数据结构和应用场景的搜索算法。

  5. 算法优化:为了提高搜索效率,搜索算法通常会采用各种优化技术,如剪枝(在搜索过程中提前排除不可能成为解的部分)、启发式搜索(利用问题特定的启发式信息来指导搜索方向,以加快找到解的速度)等。

综上所述,搜索算法能够帮助我们在复杂的问题空间中快速找到满足特定条件的解。

接下去我们将讨论线性搜索、二分搜索、深度优先搜索、广度优先搜索、Dijkstra、A*六个搜索算法。

1.线性搜索(Linear Search)

基本原理

线性搜索是一种非常简单的搜索策略。它从列表的第一个元素开始,逐个检查每个元素,直到找到所需的元素或检查完所有元素。

应用场景

当数据量不大,或者数据无序时,线性搜索是一个不错的选择。

优缺点
  • 优点:实现简单,无需对数据进行预处理。
  • 缺点:效率低下,特别是当数据量很大时。
Python实现
def linear_search(arr, target):for i in range(len(arr)):if arr[i] == target:return i  # 找到目标,返回索引return -1  # 未找到目标,返回-1# 示例
arr = [4, 2, 9, 3, 5, 1, 8, 6, 7]
target = 5
print(linear_search(arr, target))  # 输出:4

2.二分搜索(Binary Search)

基本原理

二分搜索是一种在有序数组中查找特定元素的搜索算法。它首先比较数组中间的元素,如果中间元素正好是目标值,则搜索结束;如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样从中间元素开始比较。这样,每次比较都能将搜索范围缩小一半。

应用场景

适用于有序的数据集,且数据量较大时效率更高。

优缺点
  • 优点:效率高,时间复杂度为O(log n)。
  • 缺点:要求数据必须有序。
Python实现
def binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return mid  # 找到目标,返回索引elif arr[mid] < target:left = mid + 1else:right = mid - 1return -1  # 未找到目标,返回-1# 示例
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
target = 5
print(binary_search(arr, target))  # 输出:4

3.深度优先搜索(Depth-First Search, DFS)

基本原理

深度优先搜索是一种用于遍历或搜索树或图的算法。它从根节点开始,沿着树的深度遍历树的节点,尽可能深地搜索树的分支,直到到达叶子节点或无法再深入的节点,然后回溯到上一个节点,继续搜索下一个分支。

应用场景

适用于需要遍历或搜索树或图结构的问题,如迷宫问题、八数码问题等。

优缺点
  • 优点:实现简单,空间效率高(相对于广度优先搜索)。
  • 缺点:可能陷入无限循环(如果图中存在环),且不一定能找到最短路径。
Python实现(以二叉树为例)
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef dfs(root, target):if root is None:return Falseif root.val == target:return Truereturn dfs(root.left, target) or dfs(root.right, target)# 示例
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
target = 4
print(dfs(root, target))  # 输出:True

注意:深度优先搜索在图结构中的实现会稍微复杂一些,因为需要记录已经访问过的节点,以避免重复访问和陷入无限循环。在上面的二叉树示例中,我们假设树中没有重复的节点值,因此没有考虑这个问题。

4. 广度优先搜索(Breadth-First Search, BFS)

基本原理

广度优先搜索是一种用于遍历或搜索树或图的算法。它从图的某一节点(源节点)开始,首先访问离源节点最近的邻居节点,然后对这些邻居的未访问邻居节点进行访问,以此类推,直到找到目标节点或遍历完整个图。

应用场景

广度优先搜索常用于无权图的最短路径查找、网络爬虫中的层次遍历等。

优缺点
  • 优点:能找到从源节点到目标节点的最短路径(路径长度以节点数量计)。
  • 缺点:对于大型图,可能会消耗大量内存来存储待访问的节点队列。
Python实现
from collections import dequedef bfs(graph, start, end):visited = set()queue = deque([start])while queue:node = queue.popleft()if node == end:return Trueif node not in visited:visited.add(node)queue.extend(graph[node] - visited)return False# 示例图表示(邻接表)
graph = {'A': {'B', 'C'},'B': {'A', 'D', 'E'},'C': {'A', 'F'},'D': {'B'},'E': {'B', 'F'},'F': {'C', 'E'}
}# 搜索从A到F的路径
print(bfs(graph, 'A', 'F'))  # 输出: True

5. Dijkstra 算法

基本原理

Dijkstra算法用于在加权图中找到从源节点到所有其他节点的最短路径。它通过迭代地选择当前未处理节点中距离最短的节点,并更新其邻居节点的距离。

应用场景

适用于带权重的图,如路由算法、地图导航等。

优缺点
  • 优点:能找到从源点到其他所有点的最短路径。
  • 缺点:不能处理带有负权重的边。
Python实现
import heapqdef dijkstra(graph, start):distances = {node: float('infinity') for node in graph}distances[start] = 0queue = [(0, start)]while queue:current_distance, current_node = heapq.heappop(queue)if current_distance > distances[current_node]:continuefor neighbor, weight in graph[current_node].items():distance = current_distance + weightif distance < distances[neighbor]:distances[neighbor] = distanceheapq.heappush(queue, (distance, neighbor))return distances# 示例图表示(带权重的邻接表)
graph = {'A': {'B': 7, 'C': 9, 'F': 14},'B': {'A': 7, 'F': 2},'C': {'A': 9, 'F': 10, 'G': 15},'D': {'F': 9},'E': {'H': 15},'F': {'A': 14, 'B': 2, 'C': 10, 'D': 9, 'G': 1, 'H': 11},'G': {'C': 15, 'F': 1, 'H': 6},'H': {'E': 15, 'F': 11, 'G': 6}
}# 找到从A点到所有点的最短路径
print(dijkstra(graph, 'A'))  # 输出各点到A点的最短距离字典

6. A* 搜索算法(A-Star Search)

基本原理

A*搜索算法是一种启发式搜索算法,它结合了最佳优先搜索和Dijkstra算法的优点,使用一个启发式函数来评估从当前节点到目标节点的代价,以此选择下一个要遍历的节点。

应用场景

常用于路径查找、游戏AI、机器人导航等。

优缺点
  • 优点:如果启发式函数选择合适,可以更快地找到最短路径。
  • 缺点:启发式函数的选择对算法效率有很大影响,不合适的启发式可能导致算法性能下降。
Python实现
import heapqdef astar(graph, start, goal, heuristic):frontier = []heapq.heappush(frontier, (0, start))came_from = {start: None}cost_so_far = {start: 0}while frontier:current_priority, current = heapq.heappop(frontier)if current == goal:breakfor next_node, weight in graph[current].items():new_cost = cost_so_far[current] + weightif next_node not in cost_so_far or new_cost < cost_so_far[next_node]:cost_so_far[next_node] = new_costpriority = new_cost + heuristic(goal, next_node)heapq.heappush(frontier, (priority, next_node))came_from[next_node] = currentreturn came_from, cost_so_far# 示例图、启发式函数和主函数调用
graph = { ... }  # 与Dijkstra算法示例相同的图结构def heuristic(a, b):# 这是一个简单的启发式函数示例,实际应用中需要根据具体问题设计return 1  # 假设启发式代价为1(也可以是基于节点间的某种距离度量)came_from, cost_so_far = astar(graph, 'A', 'H', heuristic)
print(came_from)  # 输出到达每个节点的前一个节点字典
print(cost_so_far)  # 输出从起点到每个节点的已知最短距离字典

请注意,上述代码中的图结构、启发式函数以及搜索的具体节点需要根据实际应用场景进行调整。这里提供的只是算法框架和简单示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复合句语法

复合句指的是包含两个或多个独立子句的句子。这些子句可以并列关系&#xff0c;也可以是主从关系&#xff0c;分别构成并列复合句和主从复合句。 复合句的两种主要类型 复合句可以分为两种主要类型&#xff1a; 并列复合句&#xff1a;结构简单&#xff0c;各个简单句平等&am…

【机器学习】训练GNN图神经网络模型进行节点分类

1. 引言 1.1 图神经网络GNN概述 图神经网络&#xff08;Graph Neural Network&#xff0c;GNN&#xff09;是一种专门用于处理图结构数据的神经网络方法。它起源于2005年&#xff0c;当时Gori等人首次提出了GNN的概念&#xff0c;用于学习图中的节点特征以及它们之间的关系。…

Rust基础学习-Rust中的文件操作

文件结构 在Rust中&#xff0c;std::fs::File 结构体代表一个文件。它允许我们对文件执行读/写操作。文件 I/O 是通过提供与文件系统交互的功能的 std::fs 模块执行的。 File 结构体中的所有方法都返回std::io::Result的变体&#xff0c;或者简单地是 Result 枚举。这里会涉及…

PowerShell cannot be loaded- execution policy

PowerShell脚本无法运行&#xff0c;报错&#xff1a; cannot be loaded. The file xxxx is not digitally signed. You cannot run this script on the current system. For more information about running scripts and setting execution policy, see about_Execution_Po…

一套java开发的(未来工厂核心MES系统成品源码)技术架构:java+springboot 支撑多端管理,可商用

MES定义为“位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统” 20世纪90年代初期&#xff0c;中国就开始对MES以及ERP的跟踪研究、告知或试点&#xff0c;而且曾经发言 “管控一体化”&#xff0c;“人、财、物、产、供、销”等颇具中国独具一格的CIMS、…

电商API接口在促进市场扩展中的作用

在电子商务领域&#xff0c;API接口技术不仅使企业能够提供标准化的服务&#xff0c;还能推动市场快速扩展。本文将探讨电商API如何助力企业发现新的客户群体、整合更广泛的供应链&#xff0c;以及如何通过创新的服务提升市场竞争力。 引言 随着电子商务市场的成熟和竞争日益加…

自定义idea插件之hello idea plugin

写在前面 最近一直想研究下自定义idea插件的内容&#xff0c;这样如果是想要什么插件&#xff0c;但又一时找不到合适的&#xff0c;就可以自己来搞啦&#xff01;这不终于有时间来研究下&#xff0c;但过程可谓是一波三折&#xff0c;再一次切身体验了下万事开头难。那么&…

血清素是怎么产生的,其过高和过低与我们情绪和胃肠健康有哪些关联?

谷禾健康 血清素&#xff0c;5-羟色氨(5-HT)不仅充当体内系统的神经递质和激素&#xff0c;而且还是胃肠系统中的旁分泌信使。 5-HT神经元系统起源于中脑中缝核&#xff0c;下面示意图强调了血清素(5-HT)神经元与释放不同神经递质的其他神经元以及神经胶质细胞之间的解剖相互作…

Java 设置定时任务的三种方式

使用 java.util.Timer 和 java.util.TimerTask&#xff1a; Timer 是一个定时器工具&#xff0c;能够在后台线程中调度任务。TimerTask 是一个实现了 Runnable 接口的抽象类&#xff0c;需要继承它并重写 run 方法。 示例代码&#xff1a; import java.util.Timer; import …

简单使用vue2和elementUI自定义audio支持拖拽进度

<template><div class"music-player"><audio ref"audio" :src"src" timeupdate"updateTime" loadedmetadata"loadedmetadata" ended"onAudioEnded"></audio><!-- 播放暂停按钮 -->…

问题:新零售是以消费者体验为中心的数据驱动的泛零售形态,是基于大数据的“人货场“重构 #其他#知识分享

问题&#xff1a;新零售是以消费者体验为中心的数据驱动的泛零售形态,是基于大数据的"人货场"重构 参考答案如图所示

【PL理论】(8) F#:列表高阶函数之 filter 函数 | 内联谓词函数 | 链式操作:先过滤再映射

&#x1f4ad; 写在前面&#xff1a;上一章中&#xff0c;我们详细讲解了列表的合并&#xff0c;本章我们来详细讲解一下列表的过滤&#xff0c;在 F# 中&#xff0c;过滤列表是指从列表中提取满足某个条件的元素&#xff0c;形成一个新的列表。这个操作通常使用 List.filter 函…

Turnitin揭露AI写作痕迹,是否会影响论述是重复率?

Turnitin&#xff08;www.checktoo.com&#xff09;为学术界提供了便捷的服务&#xff0c;以确保论文的原创性和学术诚信。然而&#xff0c;许多学生和研究人员在使用Turnitin时&#xff0c;常常会想Turnitin查论文AI率和重复率之间的关系。那么&#xff0c;使用Turnitin查重论…

LeetCode-day04-2938. 区分黑球与白球

LeetCode-day04-2938. 区分黑球与白球 题目描述示例示例1&#xff1a;示例2&#xff1a; 思路代码 题目描述 桌子上有 n 个球&#xff0c;每个球的颜色不是黑色&#xff0c;就是白色。 给你一个长度为 n 、下标从 0 开始的二进制字符串 s&#xff0c;其中 1 和 0 分别代表黑色…

Centos7安装Zookeeper

Centos7安装Zookeeper 准备工作 https://zookeeper.apache.org/releases.html 下载稳定版的安装包。【注意&#xff1a;下载的是xxx-bin.tar.gz包 是可运行的zookeeper 而 xxx.tar.gz是源码包不可运行】 上传zookeeper的压缩包到指定目录/usr/local/zookeeper/ 安装Zookeepe…

从写简历到谈薪资的最全教程

从写简历到谈薪资的最全教程 目录简历注意事项举个例子写简历投递简历也有技巧模拟面试的重要性面试经验怎么刷不断迭代达越来越强斗智斗勇谈薪资拿到offer就结束了吗&#xff1f;我能给你的帮助 目录 大家好&#xff0c;我是一名普通本科毕业的学生&#xff0c;工作数年&#…

移动端 UI 风格,彰显品质

移动端 UI 风格&#xff0c;彰显品质

中子介程三

X$XFX$XqXyXqX$XFX$XqXyXqX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XyX$XpX$XyX$XyXeXαX$XqXyXqX$XαXeXyX$XyX$XpX$XyX$XhXαXeX$XηXqXαXpX$XWXyX$XyXWX$XαXtXηXαXpX$XEX$XZX$XpXαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XyX$XpX$XyX$XyXeXαX$XqXyXqX$X…

嵌入式学习——网络编程(UDP)——day30

1. 协议 通信双方约定的一套标准成为协议 2. 国际网络协议标准 2.1 OSI七层模型(理论模型) 应用层:传输的数据&#xff08;a.out&#xff09; 表示层:数据是否加密 会话层:是否需要建立会话链接&#xff08;网络断开连接状态&#xff09; …

shell 变量引用 ${}、$,传参 $1、$2,四则运算 $[]

变量引用 两种&#xff1a; ${变量名} $变量名 例如&#xff1a; filepath"/home/mytool" filename"t1.txt" 可以写成 echo "$filepath/$filename" 或者 echo "${filepath}/${filename}"打印结果&#xff1a; /home/mytool/t1.tx…