当前位置: 首页 > news >正文

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

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 ireturn -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) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -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 dequedef 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 PriorityQueuedef 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] = 0while 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] + costif tentative_g_score < g_score[neighbor]:came_from[neighbor] = currentg_score[neighbor] = tentative_g_scoref_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 PriorityQueuedef dijkstra(graph, start):queue = PriorityQueue()queue.put((0, start))distances = {vertex: float('infinity') for vertex in graph}distances[start] = 0while not queue.empty():current_distance, current_vertex = queue.get()if current_distance > distances[current_vertex]:continuefor neighbor, weight in graph[current_vertex]:distance = current_distance + weightif distance < distances[neighbor]:distances[neighbor] = distancequeue.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] = 0for _ 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 cyclesfor 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] = 0for neighbor, weight in graph[node]:distance[node][neighbor] = weightfor 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)计算全图所有节点对的最短路径内存占用大,适用规模有限全图最短路径分析

相关文章:

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

机器学习&深度学习中的搜索算法浅谈 搜索算法是计算机科学中的核心算法&#xff0c;用于在各种数据结构&#xff08;如数组、列表、树、图等&#xff09;中查找特定元素或信息。这些算法不仅在理论上具有重要意义&#xff0c;还在实际应用中扮演着关键角色。本文将详细探讨…...

基于IMX8M_plus+FPGA+AI监护仪解决方案

监护仪是一种以测量和控制病人生理参数&#xff0c;并可与已知设定值进行比较&#xff0c;如果出现超标可发出警报的装置或系统。 &#xff08;1&#xff09;监护仪主要采集测量人体生理参数&#xff0c;心电、血压、血氧、体温等需要采集处理大量的数据&#xff0c;系统需要多…...

仿RabbitMq实现简易消息队列正式篇(路由匹配篇)

TOC 目录 路由匹配模块 代码展示 路由匹配模块 决定了一条消息是否能够发布到指定的队列 在每个队列根交换机的绑定信息中&#xff0c;都有一个binding_key&#xff08;在虚拟机篇有说到&#xff09;这是队列发布的匹配规则 在每条要发布的消息中&#xff0c;都有一个rout…...

一套完整的NVR网络硬盘录像机解决方案和NVR程序源码介绍

随着网络技术的发展&#xff0c;视频数据存储的需求激增&#xff0c;促使硬盘录像机&#xff08;DVR&#xff09;逐渐演变为具备网络功能的网络视频录像机&#xff08;NVR&#xff09;。NVR&#xff0c;即网络视频录像机&#xff0c;负责网络视音频信号的接入、存储、转发、解码…...

2024年人工智能固态硬盘采购容量预计超过45 EB

根据TrendForce发布的最新市场报告&#xff0c;人工智能&#xff08;AI&#xff09;服务器客户在过去两个季度显著增加了对企业级固态硬盘&#xff08;SSD&#xff09;的订单。为了满足AI应用中不断增长的SSD需求&#xff0c;上游供应商正在加速工艺升级&#xff0c;并计划在20…...

Java的反射原理

反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现&#xff0c;它主要用于以下目的&#xff1a; 在运行时分析类的能力&#xff1a;通过反射&#xff0c;可以在运行时检查类的结构&#xff0c;比如它的方法、构造…...

vue.config.js 配置

vue.config.js 文件是 Vue CLI 项目中的全局配置文件&#xff0c;它允许你以 JavaScript 的形式来配置构建选项&#xff0c;而不是通过命令行参数或者 .vue-clirc 的 JSON 格式。 官方文档: https://cli.vuejs.org/zh/config/#全局-cli-配置 基础配置 publicPath 设置构建好的…...

C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例

什么是CPPCMS&#xff1f; CppCMS 是一个高性能的 C Web 开发框架&#xff0c;专为构建快速、动态的网页应用而设计&#xff0c;特别适合高并发和低延迟的场景。其设计理念类似于 Python 的 Django 或 Ruby on Rails&#xff0c;但针对 C 提供了更细粒度的控制和更高效的性能。…...

Taos 常用命令工作笔记(二)

最近测试创建一个涛思的数据库和一堆表进行测试&#xff0c;通过json配置文件配置字段的类型、名称等&#xff0c;程序通过解析json文件的配置&#xff0c;动态创建数据库的表。 其中表字段为驼峰结构的规则命名&#xff0c;创建表也是成功的&#xff0c;插入的测试数据也是成功…...

