惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
V
V2EX
量子位
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 【当耐特】
爱范儿
爱范儿
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
小众软件
小众软件
IT之家
IT之家
博客园_首页
博客园 - 聂微东
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗

Nemo

20260819 - Nemo 再见,2025 Complete ORB-SLAM3 Setup Guide for Jetson Xavier NX with RealSense D455 20250723 再见,2024 Using CertBot for Automatic Secure EMQX Broker Create Your Own GPS Data Publisher Support SSL AGV Dispatching System Technical Documentation Finding Nemo No title 香港賽馬會呈獻系列:黑白——攝影敘事 再见,2023 团团是只猫 Design an FSM for Robot State Machines – Basics of Computer Science Data-driven robot lifespan: Collection 数据驱动的机器人寿命:收集、诊断、预测 Exploring the design space of binary search trees 特首来了 Large language models, explained with a minimum of math and jargon 设计有缓存异步逻辑的监控脚本并测试其资源占用 使用loguru记录串口数据并使用Docker搭建ARM开发环境 在vscode的Dev Container中构建.NET开发环境及使用doxygen和graphviz绘制函数调用图 State or Status? 使用KD-Tree快速收敛到最近坐标点/Fast convergence to the nearest coordinate point using KD-Tree 翻译 || 总结 - Go语言中的空结构体(The empty struct) 再见,2022 从PE工作报告中能读出什么 Give me miles, give me truth AMR调度系统性能优化/AMR Dispatch System Performance Optimization
A*算法两种时间复杂度 /A* Algorithm: Two Types of Time Com...
Nemo · 2023-05-09 · via Nemo

在计算机科学中,评估一个算法的性能通常涉及到计算其时间复杂度和空间复杂度。时间复杂度衡量算法完成任务所需的计算步骤数量,而空间复杂度衡量算法执行过程中所需的内存资源,通常使用大O符号(O)来表示。大O符号描述了算法性能随着输入规模增长的增长速率。

A*算法中,它在图形搜索中寻找从起始节点到目标节点的最短路径。这种算法结合了广度优先搜索(BFS)和启发式函数(heuristic function)以提高搜索效率。

对于A*算法的复杂度计算,有两种不同的表示方法:O(b^d)和O(E+VlogV)。这是因为A*算法可以应用于不同类型的问题和数据结构,每种情况下的性能可能有所不同。

O(E+VlogV)

A* 算法基于图搜索,通常会使用优先级队列(例如 Fibonacci 堆)来存储待访问的顶点。优先级队列的插入和删除操作的时间复杂度为 O(log|V|),其中 |V| 是顶点的数量。因此,在算法执行过程中,每次访问一个顶点都需要 O(log|V|) 的时间。在最坏的情况下,可能需要访问所有顶点,因此这部分的时间复杂度为 O(|V|log|V|)。

同时,A* 算法在搜索过程中会遍历顶点的邻接边。在最坏情况下,算法可能需要检查图中的所有边。对于每条边,算法需要将相邻顶点插入优先级队列。虽然这个操作的时间复杂度仍然是 O(log|V|),但总体来说,考虑所有边的情况下,这部分的时间复杂度为 O(|E|log|V|)。然而,在实际应用中,由于启发式函数的引入,算法通常不需要检查所有边。

那么,A 算法的总时间复杂度是顶点访问和边检查两部分的时间复杂度之和。由于 O(|E|log|V|) 通常大于 O(|V|log|V|),可以将两者相加,得到总时间复杂度为 O(|E|+|V|log|V|),空间复杂度为 O(V)。这个公式表示了 A 算法在处理图搜索问题时的最坏情况时间复杂度。

O(b^d)

这种复杂度表示方法通常用于描述树形结构的搜索问题。其中,b 表示树的分支因子(branching factor),即每个节点的子节点数量;d 表示搜索深度。在这种情况下,时间复杂度和空间复杂度都为 O(b^d)。实际上,A*算法在树搜索中的性能取决于启发式函数的质量。好的启发式函数可以显著减少搜索空间和搜索步骤,从而降低复杂度。

为什么有两种不同的表示?

在算法和计算机科学理论社区中,人们喜欢将运行时间视为图中顶点和边数的函数,并且通常考虑最坏情况下的运行时间。在人工智能社区中,人们更倾向于以树的分支因子和目标节点深度来衡量运行时间,因为在这些情况下,图通常是无限或非常大的,并且我们通常尝试避免检查所有的图。因此,在这个社区中,以顶点和边数来计算复杂度不是很有意义。在这种情况下,O(b^d)更有意义,因为它更准确地反映了实际访问的顶点数和边数。

在组合搜索领域中,通常将搜索空间隐式定义,即将其定义为一组状态及其之间的转换,而不是将其明确定义为具体的顶点和边集。在隐式搜索空间中,状态可以表示为顶点,转换可以表示为边。然而,在许多情况下,实际的状态集可能没有有限边界,因此边和顶点的数量并不总是具有有限的基数(无论是实际上还是理论上)。因此,对于许多应用程序,用分支因子b来定义性能比使用顶点和边的基数更有意义。