机器学习深度学习中的搜索算法浅谈

news2024/9/21 11:14:32

Search

机器学习&深度学习中的搜索算法浅谈

搜索算法是计算机科学中的核心算法,用于在各种数据结构(如数组、列表、树、图等)中查找特定元素或信息。这些算法不仅在理论上具有重要意义,还在实际应用中扮演着关键角色。本文将详细探讨搜索算法的基本概念、常见分类及经典算法(如A*算法及其变种),并介绍这些算法在不同场景中的应用。

1. 什么是搜索算法?

搜索算法用于在给定的数据结构中查找特定元素或满足特定条件的信息。无论是查找一个数字、搜索路径,还是在复杂图结构中定位某个节点,搜索算法都能帮助我们有效地找到目标。

举个栗子:想象你在图书馆寻找一本书。你可以从头到尾检查每个书架上的每本书,直到找到它。这类似于线性搜索。如果书架按照书名的字母顺序排列,你可以使用更高效的方法,从中间开始寻找,逐步缩小搜索范围,这类似于二分搜索。如果你在城市中寻找某个地方,你可能会从一个地点开始,按照既定的路线进行探索,这类似于深度优先搜索(DFS)。而如果你选择从市中心开始,逐步扩展到周围的区域,这就像广度优先搜索(BFS)。

2. 常见的搜索算法分类

搜索算法可以按照应用方式和目标数据结构进行分类。以下是几种常见的搜索算法:

2.1 线性搜索(Linear Search)

线性搜索是最基本的搜索算法。它逐一检查数据结构中的每个元素,直到找到目标元素或遍历完所有元素为止。

数学意义

  • 给定一个包含 n n n 个元素的数组 A A A,线性搜索目标值 x x x 的过程可以描述为:
    for  i = 0  to  n − 1  do \text{for } i = 0 \text{ to } n-1 \text{ do} for i=0 to n1 do
    if  A [ i ] = x  then return  i \quad \text{if } A[i] = x \text{ then return } i if A[i]=x then return i
    else continue \quad \text{else } \text{continue} else continue
    如果找到目标值 x x x,返回其索引,否则返回 -1 表示未找到。

时间复杂度:O(n),其中n是数据结构中的元素个数。

空间复杂度:O(1),不需要额外的存储空间。

举个栗子:假设你在一组无序的电话号码列表中寻找一个特定的号码,你只能从头到尾逐个查看,直到找到它,这就是线性搜索的原理。

代码示例

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

2.2 二分搜索(Binary Search)

二分搜索是一种高效的搜索算法,适用于有序数据结构。它通过每次将搜索范围一分为二,不断缩小查找区间,直到找到目标元素或确定目标不存在。

数学意义

  • 二分搜索在数组 A A A 中查找目标值 x x x 的过程如下:
    low = 0 \text{low} = 0 low=0
    high = n − 1 \text{high} = n-1 high=n1
    while low ≤ high do \text{while } \text{low} \leq \text{high} \text{ do} while lowhigh do
    mid = ⌊ low + high 2 ⌋ \quad \text{mid} = \left\lfloor \frac{\text{low} + \text{high}}{2} \right\rfloor mid=2low+high
    if  A [ mid ] = x  then return mid \quad \text{if } A[\text{mid}] = x \text{ then return } \text{mid} if A[mid]=x then return mid
    else if  A [ mid ] < x  then low = mid + 1 \quad \text{else if } A[\text{mid}] < x \text{ then low} = \text{mid} + 1 else if A[mid]<x then low=mid+1
    else high = mid − 1 \quad \text{else high} = \text{mid} - 1 else high=mid1
    最终,如果找到目标值 x x x,返回其索引,否则返回 -1。

时间复杂度:O(log n)。

空间复杂度:O(1),只需常量级的额外空间。

举个栗子:如果你在一本按字母顺序排列的电话簿中查找一个人的名字,你可以从中间开始,根据名字的字母顺序决定向前或向后查找,这就是二分搜索的思想。

代码示例

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

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

深度优先搜索(DFS)是一种用于图或树结构的搜索算法。它从一个节点出发,沿着一条路径深入搜索,直到找到目标或到达叶子节点(无子节点的节点),然后回溯并尝试其他路径。

数学意义

  • DFS的递归过程可以定义为:
    DFS ( v ) = Mark  v  as visited \text{DFS}(v) = \text{Mark } v \text{ as visited} DFS(v)=Mark v as visited
    for each  u  adjacent to  v  do \text{for each } u \text{ adjacent to } v \text{ do} for each u adjacent to v do
    if  u  is not visited then DFS ( u ) \quad \text{if } u \text{ is not visited then } \text{DFS}(u) if u is not visited then DFS(u)

