深度优先算法,广度优先算法,hill climbing,贪心搜索,A*算法,启发式搜索算法是什么,比起一般搜索法算法有什么区别
深度优先算法(Depth-First Search, DFS)
深度优先搜索是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,直到所有节点都被访问为止。深度优先搜索是一个递归算法,它利用了后进先出的栈结构,在图的遍历中特别有效。
特点与应用:
内存消耗较小:由于只需存储一条从根节点到当前节点的路径。
找到解后停止:在搜索到解后,可以立即停止,不需要遍历整个图。
可能陷入死循环:在遍历图时,如果不记录已经访问过的节点,可能会陷入无限循环的情况。
不保证最短路径:深度优先搜索不保证找到的路径是最短的。
应用场景:如解决迷宫问题、排列组合问题、拓扑排序、解决连通性问题等。
在栈内完成,先进后出,探索完的节点入栈,当完成这一次的探索重新进入到这个节点时出栈,再次探索另一个节点时再次入栈
广度优先算法(Breadth-First Search, BFS)
广度优先搜索是最简便的图的搜索算法之一,属于盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。它从图的某个顶点V0开始,依次访问V0的各个未被访问过的邻接点,然后从这些邻接点出发,再依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到。这一过程类似于树的按层次遍历。
特点与应用:
找到最短路径:在无权图中,广度优先搜索可以保证找到从源点到目标点的最短路径。
遍历顺序确定:按层次依次访问,各层访问顺序是唯一的。
应用场景:如编写国际跳棋AI、计算最少编辑多少个地方就可将错拼的单词改成正确的单词、根据你的人际关系网络找到关系最近的医生等。
先进先出,访问的节点完全展开访问后出队,以此展开后边的节点,已经访问的节点不再继续访问
Hill Climbing(爬山算法)
爬山算法是一种局部择优的方法,属于启发式搜索算法。它从当前的节点开始,和周围的邻居节点的值进行比较,如果当前节点不是最大的,就用最高的邻居节点来替换当前节点,从而实现向“山峰”的高处攀爬的目的。如此循环直到达到最高点。
特点:
局部最优:容易陷入局部最优解,而非全局最优解。
避免遍历:通过启发选择部分节点,提高搜索效率。
应用场景:适用于对最优解要求不是非常严格,且搜索空间不是很大的情况。
贪心搜索(Greedy Search)
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它不保证会得到最优解,但在某些问题中,贪心算法的解足够接近最优解或者确实是最优解。
特点:
简单直观:通常直接且易于实现。
效率高:在很多情况下,贪心算法的运行时间较短。
无记忆:每次选择都是独立的,不依赖于之前的状态。
不保证最优解:在某些问题中,贪心选择可能导致非最优的全局解。
背包问题
A*算法
A算法是一种启发式搜索算法,它结合了最佳优先搜索和Dijkstra算法的特点。A算法通过维护一个优先队列(通常是最小堆),并根据启发式函数(如g(n) + h(n),其中g(n)是从起点到当前点的实际距离,h(n)是从当前点到目标点的估计距离)来评估节点的优先级。A*算法能够找到从起点到终点的最短路径,并且比纯粹的启发式搜索算法(如爬山算法)更加可靠和高效。
特点:
找到最短路径:在多数情况下,A*算法能够找到从起点到终点的最短路径。
启发式搜索:利用启发式函数来评估节点的优先级,提高搜索效率。
应用场景:如路径规划、游戏AI、图形学中的光照计算等。
启发式搜索算法(Heuristic Search Algorithm) 是一种利用启发性信息来指导搜索过程的算法。这种启发性信息通常是有利于尽快找到问题解的有价值信息,能够显著减少搜索空间的大小,提高搜索效率。
启发式搜索算法的基本特点
启发性信息:启发式搜索算法利用启发性信息来评估搜索过程中每个节点的价值,从而决定搜索的方向和顺序。这种信息可以是节点与目标节点之间的估计距离、代价或其他相关指标。
节点选择:在启发式搜索中,节点的选择不是盲目的,而是基于启发性信息进行的。算法会优先扩展那些看起来更有可能通向目标节点的节点。
效率提升:由于利用了启发性信息,启发式搜索算法能够省略大量无用的搜索路径,从而显著提高搜索效率。
与一般搜索算法的区别
搜索策略:
一般搜索算法(如深度优先搜索、广度优先搜索等)通常采用确定性的搜索策略,即按照固定的规则(如先深后广或先广后深)进行搜索。
启发式搜索算法则采用启发式的搜索策略,即根据启发性信息来指导搜索过程,使搜索更加灵活和高效。
节点评估:
一般搜索算法在搜索过程中通常不对节点进行特别的评估,只是简单地按照搜索策略进行遍历。
启发式搜索算法则会对每个节点进行评估,并根据评估结果来决定节点的扩展顺序和搜索方向。
搜索效率:
一般搜索算法在搜索空间较大时,可能会遇到搜索效率低下的问题,因为它们可能会遍历大量无用的节点。
启发式搜索算法由于利用了启发性信息来指导搜索过程,因此能够显著减少搜索空间的大小,提高搜索效率。
结果质量:
一般搜索算法在找到解时通常无法保证解的质量(如是否最优),因为它们只是按照固定的规则进行搜索。
启发式搜索算法虽然也无法保证总是找到最优解(这取决于启发性信息的准确性和问题的复杂度),但在很多情况下能够找到接近最优的解或高质量的解。
适用性:
一般搜索算法适用于搜索空间较小或问题结构较简单的情况。
启发式搜索算法则更适用于搜索空间较大、问题结构较复杂或需要快速找到高质量解的情况。
综上所述,启发式搜索算法通过利用启发性信息来指导搜索过程,显著提高了搜索效率和质量,是现代优化算法和人工智能领域中的重要工具之一。
相关文章:
深度优先算法,广度优先算法,hill climbing,贪心搜索,A*算法,启发式搜索算法是什么,比起一般搜索法算法有什么区别
深度优先算法(Depth-First Search, DFS) 深度优先搜索是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程…...
《python语言程序设计》2018版第8章第14题金融:信用卡号合法性 利用6.29题
一、之前6.29题我做的代码 这是用数字来进行分辨的 is_txt 4383576018402626 #合法def split_the_data_even(vis_n):current_a1 vis_n // 10000a_t1 vis_n % 10000# print("1th", a_t1)a_t2 current_a1 % 10000# print("2th", a_t2)current_a3 curre…...
QT 基础学习
1> 使用绘制事件完成钟表的绘制 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QDebug> #include <QTime> #include <QTimer> #include <QDateTime> //#include <string> #includ…...
【Gephi】可视化教程
此教程专供欣欣向荣及其舍友使用 文章目录 导入数据上色改变布局设置节点大小统计拓扑结构输出图形保存文件 导入数据 点击【文件】-【导入电子表格】 先选择csv格式的network 直接下一步 点击完成 【图的类型】改为“有向的” 点击确认 会弹出报错,直接clos…...
演化式原型开发-系统架构师(六十五)
1快速迭代式的原型开发能够有效控制成本,()是指开发过程中逐步改进和细化原型直到产生目标系统。 A可视化原型开发 B抛弃式原型开发 C演化式原型开发 D增量式原型开发 解析: 原型开发分为两大类:快速原型开发(抛弃…...
初识爬虫4
1.理解代理ip,正向代理和反向代理 2.代理ip分类,根据匿名度分类:透明,匿名,高匿 3.防止频繁向同一个域名发送请求被封ip,需使用代理ip # -*- coding: utf-8 -*- import requestsurl https://www.baidu.comproxies {…...
Golang | Leetcode Golang题解之第387题字符串中的第一个唯一字符
题目: 题解: type pair struct {ch bytepos int }func firstUniqChar(s string) int {n : len(s)pos : [26]int{}for i : range pos[:] {pos[i] n}q : []pair{}for i : range s {ch : s[i] - aif pos[ch] n {pos[ch] iq append(q, pair{ch, i})} e…...
【CanMV K230 AI视觉】 人体检测
【CanMV K230 AI视觉】 人体检测 人体检测 动态测试效果可以去下面网站自己看。 B站视频链接:已做成合集 抖音链接:已做成合集 人体检测 人体检测是判断摄像头画面中有无出现人体,常用于人体数量检测,人流量监控以及安防监控等。…...
解决浏览器自动将http网址转https
删除浏览器自动使用https的方式 在浏览器地址栏输入:chrome://net-internals/#hsts PS:如果是edge浏览器可输入:edge://net-internals/#hsts 在Delete domain security policies搜索框下,输入要删除的域名,然后点击delete 解决方法&#…...
linux邮件配置
1. 非加密邮件配置 cat <<EOF > smtp.sh #!/bin/bash providerqq account3282941991 passwordzqdtygmmndsgb22i3ee echo "Waiting For A Moment..." rpm -qa sendmail &> /dev/null|| yum install sendmail -y >/dev/null echo " set from$…...
基于springboot+vue乒乓球预约管理系统
基于springbootvuemysql实现的乒乓球预约管理系统(源码数据库部署视频) ### 主要技术 SpringBoot、LayUI、Vue、MySQL ### 系统角色 用户、管理员 ### 系统功能 前台: 首页、乒乓球场、公告信息、留言反馈、个人中心 后台: …...
Linux 基础命令-文件权限与所有权
1. 文件权限概述 在Linux中,每个文件和目录都有与之关联的权限和所有权,来控制谁可以访问、修改或执行文件。文件权限与所有权可以防止未经授权的用户对文件进行访问或修改。 1.1 文件权限的组成 每个文件在Linux系统中都有三种类型的权限:…...
气压测试实验(用IIC)
I2C: 如果没有I2c这类总线,连接方法可能会如下图: 单片机所有的通讯协议,无非是建立在引脚(高低电平的变换高低电平持续的时间)这二者的组合上,i2c 多了一个clock线,负责为数据传输打节拍。 (i2…...
C++ lambda闭包消除类成员变量
原文链接:https://blog.csdn.net/qq_51470638/article/details/142151502 一、背景 在面向对象编程时,常常要添加类成员变量。 然而类成员一旦多了之后,也会带来干扰。 拿到一个类,一看成员变量好几十个,就问你怕不…...
等待唤醒机制和阻塞队列
1. 等待唤醒机制 由于线程的随机调度,可能会出现“线程饿死”的问题:也就是一个线程加锁执行,然后解锁,其他线程抢不到,一直是这个线程在重复操作 void wait() 当前线程等待,直到被其他线程唤醒 void no…...
IO多路复用是如何处理多个客户端同时访问一个数据的
1. 原理概述 IO多路复用通过单个线程或进程监听多个文件描述符的状态变化,当某个文件描述符就绪(例如,有数据可读、可写或发生异常)时,线程或进程会收到通知,并对该文件描述符执行相应的IO操作。这种方式显…...
QT中使用UTF-8编码
在Qt中,确保应用程序使用UTF-8编码是非常重要的,尤其是在处理国际化和多语言文本时。以下是一些确保在Qt应用程序中使用UTF-8编码的方法: ### 1. 设置全局默认编码 在应用程序启动时,可以设置全局默认编码为UTF-8。这可以通过调…...
我对 monorepo 的一些思考
我对 monorepo 的一些思考 我对 monorepo 的一些思考 前言它的由来技术选型 管理工具语言与打包调试工具测试框架代码规范与质量控制本地引用与发包替换发包流程Github 相关配置部署 使用手册 功能特性总结如何使用?清除默认的包(可选)模板包介绍 packagesapps 更新…...
Java学习Day41:骑龙救!(springMVC)
springMVC与sevlet都是对应表现层web的,但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标: 小案例: 1.导入依赖 spring-context: 提供 Spring 框架的核心功能,如依赖注入、事件发布和其他应用上…...
Redis 常用命令总结
文章目录 目录 文章目录 1 . 前置内容 1.1 基本全局命令 KEYS EXISTS 编辑 DEL EXPIRE TTL TYPE 1.2 数据结构和内部编码 2. String类型 SET GET MGET MSET SETNX INCR INCRBY DECR DECYBY INCRBYFLOAT 命令小结 内部编码 3 . Hash 哈希类型 HSET …...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的: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;…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
[特殊字符] Spring Boot底层原理深度解析与高级面试题精析
一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配,通过简化传统Spring应用的初始化和配置流程,显著提升开发效率。其底层原理可拆解为以下核心机制: 自动装配(Auto-Configuration) 核…...
