怎样做一道阿尔法贝塔剪枝的题(图解)

2023-10-24 22:38

本文主要是介绍怎样做一道阿尔法贝塔剪枝的题(图解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前边
  • 现在的时间:2019-06-20
  • 不讨论原理,不说为什么,只讲怎么做这道题.
  • 上学期就是说要考这个,结果没考,这学期又说要考,不知道考不考.记下来,万一再说下学期考呢.

概念与做题依据
概念:MIN层与MAX层
  • 从非叶子节点开始,从下往上,我们依次轮流把每一层称为MIN层MAX层
  • 例如下边这棵树
做题依据
  • 树要从倒数第二层开始处理,且所有的处理都要"从左往右"处理
  • MIN层节点的取值是其子节点中的最小值,如果有子节点被剪了,那么就取剩下的子节点中的最小值.
  • MAX层节点的取值是其子节点中的最大值,如果有子节点被剪了,那么就取剩下的子节点中的最大值.
  • 下边个依据不好表达也不太好理解,我多写几句,现在理解不了等看了后边的例子就能理解了,这条依据也是我们能够剪枝的依据,满足这条依据才可以剪枝.
    • 假设有节点x,根据节点x的某个子节点确定了节点x的取值范围.
    • 节点x也有父节点(包括直接父节点与间接父节点),这些父节点在你确定节点x的值时,可能已经有了取值范围,也可能还没有取值范围.
    • 如果这些父节点已经有取值范围了,那么,如果节点x的聚值范围节点x的父节点(直接或间接)的取值范围没有交集或交集中只有一个元素,则剪掉节点x的其他子节点,其他子节点指的就是节点x的所有子节点中除推出节点x范围的那个节点外的节点.
  • 当所有未被剪掉的节点的值都确定后,剪枝结束,题也就做完了.

例子
所要剪的树
开始做题
  • 因为要从倒数第二层开始处理,且所有的处理都要"从左往右"处理,所以要先处理节点H.
  • 节点H处于MIN层,所以要取子结点的最小值.
  • 因为要从左往右处理所以先看叶子节点3,因为它的值为3所以,当我们看完3时,确定节点H的取值范围为(-∞,3]
  • 这时还不能确节点H的最小值,还需要看它的第二个子节点,第二个子节点的值是17,比3大,也就最终确定节点H的值是3.
  • 且根据节点H的值是3我们可以确定节点D的取值是[3,+∞),因为D位于MAX层,要取最大值,已经知道一个节点是3了,那么最小不可能小于3.
  • 然后处理节点I,根据它左孩子(左边的子结点),可以确定节点I的取值为(-∞,2]
  • 注意,这时已经满足了我们上边说的那个不太好理解的依据. 节点I的取值范围为(-∞,2],这时其父节点节点D已经有了取值范围,范围是[3,+∞),这两个范围没有交集,我们要剪掉节点I叶子节点2之外的其他子节点.
  • 到此,我们便完成了第一次剪枝.
  • 剪枝完成后,可以确定节点I的值是2,此时节点D的所有子节点的值都以确定,继而可以确定节点D的值为3.
  • 节点D的值为3,继而确定节点B的取值范围为(-∞,3]
  • 继续处理节点J节点J的取值为15,根据它的取值可以确定节点E范围为[15,+∞)
  • 此时又满足那一个依据了,(-∞,3][15,+∞)没有交集,剪掉节点E的其他子节点
  • 此时可以确定节点E的值从而确定节点B的值,然后根据节点B的值确定节点A的取值范围.
  • 处理节点L,可以确定节点L的取值范围是(-∞,2]
  • 注意,这时也满足我们上边说的那个条件,只不过这次是间接父节点,节占L的取值范围与其间接父节点节点A的取值范围没有交集,所以要进行剪枝.
  • 剪枝后,可以确定节点L的取值,继而确定节点F的取值范围.
  • 然后处理节点M,只有一个节点可以直接确定M的取值,根据节点M的取值确定进而确定节点F的取值,再根据节点F的取值就可以确定节点C的取值范围.
  • 结点C的取值范围与其父节点节点A的取值范围,有交集,但交集中只有一个元素,满足我们上边所说的条件,进行剪枝.
  • 剪树结束后,便可以确定节点C节点A的值.
  • 至此,所有未被剪枝的节点的值都已确定了,剪枝也完成了,最后的剪枝结果便是上图,去除其他的标注,最后的结果如下图.

这篇关于怎样做一道阿尔法贝塔剪枝的题(图解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

hdu1010 奇偶剪枝

恰好t时间到达 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Arrays;import

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

图解可观测Metrics, tracing, and logging

最近在看Gophercon大会PPT的时候无意中看到了关于Metrics,Tracing和Logging相关的一篇文章,凑巧这些我基本都接触过,也是去年后半年到现在一直在做和研究的东西。从去年的关于Metrics的goappmonitor,到今年在排查问题时脑洞的基于log全链路(Tracing)追踪系统的设计,正好是对这三个话题的实践。这不禁让我对它们的关系进行思考:Metrics和Loggi

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

十四、我们应当怎样做需求分析:子用例与扩展用例

用例模型作为UML中4+1视图中非常重要的一员,非常集中地体现了面向对象的分析与设计思想。用例模型将现实世界中连续的一个一个业务流程,按照场景划分到了一个一个的用例中。由于场景的出现,使得用例中的业务流程存在着高度的内聚性,从而成为了日后各种对象的雏形。同时,在用例分析中,又将那些存在于各个用例中的,相同或相近的业务操作提取出来,形成一个一个的子用例或扩展用例,又体现了面向对象设计中的复用性。现在

十三、我们应当怎样做需求分析:查询报表分析

在我以往的用例分析中,使用这样格式的用例模式,对于大多数业务操作流程来说是得心应手的,但对于有些功能来说总感觉不对劲。感觉不对劲的,就是那些查询、汇总与报表功能。对于这部分功能,需要我们描述的不是什么操作流程,而更重要的是那些数据项、数据来源、报表格式、数据链接,以及使用者、使用频率的说明。而这些,在以往的用例说明格式中统统都没有,怎么办呢?俗话说“东西是死的人是活的”,把我们的用例格式改改吧。

九、我们应当怎样做需求分析:功能角色分析与用例图

在我们进行一系列需求调研工作的同时,我们的需求分析工作也开始启动了。需求调研与需求分析工作应当是相辅相伴共同进行的。每次参加完需求调研回到公司,我们就应当对需求调研的成果进行一次需求分析。当下一次开始进行需求调研时,我们应当首先将上次需求分析的结果与客户进行确认,同时对需求分析中提出的疑问交给客户予以解答。这就是一个需求捕获->需求整理->需求验证->再需求捕获的过程。  但是,当我们经

八、我们应当怎样做需求调研:需求捕获(下)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整