时间复杂度:O(V + E),其中V是节点数,E是边数。

空间复杂度:O(V),由于递归调用栈的深度可能达到节点总数。

举个栗子:假设你在一个迷宫中行走,你总是沿着一个方向走到尽头,然后再回头寻找其他未走过的路径,这就类似于DFS的策略。

代码示例(使用递归):

def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    for next_node in graph[start] - visited:
        dfs(graph, next_node, visited)
    return visited

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

广度优先搜索(BFS)也是一种用于图或树结构的搜索算法。它从一个节点开始,逐层向外扩展搜索,直到找到目标元素。

数学意义

  • BFS的非递归过程通常使用队列实现:
    BFS ( v ) = Initialize queue with  v \text{BFS}(v) = \text{Initialize queue with } v BFS(v)=Initialize queue with v
    while queue is not empty do \text{while queue is not empty do} while queue is not empty do
    u = Dequeue \quad u = \text{Dequeue} u=Dequeue
    for each  w  adjacent to  u  do \quad \text{for each } w \text{ adjacent to } u \text{ do} for each w adjacent to u do
    if  w  is not visited then \quad \quad \text{if } w \text{ is not visited then} if w is not visited then
    Mark  w  as visited and enqueue  w \quad \quad \quad \text{Mark } w \text{ as visited and enqueue } w Mark w as visited and enqueue w

时间复杂度:O(V + E)。

空间复杂度:O(V),用于存储队列和访问标记。

举个栗子:如果你从城市的中心开始,逐步向外扩展

搜索,直到找到某个特定地点,这就类似于BFS的策略。

代码示例(使用队列):

from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    while queue:
        vertex = queue.popleft()
        if vertex not in visited:
            visited.add(vertex)
            queue.extend(graph[vertex] - visited)
    return visited

3. A*算法:启发式搜索的典范

A*算法是一种广泛应用于路径规划的启发式搜索算法。它结合了广度优先搜索和深度优先搜索的优点,通过启发式函数引导搜索过程,以找到从起点到终点的最优路径。

3.1 A*算法的核心思想

A*算法的核心思想是在搜索过程中,同时考虑从起点到当前节点的实际代价 g ( n ) g(n) g(n) 和从当前节点到目标节点的预估代价 h ( n ) h(n) h(n)(即启发式函数)。总代价为:
f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n)
算法每次扩展代价最小的节点,直至找到目标节点。

3.2 启发式函数的选择

启发式函数 h ( n ) h(n) h(n) 的选择对A*算法的效率有着至关重要的影响。一个好的启发式函数应当是可接受的,即不会高估从当前节点到目标节点的实际代价,从而保证A*算法找到的是最优解。

常见的启发式函数

  • 曼哈顿距离(用于网格地图):假设只能水平或垂直移动,启发式函数为:
    h ( n ) = ∣ x goal − x n ∣ + ∣ y goal − y n ∣ h(n) = |x_{\text{goal}} - x_n| + |y_{\text{goal}} - y_n| h(n)=xgoalxn+ygoalyn
  • 欧几里得距离:假设可以任意方向移动,启发式函数为:
    h ( n ) = ( x goal − x n ) 2 + ( y goal − y n ) 2 h(n) = \sqrt{(x_{\text{goal}} - x_n)^2 + (y_{\text{goal}} - y_n)^2} h(n)=(xgoalxn)2+(ygoalyn)2

3.3 A*算法的应用场景

举个栗子:假设你驾驶一辆汽车在城市中导航。A*算法就像GPS导航系统,它不仅考虑你目前的位置(已走过的路),还会根据你距离目的地的直线距离来估算最优路径,从而引导你绕开交通拥堵,以最短时间到达目的地。

  • 路径规划:在机器人导航、游戏AI中寻找从起点到目标的最短路径。
  • 地图搜索:如Google Maps或GPS导航系统中的路径规划。

代码示例

from queue import PriorityQueue

def a_star(graph, start, goal, h):
    open_set = PriorityQueue()
    open_set.put((0, start))
    came_from = {}
    g_score = {node: float('inf') for node in graph}
    g_score[start] = 0
    
    while not open_set.empty():
        current = open_set.get()[1]
        
        if current == goal:
            path = []
            while current in came_from:
                path.append(current)
                current = came_from[current]
            return path[::-1]
        
        for neighbor, cost in graph[current]:
            tentative_g_score = g_score[current] + cost
            if tentative_g_score < g_score[neighbor]:
                came_from[neighbor] = current
                g_score[neighbor] = tentative_g_score
                f_score = tentative_g_score + h(neighbor, goal)
                open_set.put((f_score, neighbor))
    return None