idea安装二进制文本阅读插件

引言 在软件开发过程中&#xff0c;有时需要查看二进制文件的内容以调试或分析问题。虽然有许多专用工具可以处理这类任务&#xff0c;但直接在 IDE 内集成这些功能无疑更加方便高效。本文将介绍如何在 IntelliJ IDEA 2023中安装和配置一个名为 BinEd的插件&#xff0c;以及如…...

MySQL 常用 SQL 语句大全

1. 基本查询 查询所有记录和字段 SELECT * FROM table_name; 查询特定字段 SELECT column1, column2 FROM table_name; 查询并限制结果 SELECT column1, column2 FROM table_name LIMIT 10; 条件查询 SELECT column1, column2 FROM table_name WHERE condition; 模糊匹…...

[Spring] Spring事务与事务的传播

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

Java 网络编程练习

InternetExercise1 package InternetExercise20240815;public class InternetExercise1 {public static void main(String[] args) {// 网络编程// 在网络通信协议下&#xff0c;不同计算机上面运行的程序&#xff0c;可以实现不同计算机上的数据传输// 网络编程三要素// 1.IP…...

中国科技统计年鉴,数据覆盖1991-2022年多年份

基本信息. 数据名称: 中国科技统计年鉴 数据格式: excel 数据时间: 1991-2022年 数据几何类型: xlsx 数据坐标系: WGS84 数据来源&#xff1a;国家统计局 数据预览&#xff1a; 数据可视化....

大模型的训练过程

大模型的训练是一个复杂的过程&#xff0c;涉及多个步骤和技术。下面我将概述大模型训练的主要流程&#xff0c;包括预训练、微调等关键阶段&#xff0c;并解释一些常见的技术和策略。 1. 数据准备 数据收集&#xff1a;收集大量多样化的数据&#xff0c;包括文本、图像、音频…...

4款ai在线改写工具,帮你轻松一键智能改写文章

在当今数字化内容创作的浪潮中&#xff0c;ai技术的应用为我们带来了极大的便利&#xff0c;尤其是在文章改写方面。以下将为大家详细分享四款出色的ai在线改写工具&#xff0c;从而帮助大家提升创作效率和质量。 ai在线改写工具一&#xff1a;智媒ai伪原创工具 它是一款备受好…...

Maven Mirror - 仓库镜像的介绍和配置

Maven Mirror&#xff08;Maven镜像&#xff09;是Maven构建工具中用于优化依赖下载速度和提高构建效率的一种机制。 在使用 Maven 构建应用程序时&#xff0c;Maven 默认会从 Maven 官方的中央仓库中下载依赖包。但是&#xff0c;在该仓库受到网络限制或访问速度过慢等问题时&…...

DevEcoStudio对Gitee进行变基与合并

当尝试将本地分支的更改推送到远程仓库&#xff0c;但是远程仓库中的该分支已经有了您本地分支中没有的提交时&#xff0c;会出现这个提示。 具体来说&#xff0c;这个提示意味着&#xff1a; 推送被拒绝&#xff1a;不能直接将更改推送到远程仓库&#xff0c;因为远程仓库中…...

2024 NVIDIA Summer Camp Day1:构建RAG多模态AI Agent

下载材料和课件等 课程相关资料下载链接: https://pan.baidu.com/s/15Y-gmsfeYCgKF-M3TJZVgg?pwdfafe 提取码: fafe 1.课件 链接&#xff1a;https://pan.baidu.com/s/15JTy9CqnesXSlPiwwrUmjA?pwd1111 提取码&#xff1a;1111 2.phi3量化大模型 链接&#xff1a;http…...

微服务之间的通信?

微服务之间的通信是微服务架构中的关键部分&#xff0c;它决定了服务之间如何进行数据交换和协同工作。微服务架构通过将大型应用拆分成多个小型、独立的服务&#xff0c;每个服务专注于完成特定的业务功能&#xff0c;从而提高了系统的可伸缩性、可维护性和可靠性。以下是微服…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...

【技巧】dify前端源代码修改第一弹-增加tab页

回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码&#xff0c;在知识库增加一个tab页"HELLO WORLD"&#xff0c;完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...