南开大学软件学院2021年秋季学期研究生算法课程(复习)算法设计思想和状态空间

本文主要是介绍南开大学软件学院2021年秋季学期研究生算法课程(复习)算法设计思想和状态空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可计算性与可计算问题

  • 判定问题Decision problem:判断一个问题的解是否存在
  • 优化问题Optimization problem:找到问题的最优解
    • 组合优化问题
    • 连续优化问题

一个重要的转化:任何优化问题都可以表示为一个判定问题

算法

求解问题的一系列数学或计算机操作(输入➡算法➡输出)

状态与状态空间

状态State:对可计算问题的一种建模

状态转移State transition:问题中不同状态的转化关系

状态空间State space:状态(点)和状态转移(边)构造的图

状态变量State variable:求解问题过程中,对于一系列状态变化的变量建模

价值函数Cost function:用以衡量当前状态的一个状态到值的映射,该值会伴随着状态转移而更新,该值可以是:布尔值,整数,实数等等

翻转开关问题:

有一个4✖4的灯阵,每个灯上均有一个开关,每次拨动开关都会使当前灯和相邻灯的开关状态改变。请设计某种算法,判断给出某种开关图案是否可以通过操作开关使全部灯都打开?

状态压缩State compression,State encoding,Bitmask

  • 利用二进制等,压缩状态表示时的存储空间占用(比如上面这个4✖4矩阵)
  • 利用位运算等技巧,加速状态转移计算时的时间消耗(比如乘法运算变成位运算)
  • 对于上例,只要16个二进制位即可,但是转移会很复杂

状态哈希Hashing

H:X\rightarrow Y\\ where\ x_i\in [0,m),y_i\in [0,n),and\ n<<m

可计算问题的本质

  • 判别问题:判断初始状态目标状态是否可达
  • 优化问题:计算从初始状态转移至目标状态的最优价值

搜索算法

深度优先搜索DFS

  • 应用场景:判断是否存在解对所有可能性计数
  • 实现:递归或栈
  • 主要瓶颈:运行时间和递归额外开销

广度优先搜索BFS

  • 应用场景:计算到达目标状态的最少转移次数
  • 实现:队列
  • 主要瓶颈:内存消耗

搜索算法

埃及分数问题:

古埃及数学的分数表示十分特殊,不允许分子不为1的存在,比如2/3在古埃及数学中只能表示为1/2+1/6。请设计算法,对给定真分数a/b,请计算满足以下条件的埃及分数表示:

  1. 和式中的分数互不相同
  2. 和式中的分数个数最少
  3. 满足条件2的情况下,保留和式中最小分数最大的解。例如,19/45=1/5+1/6+1/18。
  • 如何定义状态?即需被分解位和式的分数\frac{a^{'}}{b^{'}}=\frac{a}{b}-\frac{1}{x}
  • 深度优先搜索?不好使,因为要找最优解
  • 广度优先搜索?不好使,因为宽度时无穷大的

搜索优化:迭代加深搜索Iteratively Deepenning DFS

  • 限定DFS的搜索深度,并逐步增加
  • 即搜索深度也作为状态的一部分(优化与判定间的转换)

八数码问题:

九个格子中放入了数字1到8方块,利用空位移动方块,问使数字恢复顺序所需最少移动次数

  • 如何定义状态?10^10,但这样最精简么?康托展开
    • X=a_n(n-1)!+a_{n-1}(n-2)!+\cdot \cdot \cdot +a_1\times 0!
    • 康托展开使一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。
  • 果断广度优先搜索:9!=3.6✖10^5,最坏情况下内存不够

搜索优化:双向广度优先搜索Bidirectional BFS,Meet-in-the-mid

  • 可以从初始状态和目标状态同时进行广度优先搜索
  • 内存优化(优化比取决于相邻状态数
  • 仅当初始状态和目标状态可以直接确定的情况

更多搜索优化技巧(取决于问题的特殊性质,见招拆招)

  • 启发式搜索:A*,IDA*
  • 最佳优先搜索Best-first search
  • 分支界限法Branch and bound
  • 剪枝Pruning
  • Ad hoc方法

最关键的两个优化思路

  • 用最简单的状态刻画问题,缩减状态空间
  • 想尽办法避开不必要的状态转移
    • ​​​​​​​经典方法:动态规划、分治、贪心

这篇关于南开大学软件学院2021年秋季学期研究生算法课程(复习)算法设计思想和状态空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/269932

相关文章

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用