4. 其他经典的搜索算法

除了A*算法,还有其他几种经典的搜索算法在不同场景中有着广泛的应用。

4.1 Dijkstra算法

Dijkstra算法是A*算法的前身,主要用于寻找加权图中从单个起点到所有其他节点的最短路径。它类似于A*,但不使用启发式函数,仅基于实际代价 g ( n ) g(n) g(n) 进行搜索。

数学意义

  • 初始化:将起点的代价设为0,其他节点代价为无穷大,将起点放入优先队列。
  • 循环:
    • 从优先队列中选取代价最小的节点进行扩展。
    • 更新其邻居节点的代价,如果邻居节点的代价减少,将其放入优先队列。
    • 重复以上过程,直到所有节点都被处理。

时间复杂度:O(V^2) 或 O((V + E) \log V)(使用优先队列优化)。

举个栗子:假设你要找到从你家到城市中所有商店的最短路径,你从家出发,计算到达每个商店的最短距离,并不断更新其他商店的最短路径,这就是Dijkstra算法的工作方式。

应用场景:最短路径搜索,如网络路由、城市交通规划。

代码示例

from queue import PriorityQueue

def dijkstra(graph, start):
    queue = PriorityQueue()
    queue.put((0, start))
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    
    while not queue.empty():
        current_distance, current_vertex = queue.get()
        
        if current_distance > distances[current_vertex]:
            continue
        
        for neighbor, weight in graph[current_vertex]:
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                queue.put((distance, neighbor))
    
    return distances

4.2 Bellman-Ford算法

Bellman-Ford算法用于寻找含负权边的图中的最短路径。它通过反复放松边来更新路径的代价。

数学意义

  • 初始化:将起点的代价设为0,其他节点代价为无穷大。
  • 循环 ∣ V ∣ − 1 |V|-1 V1 次(其中 ∣ V ∣ |V| V 是节点数):
    • 对图中的每条边 ( u , v ) (u, v) (u,v) 执行松弛操作:
      if  g ( v ) > g ( u ) + w ( u , v )  then  g ( v ) = g ( u ) + w ( u , v ) \text{if } g(v) > g(u) + w(u, v) \text{ then } g(v) = g(u) + w(u, v) if g(v)>g(u)+w(u,v) then g(v)=g(u)+w(u,v)

时间复杂度:O(VE)。

举个栗子:假设你在城市中寻找最便宜的公交路线,你要不断更新不同路线的花费,直到找到最便宜的方案,这就是Bellman-Ford算法的思路。

应用场景:处理图中可能存在负权边的情况,如金融领域的套利检测。

代码示例

def bellman_ford(graph, start):
    distance = {node: float('inf') for node in graph}
    distance[start] = 0
    
    for _ in range(len(graph) - 1):
        for node in graph:
            for neighbor, weight in graph[node]:
                if distance[node] + weight < distance[neighbor]:
                    distance[neighbor] = distance[node] + weight
    
    # Check for negative-weight cycles
    for node in graph:
        for neighbor, weight in graph[node]:
            if distance[node] + weight < distance[neighbor]:
                return "Graph contains a negative-weight cycle"
    
    return distance

4.3 Floyd-Warshall算法

Floyd-Warshall算法用于计算加权图中所有节点对之间的最短路径。它是动态规划的一种形式。

数学意义

  • 设定初始状态:
    if  i = j  then  d [ i ] [ j ] = 0 \text{if } i = j \text{ then } d[i][j] = 0 if i=j then d[i][j]=0
    else if  ( i , j )  is an edge then  d [ i ] [ j ] = w ( i , j ) \text{else if } (i, j) \text{ is an edge then } d[i][j] = w(i, j) else if (i,j) is an edge then d[i][j]=w(i,j)
    else  d [ i ] [ j ] = ∞ \text{else } d[i][j] = \infty else d[i][j]=
  • 对每个中间节点 k k k 执行更新操作:
    d [ i ] [ j ] = min ⁡ ( d [ i ] [ j ] , d [ i ] [ k ] + d [ k ] [ j ] ) d[i][j] = \min(d[i][j], d[i][k] + d[k][j]) d[i][j]=min(d[i][j],d[i][k]+d[k][j])

时间复杂度:O(V^3)。

举个栗子:假设你要计算城市中任意两个地点之间的最短路径,你可以通过逐一考虑每个中间点来优化路径,这就是Floyd-Warshall算法的工作方式。

应用场景:适用于计算全图的最短路径矩阵,如网络分析、交通网络优化。

代码示例

def floyd_warshall(graph):
    distance = {i: {j: float('inf') for j in graph} for i in graph}
    
    for node in graph:
        distance[node][node] = 0
        for neighbor, weight in graph[node]:
            distance[node][neighbor] = weight
    
    for k in graph:
        for i in graph:
            for j in graph:
                distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j])
    
    return distance


5. 算法比较与选择

在实际应用中,选择合适的搜索算法至关重要。下表对比了不同算法的优缺点及适用场景。

算法时间复杂度空间复杂度优点缺点适用场景
线性搜索O(n)O(1)简单易实现效率低,适用于小规模数据无序数据的小规模查找
二分搜索O(log n)O(1)高效仅适用于有序数据有序数组或列表查找
深度优先搜索O(V + E)O(V)遍历完整图,内存占用少可能陷入死循环或路径过长树或图的深度遍历
广度优先搜索O(V + E)O(V)找到最短路径内存占用大,效率较低树或图的广度遍历
Dijkstra算法O(V^2) 或 O((V + E) \log V)O(V)找到最短路径不能处理负权边图中最短路径搜索
Bellman-Ford算法O(VE)O(V)处理负权边效率较低含负权边的图中最短路径搜索
A*算法O(E)O(V)效率高,找到最优路径启发式函数选择影响效果路径规划,游戏AI
Floyd-Warshall算法O(V^3)O(V^2)计算全图所有节点对的最短路径内存占用大,适用规模有限全图最短路径分析

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

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

相关文章

vulnhub靶机:DC-4

目录 导入靶机 信息收集 发现IP 目录扫描 端口扫描 访问 web 弱口令爆破 反弹shell 获得交互式 shell 提权 使用 hydra 暴力破解 SSH 连接 jim 用户 登录charles账户 使用 teehee 创建 root 用户 导入靶机 点击重试 然后网卡换成 NAT模式&#xff0c;开启靶机 信息…

web前端之实现霓虹灯背景魔术卡、旋转的背景动画、模糊效果、边框、变量、filter

MENU 前言效果图htmlstyle 前言 代码段定义一个名为Magic Card的卡片&#xff0c;并通过一系列CSS属性和动画效果来美化和增强该卡片的视觉效果。 效果图 html <div class"card">Magic Card </div>style 代码 property --rotate {syntax: "<a…

EasyCVR视频汇聚平台:深度解析GB/T 28181协议下的视频资源整合与应用

随着安防技术的快速发展和智慧城市建设的推进&#xff0c;视频监控系统作为公共安全、城市管理、企业运营等领域的重要基础设施&#xff0c;其重要性和应用范围不断扩大。在这一过程中&#xff0c;GB/T 28181作为国家标准中关于视频监控设备通信协议的规范&#xff0c;正逐渐受…

DatawhaleAI夏令营 多模态大模型

任务讲解 此次的任务和一般以模型为中心的任务不同&#xff0c;是以数据为核心的。要求在官方给定的数据集的基础上进行数据清洗和数据合成&#xff0c;生成更为优质的数据集&#xff0c;以提高多模态模型的性能。&#xff08;此次的模型以图文能力为主&#xff09; 我们将会…

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发&#xff0c;帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验&#xff0c;包括动态动作和声音&#xff0c;并测试控制算法或辅助系统等功能。环境越真实&#xff0c;驾驶员的体验就越接近最终车…

[vue] pdf.js / vue-pdf 文件花屏问题

vue-pdf内核也是pdf.js&#xff0c;修改方式一样 在pdf.worker.js中加入几行代码&#xff0c;追加到”precinct.zeroBitPlanesTree zeroBitPlanesTree;“之后。 for (var l 0; l < layerNumber; l) {if (readBits(1) ! 0) {throw new JpxError("Invalid tag tree&qu…

vba代码插入折线图

xqwertyy52152018139hi303533312015 Sub test()Set sht1 ThisWorkbook.Worksheets("示例")x sht1.Range("I1").Lefty sht1.Range("I1").Topw sht1.Range("N15").Width * 15h sht1.Range("N15").Height * 25Set ch1 s…

Progressive Multi-modal Conditional Prompt Tuning

文章汇总 动机 图像的重复消化有助于提高分类精度。ProMPT不是直接进行预测&#xff0c;而是多次重新访问原始图像以检查答案&#xff0c;逐步将预测从粗糙细化到精确。 希望达到的效果如下&#xff1a; 图7:通过迭代进化&#xff0c;ProMPT逐步将CLIP产生的错误结果纠正为正…

el-select远程搜索,查询条件为空,没有搜索到数据时,展示“无数据”

el-select远程搜索&#xff0c;查询条件为空&#xff0c;没有搜索到数据时&#xff0c;展示“无数据” 现状&#xff1a;1、查询条件没有值&#xff0c;远程接口没有数据时&#xff0c;不展示“无数据”&#xff1b; 2、查询条件有值&#xff0c;远程接口没有数据时&#xff0c…

公用事业公司签署大规模电力供应协议

随着人工智能技术的迅猛发展&#xff0c;美国公用事业公司与数据中心运营商之间的电力供应协议数量显著增加&#xff0c;为未来几季度的销售和利润增长奠定了基础。根据高盛今年5月发布的一份报告&#xff0c;到2030年&#xff0c;数据中心的发电量预计将占美国总发电量的8%&am…

autoware中ROS2学习笔记

文章目录 一、学习资料&#xff1a;1.1、说明1.2、Autoware Documentation1.3、Autoware Universe Documentation1.4、总结 二、概述三、ros2--节点组件什么是组件容器组件的实现原理可组合节点--节点组件什么是节点组件为什么需要可组合节点创建可组合节点时构造函数为什么需要…

Android 12系统源码_屏幕设备(一)DisplayManagerService的启动

前言 DisplayManagerService是Android Framework中管理显示屏幕相关的模块&#xff0c;各种Display的连接、配置等&#xff0c;都是通过DMS和来管理控制。 在DMS模块中&#xff0c;对显示屏幕的描述分为物理显示屏(physical display)和逻辑显示屏(logical display)&#xff0c…

您知道有哪些主流的大模型LLM开源项目吗?

随着人工智能技术的飞速发展&#xff0c;大模型LLM&#xff08;Large Language Models&#xff09;已成为自然语言处理领域的一股不可阻挡的潮流。从早期的探索到今天的广泛应用&#xff0c;LLM在理解、生成和处理人类语言方面取得了令人瞩目的成就。本文旨在提供一个全面的视角…

【网络安全】密码重置中毒漏洞解析

未经许可 不得转载。 文章目录 概述重置密码的正常流程如何构造密码重置投毒攻击悬垂标记攻击概述 密码重置投毒是一种技术,攻击者利用该技术操纵易受攻击的网站,使其生成指向其控制域的密码重置链接。此行为可被用来窃取重置任意用户密码所需的秘密令牌,并最终盗取其帐户。…

最新级联文生图技术,StableCascade模型部署

Stable Cascade是 Stability AI 开发的一款先进的文生图&#xff08;Text-to-Image&#xff09;生成模型。 Stable Cascade由三个模型组成&#xff1a;Stage A、Stage B 和 Stage C&#xff0c;它们分别处理图像生成的不同阶段&#xff0c;形成了一个“级联”&#xff08;Casc…

TCP/UDP实现网络通信

TCP实现网络通信 1.服务端 #include<myhead.h>//1服务端定义:端口号\id号 #define SER_PIPR 6666 #define SER_IP "196.168.111.186" //通过ifconfig查看ip int main(int argc, const char *argv[]) {//1创建套接字int sfd socket(AF_INET,SOCK_STREAM,0);…

AI绘画大模型-StableDiffusion最强模型sd3(本地安装方法)

​ 前言/introduction Stable Diffusion 3&#xff08;简称SD3&#xff09;是Stability AI最新推出的文本到图像生成模型。相比前代模型&#xff0c;SD3在生成质量、细节表现以及运行效率上有了显著提升&#xff0c;尤其在细腻的图像渲染和复杂的场景构建方面表现出色。SD3模型…

旅游展示系统2024(代码+论文+ppt)

旅游展示系统2024(代码论文ppt),编号:sp013 代码经过修正,确保可以运行,下载地址在文末 技术栈: springbottvuemysql 展示: 下载地址: https://download.csdn.net/download/hhtt19820919/89642334 备注: 专业承接各种程序java,c,c,python,cuda,AI 运行有问题请私信我,私…

深兰科技创始人陈海波入选“2024先锋科创家?硬科技商业先锋榜”

8月14日&#xff0c;2024先锋科创家系列榜单揭晓&#xff0c;深兰科技创始人、董事长陈海波先生凭借创新精神和商业洞察力成功入选&#xff0c;荣登“2024先锋科创家•硬科技商业先锋榜”。 该榜单评选由财联社《科创板日报》联合上海科学技术情报研究所(ISTIS)共同发起&#x…

ImagePicker插件的用法

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择视频文件"相关的内容&#xff0c;本章回中将介绍如何混合选择图片和视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…